点击上方蓝字关注“汪宇杰博客”

导语

最近因为疫情被关在家里,做了个无聊成就:我们将在树莓派上用 PowerShell 调用 Azure 上的一个 .NET Core 写的 API 来获取疫情数据。

疫情数据API

疫情数据来源于腾讯新闻的一个实时更新的页面,原始 API 地址为:

https://view.inews.qq.com/g2/getOnsInfo?name=wuwei_ww_cn_day_counts"

然而我们没有办法直接使用,因为它的返回居然不是规范的 JSON:

因此,我只能自己 996 一下,用 .NET Core 包装了腾讯的 API,做了规范化的输出,最终结果为:

我们只需要将腾讯 API 中的 data 字符串取出,反序列化为强类型 model 即可。

public class InfectionData

{

public DateTime Date { get; set; }

public int Confirm { get; set; }

public int Suspect { get; set; }

public int Dead { get; set; }

public int Heal { get; set; }

}

由于 System.Text.Json 福报非常多,我依旧使用老牌 Json.NET 搞定数据转换:

var data = await _httpClient.GetStringAsync(_settings.Value.DataSource);

var apiRes = JsonConvert.DeserializeObject<CoronavirusApiResponse>(data);

var infectionData = JsonConvert.DeserializeObject<IEnumerable<InfectionData>>(apiRes.Data);

代码地址:https://github.com/EdiWang/DotNet-Samples/tree/master/CoronavirusReport

其中用到的知识点为 HttpClient + Polly,这是 .NET Core 调用 REST API 最安全可靠的实践。

简单来说,就是为了调一个API,你得针对这个API建一个接口、一个实现,把 HttpClient 类型通过 services.AddHttpClient 加入 DI 传进来使用,最后利用 Polly 配置出错自动重试等异常处理。

public interface ICoronavirusApiClient

{

Task<IEnumerable<InfectionData>> GetInfectionDataAsync();

}

public class CoronavirusApiClient : ICoronavirusApiClient

{

private readonly HttpClient _httpClient;

private readonly ILogger<CoronavirusApiClient> _logger;

private readonly IOptions<AppSettings> _settings;

public CoronavirusApiClient(

HttpClient httpClient,

ILogger<CoronavirusApiClient> logger,

IOptions<AppSettings> settings)

{

_logger = logger;

_settings = settings;

_httpClient = httpClient;

}

public async Task<IEnumerable<InfectionData>> GetInfectionDataAsync()

{

var data = await _httpClient.GetStringAsync(_settings.Value.DataSource);

var apiRes = JsonConvert.DeserializeObject<CoronavirusApiResponse>(data);

var infectionData = JsonConvert.DeserializeObject<IEnumerable<InfectionData>>(apiRes.Data);

var infectionDataArray = infectionData as InfectionData[] ?? infectionData.ToArray();

_logger.LogInformation($"Got {infectionDataArray.Length} records from '{_settings.Value.DataSource}'");

return infectionDataArray;

}

}

services.AddHttpClient<ICoronavirusApiClient, CoronavirusApiClient>()

.AddTransientHttpErrorPolicy(builder =>

builder.WaitAndRetryAsync(3, retryCount =>

TimeSpan.FromSeconds(Math.Pow(2, retryCount)),

(result, span, retryCount, context) =>

{

_logger?.LogWarning($"Request failed with {result.Result.StatusCode}. Waiting {span} before next retry. Retry attempt {retryCount}/3.");

}));

至于为什么不能简单粗暴 new 一个 HttpClient 直接调API,推荐观看另一名 MVP Steve Gordon 的视频《Let's Talk HTTP in .NET Core》:https://www.youtube.com/watch?v=ojDxK_-I-To   (咦,这是什么不存在的网站)

最后,我把处理好格式的的疫情 API 部署到了Azure国际版的 App Service 上。

https://covid19cn.azurewebsites.net/infectiondata

Linux居然有PowerShell?

由于 Windows 10 早已是一盘咖喱拌饭,导致在树莓派上最好用的系统只能是 Linux,而我这种微软系程序员显然不熟悉 bash,如果能用上 PowerShell 那就太好了!随着微软的开源、开放(Linux First, Windows Last)的态度,PowerShell 其实也和 .NET 一样,已经能够跨平台运行。

以树莓派官方系统 Raspbian 为例,安装 PowerShell 的方式如下:

sudo apt-get install libunwind8

wget https://github.com/PowerShell/PowerShell/releases/download/v7.0.0-rc.3/powershell-7.0.0-rc.3-linux-arm32.tar.gz

mkdir ~/powershell
tar -xvf ./powershell-7.0.0-rc.3-linux-arm32.tar.gz -C ~/powershell
sudo ln -s ~/powershell/pwsh /usr/bin/pwsh
sudo ln -s ~/powershell/pwsh /usr/local/bin/powershell
powershell

PowerShell 的最新发布可以关注官方 GitHub:https://github.com/PowerShell/PowerShell/releases

参考:https://www.hanselman.com/blog/InstallingPowerShellCoreOnARaspberryPiPoweredByNETCore.aspx

另外,如果你和我一样用树莓派4,那么 Ubuntu 19.10.1 作为64位系统,可以通过相同方法安装64位 PowerShell,感兴趣的可以尝试。

现在我们可以愉快的调用疫情数据了!PowerShell 自带一个 Invoke-RestMethod 方法专门用来调用 REST API,非常方便,996。而 Format-Table 则可以把返回的 JSON 对象直接用表格形式来展示,更不会 996!

Invoke-RestMethod 参考:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-7

当然,你在 Windows 咖喱味 PC 上也能用经典 PowerShell 做这件事:

在树莓派上使用 PowerShell 调用 Azure 上的 .NET Core API 获取疫情数据相关推荐

  1. 进阶1·调用高德API获取交通数据(多个URL访问,字典提取,while无限循环下的程序间断运行)

    调用高德开放API获取实时交通数据 想法及思路 现在大型网站都提供了好多开放API,根据这些开放API可以做一些比较有趣的东西,本次调用高德开放api实时获取你想知道的道路拥堵状况 工具及技术: Py ...

  2. ASP.NET Core2调用Azure云上的PowerBI报表展示

    在开发企业应用中,报表功能是当之无愧的重头戏,如何将数据通过合适的报表呈现出来成为每个项目人员必需面临的问题.而找到一款合适的报表往往都需要考率价格.开发.风格.支撑等因素.那么,我在这里给大家介绍一 ...

  3. ASP.NET Core 2调用Azure云上的PowerBI报表展示

    在开发企业应用中,报表功能是当之无愧的重头戏,如何将数据通过合适的报表呈现出来成为每个项目人员必需面临的问题.而找到一款合适的报表往往都需要考率价格.开发.风格.支撑等因素.那么,我在这里给大家介绍一 ...

  4. azure上传代码_深入了解Azure Data Studio:更多代码和更少GUI

    azure上传代码 In the previous two articles, Starting your journey with Azure Data Studio and Developing ...

  5. (译)如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)...

    我一哥们考虑把他的一些基于linux的网站移到Azure上.如果你现在的网站是node.js, ASP,ASP.NET,或PHP做的,使用Azure web站点是最容易的.我会在这篇文章里向你展示如何 ...

  6. Azure上基于HTTP trigger的Lambda Function

    Azure上通过HTTP方式触发的Lambda Function,函数体直接在浏览器里编写: 存储在Azure云端的index.js里: 点击get function url拿到该函数的调用链接,直接 ...

  7. [PowerShell]人人都值得学一点PowerShell实现自动化(1)在VisualStudio上使用PowerShell...

    最近学PowerShell的知识比较多,也开始有一点点可以分享的知识给大家输出,学一门语言,理当首先找准一个好用的IDE来帮助我们提高学习效率,本文给大家介绍如何在宇宙第一的IDE-Visual St ...

  8. Azure 上使用 Windows Server Core 运行 ASP.NET Core 网站

    点击上方蓝字关注"汪宇杰博客" 导语 微软智慧云 Azure 上虽然早就有 App Service 这种完全托管的 PaaS 服务可以让我们分分钟建网站.但是不自己配一下环境,就不 ...

  9. azure 使用_如何使用JavaScript在Azure上开始使用SignalR

    azure 使用 The other day, some fine developers at my company were getting ready to roll out a status u ...

最新文章

  1. layui上传图片列表展示_layui怎么做图片在列表中显示 | 学步园
  2. 日本未来投资重点领域是物联网和人工智能应用
  3. java中sleep()、wait()相同与不同详解
  4. matlab计算运行时间方法
  5. 织梦多个栏目arclist调用副栏目不显示的解决办法
  6. gbdt如何处理多分类问题(multiclass,cart)
  7. ASP.NET Core 2.0 支付宝当面付之扫码支付
  8. Java ArrayList的实现原理详解
  9. X战警大战复联要来了?迪士尼收购21世纪福克斯后开始狂秀IP...
  10. Python扩展库psutil用法精要
  11. 各种数字字体样式_来自中世纪建筑 文化的字体——————哥特式
  12. python获取文件名中两条下划线之间的部分_Python 中的特殊双下划线方法
  13. Ubuntu18.04安装RealsenseD435驱动
  14. ubuntu服务器系统分区大小,服务器Ubuntu系统分区教程
  15. Ubuntu20.04显卡驱动安装
  16. photoshop自定义画笔预设,工作中的应用。
  17. VR和AR未来的对垒
  18. LZX 定义 - 转帖
  19. 国外著名大学计算机教学考察随笔
  20. 0基础学习Linux运维的必经之路

热门文章

  1. 【SAS NOTES】sas对中文的支持
  2. Kinect开发笔记之六Kinect Studio的应用
  3. confd_confd + Nacos | 无代码侵入的配置变更管理
  4. 《版式设计——日本平面设计师参考手册》—第1章应用对象样式
  5. css 中图片旋转,倾斜,位移,平滑
  6. 当前联机日志损坏恢复
  7. 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象
  8. C++ const 关键字使用
  9. Linux SSH Publickey登录
  10. ubuntu下搭建java web开发环境的详细步骤