这系列我们主要介绍一下HttpClient,该类主要是用来从统一资源标识符(URI)标识的资源来发送HTTP请求或者接受HTTP响应,我们可以使用该类做一些WebAPI资源请求和处理,我们通过例子来介绍如何使用HttpClient
1.默认方式
首先我们创建一个AspNetCore.HttpClient项目,添加如下代码在Program.cs,该代码实际上调用AddHttpClient方法注册IHttpClientFactory
接下来我们在HomeController构造函数中通过依赖注入获取到IHttpClientFactory类:
接着我们在HomeController中新增BasicUsage方法,我们使用该方法来请求github api,在这个例子中,我们获取微软asp.net core doc仓库的分支:
在BasicUsage方法内部定义了一个HttpRequestMessage对象,该对象主要表示HTTP请求的消息,主要包含HTTP请求头,HTTP请求方法以及数据,我们使用IHttpClientFactory接口中的CreateClient()方法创建一个HttpClient对象,接下来调用HttpClient的SendAsync方法发送异步HTTP请求,该方法返回一个HttpResponseMessage对象,该对象包含了我们请求的结果,我们读取该对象,并将结果序列化到GitHubBranch类的集合中,到此整个请求完成,我们将结果返回给视图:
运行应用程序,我们看到如下运行结果:
2.命名方式声明HttpClient
我们在创建HttpClient时候可以给对象起个名字,应用程序中多个接口时,针对不同接口做不同配置,我们通过一个例子来演示,我们在Programe类中添加如下代码:
上面代码中对HttpClient做了一些基本配置,添加BaseAddress和两个Header,在第一个例子中我们已经从构造函数中获取到了IHttpClientFactory接口,在HomeController中添加一个NamedClient方法:
上面代码中我们使用了github接口获取所有AspNetCore文档pulls接口,在上面代码中我们调用IHttpClientFactory的CreateClient方法时传递了一个字符串参数gitHub,之后再调用HttpClient的GetAsync异步方法时只是传递了子路径,并没有传递基地址,GetAsync方法会返回一个HttpResponseMessage对象,我们通过该对象读取请求的结果,并将结果序列化成对象传递给视图
我们通过相同的视图组件来渲染该结果:
3 类型化方式声明HttpClient
这种方式和命名方式声明HttpClient有点相似,只不过在创建HttpClient的时候不需要使用字符串命名,在项目根目录下创建Service文件夹,在文件夹下创建一个GitHubService的服务,代码如下:
我们在GitHubService类中对HttpClient做了一些配置,这种方式和命名方式声明HttpClient非常相识,我们把请求的接口封装到了GetAspNetDocsIssues方法中
接下来我们在Program类中添加如下代码:
接着我们在HomeController中通过依赖注入引用GitHubService服务并添加TypedClient方法:
最后在视图中获取请求结果并展示到页面:
运行结果如下:
4 HttpClient集成第三方REST API
我们可以使用HttpClient集成第三方REST API库,例如:Refit,Refit是一个.NET第三方的REST API库,Github地址如下:https://github.com/reactiveui/refit
我们在项目中引用Refit.HttpClientFactory包:
我们在项目Service文件夹下创建一个IGitHubClient接口:
接下来我们在启动项中配置RefitClient对象:
在HomeController类的构造函数中获取IGitHubClient接口,新增一个RefitClient方法:
我们将返回结果呈现到视图:
运行结果如下:
源代码地址:
https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/Fundamentals/AspNetCore.HttpRequest/AspNetCore.HttpClient
参考文献
https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-8.0