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

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

导语

最近因为疫情被关在家里,做了个无聊成就:我们将在树莓派上用 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 做这件事:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitlab 删除分支_初识gitlab工作流

git对我来说挺难理解的&#xff0c;平时遇到问题也是绕着走&#xff0c;倒也没啥大问题&#xff0c;但基于git软件的工作流却很重要&#xff0c;尤其对于一个组织来说。git工作流、github工作流、gitlab工作流都属于特性分支(feature branches)的类别&#xff0c;今天主要理解g…

.NET Core开发实战(第7课:用Autofac增强容器能力)--学习笔记(下)

07 | 用Autofac增强容器能力&#xff1a;引入面向切面编程&#xff08;AOP&#xff09;的能力如何获取没有命名的服务呢&#xff1f;// 获取没有命名的服务&#xff0c;把 namd 去掉即可 var servicenamed this.AutofacContainer.Resolve<IMyService>(); servicenamed.S…

hdfs读写流程_一文读懂HDFS分布式存储框架分析

一文读懂HDFS分布式存储框架分析HDFS是一套基于区块链技术的个人的数据存储系统&#xff0c;利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务&#xff0c;将闲置的存储空间利用起来&#xff0c;服务于正处于爆发期的个人数据存储市场。HDFS属于什么结构体…

gRPC in ASP.NET Core 3.x - gRPC 简介(1)

gRPC的结构 在我们搭建gRPC通信系统之前&#xff0c;首先需要知道gRPC的结构组成。 首先&#xff0c;需要一个server&#xff08;服务器&#xff09;&#xff0c;它用来接收和处理请求&#xff0c;然后返回响应。 既然有server&#xff0c;那么肯定有client&#xff08;客户端&…

arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准

1.1.1方法简介1.1.1.1所有图件扫描后都必须经过扫描纠正&#xff0c;对扫描后的栅格图进行检查&#xff0c;以确保矢量化工作顺利进行。对影像的配准有很多方法&#xff0c;下面介绍一种常用方法。(1)打开 ArcMap&#xff0c;增加 Georeferncing 工具条。(2)把需要进行纠正的影…

使用ASP.NET Core构建RESTful API的技术指南

译者荐语&#xff1a;利用周末的时间&#xff0c;本人拜读了长沙.NET技术社区翻译的技术文章《微软RESTFul API指南》&#xff0c;打算按照步骤写一个完整的教程&#xff0c;后来无意中看到了这篇文章&#xff0c;与我要写的主题有不少相似之处&#xff0c;特意翻译下来。原文来…

查询ecshop网站代码排查方法_提升网站访问速度,提升网站访问速度,提升网站访问速度的个人经验分享...

一、前言网站打开慢这个问题&#xff0c;算是老生常谈了&#xff0c;在实际的生产的环境中&#xff0c;我们会经常遇到这样的问题。作为一个运维工程师&#xff0c;我们该从哪些角度去分析问题&#xff0c;判断问题&#xff0c;并最终解决问题。那么首先我会从几个方面分析这个…

dotnet 手工打一个 dotnet tool 包

现在依靠 dotnet 平台&#xff0c;可以方便分发工具&#xff0c;利用 NuGet 服务进行分发和使用工具。打一个 dotnet tool 包&#xff0c;可以将这个包上传到 NuGet 上&#xff0c;小伙伴通过和安装 NuGet 相同方式就可以将工具安装在本机上。本文将告诉大家如何手工打一个 dot…

漫谈Linux文档属性、拥有者、群组、权限

作者&#xff1a;justmine头条号&#xff1a;大数据与云原生微信公众号&#xff1a;大数据与云原生创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便阅读&#xff0c;微信公众号已按分类排版&#xff0c;后续的文章…

java foreach跳出本次循环_Java中提供三种常用的循环语句

开发工具与关键技术&#xff1a;MyEclipse 10,java作者&#xff1a;刘东标循环语句&#xff1a;满足一定条件的情况下反复执行一个操作。Java中提供三种常用的循环语句&#xff1a;1.while循环语句while先判断为真&#xff0c;再执行while循环语句&#xff0c;如果条件为假&…

如何学习WPF技术?

本文由长沙DotNET技术社区【邹溪源】整理&#xff0c;共有7544字&#xff0c;阅读需耗时15分钟。引言在桌面开发领域&#xff0c;虽然在某些领域&#xff0c;基于electron的跨平台方案能够为我们带来某些便利&#xff0c;但是由于WPF技术能够更好的运用Direct3D带来的性能提升、…

java爬取网页数据_如何使用爬虫工具采集数据

网络爬虫是一种按照一定规则&#xff0c;自动抓取万维网数据的脚本。按照一定规则&#xff0c;指的是爬虫程序需要解析网页的dom结构&#xff0c;针对dom结构爬取自己感兴趣的数据。(图1)这就是一个网页源码的dom结构,我们需要一级一级指定抓取的标签&#xff0c;如下图:(图2)图…