澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站行使调整台获取天气预报

本例子首假使行使由主旨气象台网址()提供的JSON API,其贯彻思路如下:

本次破解练习对象为Interface Inspector。程序运维截图如下。图为软件提醒的登记分界面。

[AngularJS面面观]13.Angular工具库---格外对象创立方法minErr。本类别小说商谈谈Angular框架除了提供scope等基本职能外,还提供了哪些职能。

 


正文为原创作品、源代码为原创代码,如转发/复制,请在网页/代码处鲜明地点标记原来的文章名称、作者及网址,多谢!


开辟工具:VS2017

语言:C#

DotNet版本:.Net FrameWork 4.5及以上

系统:Win10 X64

一、安装Redis服务器

第生机勃勃,从以下网址下载Redis服务器,

https://github.com/MicrosoftArchive/redis/releases

并从以下列表中下载Redis-x64-3.2.100.msi,如下图所示:

澳门新浦京娱乐场网站 1

恐怕从百度网盘进行下载,如下:

https://pan.baidu.com/s/1dFya9ep

说不上,安装Redis-x64-3.2.100.msi,全体点击料定性按键直至安装完毕,如下图所示:

澳门新浦京娱乐场网站 2

安装收尾之后,使用WIN 昂科威弹出“运转”窗体,输入“services.msc”张开系统“服务”窗体,我们得以看看如下的音讯:

澳门新浦京娱乐场网站 3

上述是“Redis服务器”服务,假诺想以此作为服务器,刚烈建议设置服务的起步项目为“自动”(保持暗中认可值就能够)

然后,将C:Program FilesRedis路线参加种类情况变量里面,如下图所示:

澳门新浦京娱乐场网站 4

此番指标是用以今后不再输入文件路径(减弱输入路线端来的不便),如下图所示:

澳门新浦京娱乐场网站 5

二、安装StackExchange.Redis,用于C#与服务器实行人机联作

第风度翩翩,从“程序包微型机调控台”输入以下内容进行安装援用StackExchange.Redis,如下所示:

PM> Install-Package StackExchange.Redis

备注:最新版本分裂意使用.DotNet4.0,这里使用.Net4.5,否则将设置不了。

设置结果如下图所示:

澳门新浦京娱乐场网站 6

辅助,在调整台编写以下代码:

using StackExchange.Redis;
using System;
using System.Threading;

namespace RedisConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            ConnectionMultiplexer cm =  ConnectionMultiplexer.Connect("127.0.0.1:6379");
            IDatabase db = cm.GetDatabase();
            db.StringSet("Info", "Hello World");
            string result = db.StringGet("Info");
            Console.WriteLine(result);

            ISubscriber sc = cm.GetSubscriber();
            string channelStr = "CH1";
            sc.Subscribe(channelStr, (channel, information) => Console.WriteLine($"From {channel}: {information}"));
            sc.Publish(channelStr, "Hello,my name is CNXY");
            Thread.Sleep(100);
            sc.Publish(channelStr, "My website is http://www.cnc6.cn");
            Console.ReadKey();

        }
    }
}

其出口结果如下:

澳门新浦京娱乐场网站 7

下一场,大家相通能够选择Redis-cli来查看刚才建构的新闻,如下所示:

澳门新浦京娱乐场网站 8

三、如何加密连接

首先,打开"C:Program FilesRedisredis.windows.conf",将中间的“# requirepass foobared”改成“#requirepass 你的密码”就能够,此处改正为“requirepass 123”,改过后必得重启服务,如下图所示:

澳门新浦京娱乐场网站 9

其次,在C#源代码里将 ConnectionMultiplexer.Connect("127.0.0.1:6379"卡塔尔改成 ConnectionMultiplexer.Connect("127.0.0.1:6379,password=123"卡塔尔国就可以。

接下来,我们看看是或不是被密码爱惜了,具体如下图所示:

澳门新浦京娱乐场网站 10

从上海体育场地能够观察,该连接已经被爱慕了!

四、怎样选取远程访谈

首先,打开"C:Program FilesRedisredis.windows.conf",将内部的“bind 127.0.0.1”改成“#bind 127.0.0.1”就可以,改善后必得重启服务,如下图所示:

澳门新浦京娱乐场网站 11

然后,使用此外IP地址(如192.168.94.250)进行操作,如下图所示:

澳门新浦京娱乐场网站 12

能够从上海教室看出,使用192.168.94.250那么些IP地址能够正常举办操作。

同样,需要将C#代码里对应的IP地址从127.0.0.1改成192.168.94.250,如下代码所示:

//ConnectionMultiplexer cm = ConnectionMultiplexer.Connect("127.0.0.1:6379,password=123");
ConnectionMultiplexer cm =  ConnectionMultiplexer.Connect("192.168.94.250:6379,password=123");

 


其余对哈希表、列表、集结及有序集中等的操作,请自行百度,多谢!

1、访谈获得省份(包蕴直辖市、自治区等,以下简单称谓省份)的网站(),重返对应的省份称号(name)、代码(code)等,如下图所示:

澳门新浦京娱乐场网站 13

作为Angular工具库那大器晚成多样文章的开篇,首先来看看但凡程序都绕不开的一个话题

澳门新浦京娱乐场网站 14

Snip20171105_5.png

  • 异常。
    那么Angular在特别管理地点又提供了怎么着工具呢?

2、依照以上重临的代码(code),将代码拼接在网站( AGD (湖南省),则拼接后的网站为,以此博得对应的都会称号(city)、代码(code),如下图所示:

也可以有其余的暴力破解艺术,相对轻便,我从挂号自个儿出手,尝试完美破解。

引子 - scope中是如何抛出极度的?

先是,让大家看看在概念$rootScope的历程中,哪些代码和足够有关:

// 定义异常对象
function $RootScopeProvider() {
  var $rootScopeMinErr = minErr('$rootScope');
  // ......
}

// 下面是抛出异常的2个场景
// 1. 当Digest Cycle正在进行,不要重复启动DC
function beginPhase(phase) {
  if ($rootScope.$$phase) {
    throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);
  }

  $rootScope.$$phase = phase;
}

// 2. 当DC的次数超过阈值(TTL默认值为10)时,抛出我们耳熟能详的infdig异常
if ((dirty || asyncQueue.length) && !(ttl--)) {
  clearPhase();
  throw $rootScopeMinErr('infdig',
      '{0} $digest() iterations reached. Aborting!n'  
      'Watchers fired in the last 5 iterations: {1}',
      TTL, watchLog);
}

上面看看在真真实情状形下,抛出的那个在调节新北是何等样子的。这里须要专一的是,当援引的angular是因而压缩管理后的angular.min.js时,产生的输出和引用未经压缩管理的angular.js时是分化的。(那或多或少也让自己在对待源码和实际出口的时候有一点点惊叹,发掘多数源码中的输出在顾名思义的浏览器调控台情形下不见了。后来才开采经过压缩的源代码会将一些输出省略卡塔尔国

// 引用angular.min.js
angular.min.js:117Error: [$rootScope:infdig] https://errors.angularjs.org/1.5.7/$rootScope/infdig?p0=10&p1=[[{"ms…urn scope.b; }","newVal":13,"oldVal":12}]]
    at Error (native)
    at https://localhost:10001/angular.min.js:6:412
    at m.$digest (https://localhost:10001/angular.min.js:143:281)
    at m.$apply (https://localhost:10001/angular.min.js:145:401)
    // ......

// 引用angular.js
angular.js:13708 Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: [[{"msg":"fn: function (scope) { return scope.a; }","newVal":7,"oldVal":6},{"msg":"fn: function (scope) { return scope.b; }","newVal":9,"oldVal":8}],[{"msg":"fn: function (scope) { return scope.a; }","newVal":8,"oldVal":7},{"msg":"fn: function (scope) { return scope.b; }","newVal":10,"oldVal":9}],[{"msg":"fn: function (scope) { return scope.a; }","newVal":9,"oldVal":8},{"msg":"fn: function (scope) { return scope.b; }","newVal":11,"oldVal":10}],[{"msg":"fn: function (scope) { return scope.a; }","newVal":10,"oldVal":9},{"msg":"fn: function (scope) { return scope.b; }","newVal":12,"oldVal":11}],[{"msg":"fn: function (scope) { return scope.a; }","newVal":11,"oldVal":10},{"msg":"fn: function (scope) { return scope.b; }","newVal":13,"oldVal":12}]]
https://errors.angularjs.org/1.5.7/$rootScope/infdig?p0=10&p1=[[{"ms…urn scope.b; }","newVal":13,"oldVal":12}]]
    at angular.js:68
    at Scope.$digest (angular.js:17324)
    at Scope.$apply (angular.js:17552)
    // ......

看得出当使用angular.js时,至极的申明(也正是上述调用$rootScopeMinErr时传入的第三个参数卡塔尔(英语:State of Qatar)也会被打字与印刷出来。因而,提出在读书angular的时候利用未经压缩的angular.js。里面会保留你在源代码中见到的享有出口。

打听了minErr的使用情状,上边看看它是何等定义与实现的。

 澳门新浦京娱乐场网站 15

0x1 代码深入分析

在Hopper中张开后,开掘Interface Inspector使用了CocoaFob库来做登记认证。如下图。

澳门新浦京娱乐场网站 16

Snip20171105_10.png

和AquaticPrimeFramework雷同,CocoaFob使用非对称的DSA算法,使用私钥Private key加密注册名称,能够收获注册码。程序里用对应公钥Public key对输入的注册名和注册码进行解密验证。DSA算法相近RubiconSA,具有非对称性,无Private key和Public key对,不可能推算出注册码。所以安全性比日常的key-gen要高。然则CocoaFob库是开源框架,能够找到它的源代码。这为康健破解提供了只怕。

minErr方法

3、依据上述再次回到的代码,将代码拼接在网址( 59287 (台北),则拼接后的网站为,以此博得对应的气象音讯,如下图所示:

0x2破解

和破解AquaticPrimeFramework的思绪豆蔻梢头致,用开源框架生成自制的DSA公钥、私钥,然后,替换掉程序中的DSA公钥。

首先看Interface Inspector中的DSA公钥。从[SMLicenseManager verifyLicenseWithName:code:]情势找到了拼接的DSA公钥。伪代码如下。

char  [SMLicenseManager verifyLicenseWithName:code:](void * self, void * _cmd, void * arg2, void * arg3) {
    r14 = [arg2 retain];
    var_-72 = [arg3 retain];
    rax = [NSBundle mainBundle];
    rax = [rax retain];
    var_-88 = rax;
    var_-96 = [[rax objectForInfoDictionaryKey:*_kCFBundleNameKey] retain];
    var_-76 = 0x0;
    rbx = [NSString stringWithFormat:@"%@,%@", rcx, r14];
    [r14 release];
    var_-64 = [rbx retain];
    r13 = [[NSMutableString string] retain];
    [r13 appendString:@"MIHwMIGoBgcqhkjOOAQBMIGcAkEA6DD7O2EnyLOV"];
    [r13 appendString:@"INxN5Cb p2VxYAdK69ekt"];
    [r13 appendString:@"RUlnn/QrCFjWB9k71OBZTXNHDsqbS"];
    [r13 appendString:@"CXmQrRmc OxghdlsEJ0Wbe/XQIVAJya"];
    [r13 appendString:@"CiqLcY74nRq1hRd"];
    [r13 appendString:@"33dSgqa33vA"];
    [r13 appendString:@"kAQSXj7klZuZg6edUcAPyqJtpympByQmSB"];
    [r13 appendString:@"4of1KUEzkARHTnpFicnFhzpG1"];
    [r13 appendString:@"HP4B "];
    [r13 appendString:@"UwIbh/JOwTjwElTrKi0tzwu/A0MAA"];
    [r13 appendString:@"kAVeQplzB7Ovygl8ntnnUcF Rh260G"];
    [r13 appendString:@"gbDWL5xZgPXPf39kHq"];
    [r13 appendString:@"Twk1rbUFVIWUGdWo0FaBbuM7rnDal0jqT8aqnZ"];
    [r13 appendString:@"skmn"];
    rbx = [[NSString stringWithString:r13] retain];
    r14 = [[CFobLicVerifier completePublicKeyPEM:rbx] retain];
    var_-104 = r14;
    [rbx release];
    r15 = [[CFobLicVerifier alloc] init];
    rcx = 0x0;
    rbx = [r15 setPublicKey:r14 error:rcx];
    r12 = [0x0 retain];
    if (rbx != 0x0) {
            var_-64 = var_-64;
            rbx = [r15 verifyRegCode:var_-72 forName:rcx error:r12];
            r14 = [r12 retain];
            [r12 release];
            var_-76 = rbx != 0x0 ? 0x1 : 0x0;
            r12 = r14;
    }
    [r12 release];
    [r15 release];
    [var_-104 release];
    [r13 release];
    [var_-64 release];
    [var_-96 release];
    [var_-88 release];
    [var_-72 release];
    rax = var_-76 & 0xff;
    return rax;
}

用Hex Fiend张开Interface Inspector,能够找到MIHwMIGoBgcqhkjOOAQBMIGcAkEA6DD7O2EnyLOV初步的字符串,那便是公钥在代码中之处。使用自制的公钥,直接在相应地方交流掉此字符串。如下图所示。

替换前:

澳门新浦京娱乐场网站 17

Snip20171102_5.png

替换后:

澳门新浦京娱乐场网站 18

Snip20171105_6.png

然后,使用Hopper修改[SMLicenseManager verifyLicenseWithName:code:]和概念DSA公钥的数据段(见下图),导入自制的DSA公钥。

澳门新浦京娱乐场网站 19

Snip20171105_8.png

改善后,verifyLicenseWithName:code的伪代码如下。

char  [SMLicenseManager verifyLicenseWithName:code:](void * self, void * _cmd, void * arg2, void * arg3) {
    r14 = [arg2 retain];
    var_48 = [arg3 retain];
    rax = [NSBundle mainBundle];
    rax = [rax retain];
    var_58 = rax;
    var_60 = [[rax objectForInfoDictionaryKey:*_kCFBundleNameKey] retain];
    var_4C = 0x0;
    rbx = [NSString stringWithFormat:@"%@,%@", rcx, r14];
    [r14 release];
    var_40 = [rbx retain];
    r13 = [[NSMutableString string] retain];
    [r13 appendString:@"MIHxMIGoBgcqhkjOOAQBMIGcAkEAlkHhqwIttlbDZEK6mOY7s7EBjI/GFhhT/F7mn4eA4vVefuIsdTmA5gBplebQ02k8JMPWaP0mV8hCDzcdIHMqrSwIVAPdSrKvB8U59n 7I0X0wfm74v0WTzAkBwKLW3thX3IOPo4vjghDX/nHtJG3VXSmCTC7mFpv2nhXuznblSbboRAlMa/j0kl4vURsuVXlgvvWpCpgA0SSf0TA0QAAkEAh5RNl7/OdeCse…"];
    rbx = [[NSString stringWithString:r13] retain];
    r14 = [[CFobLicVerifier completePublicKeyPEM:rbx] retain];
    var_68 = r14;
    [rbx release];
    r15 = [[CFobLicVerifier alloc] init];
    rcx = 0x0;
    rbx = [r15 setPublicKey:r14 error:rcx];
    r12 = [0x0 retain];
    if (rbx != 0x0) {
            var_40 = var_40;
            rbx = [r15 verifyRegCode:var_48 forName:rcx error:r12];
            r14 = [r12 retain];
            [r12 release];
            var_4C = rbx != 0x0 ? 0x1 : 0x0;
            r12 = r14;
    }
    [r12 release];
    [r15 release];
    [var_68 release];
    [r13 release];
    [var_40 release];
    [var_60 release];
    [var_58 release];
    [var_48 release];
    rax = var_4C & 0xff;
    return rax;
}

1. 相当音信的咬合

先是依然从文档来直观地心得一下:

/**
 *
 * 该对象用于在Angular内部输出详尽的错误信息。可以按下面的方法进行调用:
 *
 * var exampleMinErr = minErr('example');
 * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
 * ......
 */
function minErr(module, ErrorConstructor){
  // ......
}

minErr方法自个儿是接收多少个参数的。第三个参数用来定义二个模块名称,例如上述的example就能够作为是七个模块的名号。它的效应是为某类相当提供叁个命名空间。第三个参数是多个大概供给的自定义Error布局函数。当暗中认可的JavaScript Error类型无法满意供给时,就足以流传一个两次三番自Error类型的自定义类型作为不当类型。

而minErr方法的回到也很风趣,再次回到的是三个函数。该函数未有定义参数列表,但是对于参数出现的次第有它本人的正经八百:
1. 率先个参数表示五个code,该code和上边的模块名称举行拼接后收获某些错误的切实可行字符串表示,举个例子上述例子中的example.one。
2. 次之个参数是贰个音信模版,它会在行使未经压缩的angular.js时体现在抛出的十分消息中。借使使用压缩的angular.min.js则不显得。

  1. 其四个参数及后续参数用于替换消息模版中的占位符:throw exampleMinErr('one', 'This {0} is {1}', foo, bar卡塔尔(英语:State of Qatar),此中的{0}和{1}会被分别替换来foo和bar。

该函数的回到:

function minErr(module, ErrorConstructor) {
  ErrorConstructor = ErrorConstructor || Error;
  return function() {
    // message构建过程
    return new ErrorConstructor(message);
  };
}

澳门新浦京娱乐场网站,有鉴于此该函数主要的职能正是布局用于创设错误对象的message,它的构建进程如下:

return function() {
  var SKIP_INDEXES = 2;

  var templateArgs = arguments,
    code = templateArgs[0],
    message = '['   (module ? module   ':' : '')   code   '] ',
    template = templateArgs[1],
    paramPrefix, i;

  message  = template.replace(/{d }/g, function(match) {
    var index =  match.slice(1, -1),
      shiftedIndex = index   SKIP_INDEXES;

    if (shiftedIndex < templateArgs.length) {
      return toDebugString(templateArgs[shiftedIndex]);
    }

    return match;
  });

  message  = 'nhttps://errors.angularjs.org/"NG_VERSION_FULL"/'  
    (module ? module   '/' : '')   code;

  for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i  , paramPrefix = '&') {
    message  = paramPrefix   'p'   (i - SKIP_INDEXES)   '='  
      encodeURIComponent(toDebugString(templateArgs[i]));
  }

  return new ErrorConstructor(message);
};
});

message  = 'nhttps://errors.angularjs.org/"NG_VERSION_FULL"/'  
  (module ? module   '/' : '')   code;

for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i  , paramPrefix = '&') {
  message  = paramPrefix   'p'   (i - SKIP_INDEXES)   '='  
    encodeURIComponent(toDebugString(templateArgs[i]));
}

代码比较长,不过逻辑主线特别明晰。完全围绕着message的创设:

  1. 老大代码。由module以至code组成:'[' (module ? module ':' : '') code '] '
    2. 因而消息模版生成分外描述。这风华正茂部分是或不是出示依据引用的angular.js是还是不是压缩来支配。
    3. 生成那些仿效链接。点击链接后会踏向到angular的官方网址,会给一些关于充裕的解说。生成链接的经过中会拼接上调用参数。

 澳门新浦京娱乐场网站 20

0x3 程序验证

设输入的称号为XIao,用CocoaFob算出的注册码为:GAWAE-FD7CP-6M96F-YCNHW-EV9WN-VHEPV-ZDKGN-3KDAC-CQNMV-GGACQ-KEvoque5UM-TucsonYD25-JYLANDLN-6BNH3-K27Y。代入破解完的Interface Inspector。验证成功,:)!

澳门新浦京娱乐场网站 21

澳门新浦京娱乐场网站行使调整台获取天气预报,怎样康健破解CocoaFob。Snip20171105_4.png

澳门新浦京娱乐场网站行使调整台获取天气预报,怎样康健破解CocoaFob。2. 精简音信模板的落到实处

下面塑造message的首先步和第三步都很清楚,重视来看看第二步是怎么落到实处的,相关代码如下:

message  = template.replace(/{d }/g, function(match) {
  var index =  match.slice(1, -1),
    shiftedIndex = index   SKIP_INDEXES;

  if (shiftedIndex < templateArgs.length) {
    return toDebugString(templateArgs[shiftedIndex]);
  }

  return match;
});

此间运用到了replace方法的第贰个参数-选择三个function表示各样match的更迭逻辑,这种用法并非很广阔。常常大家会向来行使一个字符串作为第二个参数,来代表替换字符串。相关的文书档案能够参谋这里

就拿这一个例子而言:
'This {0} is {1}', foo, bar

replace第二个function参数被调用时,传入的match实际上是’{0}’和’{1}’。那么通过slice(1, -1卡塔尔国得到的index就分别为0和1。紧接着通过index来博取arguments参数类数组中对应的参数,调用toDebugString实行轮流。关于toDebugString的落到实处:

function toDebugString(obj) {
  if (typeof obj === 'function') {
    return obj.toString().replace(/ {[sS]*$/, '');
  } else if (isUndefined(obj)) {
    return 'undefined';
  } else if (typeof obj !== 'string') {
    return serializeObject(obj);
  }
  return obj;
}

如上,就是message的构建进程。当中落到实处了三个粗略的模板替换算法。当须求在接纳中得以完结相仿逻辑,又不期待为如此一点功力援用一些第三方库举个例子mustache,那么无妨构思一下上述措施。别的值得生龙活虎提的是,如若您的采取中后生可畏度引用了诸如underscore或然lodash那样的库,那一个库也提供了模版替换的不二秘技,以lodash中的template方法为例:

// Use the "interpolate" delimiter to create a compiled template.
var compiled = _.template('hello <%= user %>!');
compiled({ 'user': 'fred' });
// → 'hello fred!'

// Use the HTML "escape" delimiter to escape data property values.
var compiled = _.template('<%- value %>');
compiled({ 'value': '<script>' });
// → '<script>'

而外,lodash的template方法还提供了更加多的轮番方法,实际情况能够参照下边包车型地铁链接。

4、本例子使用的手艺为 HttpWebRequest类、HttpWebResponse类及Newtonsoft.Json.JsonConvert类的应用,本身有不懂的,请自行实行百度;

结语

上述正是angular中用来封装非常的秘技,通过minErr首先创设多个某部特定模块下的可怜制造方法。然后传入具体的错误代码(code卡塔尔,音讯模版(template卡塔尔(قطر‎以致实际参数来成功至极对象的始建。

一旦你想在你的利用中接受minErr来达成卓殊的概念,能够因而angular.$$minErr来赢得该函数。但是从命名后面包车型大巴七个$符号能够清楚,angular并不慰勉在angular框架之外来行使它。因为随着版本的改观,作为内部贯彻的minErr函数也恐怕会爆发变化。假使应用程序代码直接重视于它的话,在晋级angular版本的时候只怕会现出有的主题素材(决意于minErr的落到实处和利用办法是不是发生了变通卡塔尔(英语:State of Qatar)。

于是摆在大家方今有多个选取:
1. 概念归于应用程序自个儿的minErr。经过上述的商讨,能够开掘它的得以完成原理也不行的简约清晰,由此在中山大学型应用中依据需求对minErr进行效仿和定制,创立二个应用程序版的minErr,以此来将稳步繁杂的杰出类型组织地井井有序也是朝气蓬勃种非常准确的抉择。
2. 照旧使用angular.$$minErr。对于中Mini的利用是不错的接收,因为那类应用极其类别不会过多,使用angular框架提供的效益足矣。并且有了对minErr原理性的询问,只要以往的本子中不爆发哪些主要的改观,晋级到新的本子是绝非怎么困难的。

</script>

5、源代码如下:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;

namespace Weather
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpWebRequest request = WebRequest.CreateHttp(@"http://www.nmc.gov.cn/f/rest/province");
            try
            {
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                Stream stream = response.GetResponseStream();
                StreamReader reader = new StreamReader(stream);
                string content = reader.ReadToEnd();
                List<Province> provinceResult = JsonConvert.DeserializeObject<List<Province>>(content);
                Dictionary<string, string> proviceNamedict = new Dictionary<string, string>();
                Console.WriteLine("省及直辖市:");
                provinceResult.ForEach(x =>
                {
                    proviceNamedict.Add(x.name, x.code);
                    Console.WriteLine(x.name);
                });
                string provice;
                while (true)
                {
                    Console.Write("请输入需要查询的省或直辖市:");
                    provice = Console.ReadLine();
                    if (proviceNamedict.Keys.Contains(provice)) break;
                }
                Console.Clear();
                request = WebRequest.CreateHttp($"http://www.nmc.gov.cn/f/rest/province/{proviceNamedict[provice]}");
                response = request.GetResponse() as HttpWebResponse;
                stream = response.GetResponseStream();
                reader = new StreamReader(stream);
                content = reader.ReadToEnd();
                List<City> cityResult = JsonConvert.DeserializeObject<List<City>>(content);
                Dictionary<string, string> cityNamedict = new Dictionary<string, string>();
                Console.WriteLine("城市:");
                cityResult.ForEach(x =>
                {
                    cityNamedict.Add(x.city, x.code);
                    Console.WriteLine(x.city);
                });
                string city;
                while (true)
                {
                    Console.Write("请输入需要查询的城市:");
                    city = Console.ReadLine();
                    if (cityNamedict.Keys.Contains(city)) break;
                }
                request = WebRequest.CreateHttp($"http://www.nmc.gov.cn/f/rest/real/{cityNamedict[city]}");
                response = request.GetResponse() as HttpWebResponse;
                stream = response.GetResponseStream();
                reader = new StreamReader(stream);
                content = reader.ReadToEnd();
                Detail detailResult = JsonConvert.DeserializeObject<Detail>(content);
                Console.WriteLine(new string('-', 50));
                Console.WriteLine("详细情况如下:");
                Console.WriteLine($"{detailResult.station.province},{detailResult.station.city} 发布时间:{detailResult.publish_time}");
                Console.WriteLine($"温度:{detailResult.weather.temperature}℃ 温差:{detailResult.weather.temperatureDiff}℃ 气压:{detailResult.weather.airpressure}hPa 湿度:{detailResult.weather.humidity}% 雨量:{detailResult.weather.rain}mm");
                Console.WriteLine($"天气状况:{detailResult.weather.info}");
                Console.WriteLine($"风向:{detailResult.wind.direct} {detailResult.wind.power} 风速:{detailResult.wind.speed}m/s");
                Console.WriteLine(new string('-', 50));
            }
            catch(WebException ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.WriteLine("按任何键退出...");
            Console.ReadKey();
        }
    }

    class Province
    {
        public string code { set; get; }
        public string name { set; get; }
        public string url { set; get; }
    }

    class City
    {
        public string url { set; get; }
        public string code { set; get; }
        public string city { set; get; }
        public string province { set; get; }
    }

    class Detail
    {
        public City station { set; get; }
        public string publish_time { set; get; }
        public Weather weather { set; get; }
        public Wind wind { set; get; }
        public Warn warn { set; get; }
    }

    class Weather
    {
        public float temperature { set; get; }
        public float temperatureDiff { set; get; }
        public float airpressure { set; get; }
        public float humidity { set; get; }
        public float rain { set; get; }
        public float rcomfort { set; get; }
        public float icomfort { set; get; }
        public string info { set; get; }
        public string img { set; get; }
        public float feelst { set; get; }
    }

    class Wind
    {
        public string direct { set; get; }
        public string power { set; get; }
        public float speed { set; get; }
    }
    class Warn
    {
        public string alert { set; get; }
        public string pic { set; get; }
        public string province { set; get; }
        public string city { set; get; }
        public string url { set; get; }
        public string issuecontent { set; get; }
        public string fmeans { set; get; }
    }
}

6、运营效果如下:

澳门新浦京娱乐场网站 22

7、源代码与可实行应用程序如下:

源代码:https://pan.baidu.com/s/1pM98VnP

可执行应用程序:https://pan.baidu.com/s/1i6mK8xn

 

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站行使调整台获取天气预报