深入浅出Blazor webassembly之HttpClient使用

摘要:
===================================参考================================https://www.cnblogs.com/deepthought/p/11303015.htmlhttps://www.cnblogs.com/willick/p/net-核心httpclient。html技术翻译博客https://ww

===================================
参考
===================================

https://www.cnblogs.com/deepthought/p/11303015.html

https://www.cnblogs.com/willick/p/net-core-httpclient.html

技术译民翻译的博客  https://www.cnblogs.com/ittranslator/p/making-http-requests-in-blazor-webassembly-apps.html

===================================
直接使用 HttpClient 的问题
===================================

HttpClient 类所在库为 System.Net.Http,

Blazor webassembly 默认模版已经自动将HttpClient 注册到DI 容器中了, 使用起来非常方便. Program.Main 函数注册DI容器代码:

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

直接使用 HttpClient 问题有:

  • HttpClient 主要问题是, 即使 Dispose 之后, 也不能即时关闭 socket 连接, 在 windows 下, 默认需要等 240秒之后才能关闭 socket. 短时大量使用 HttpClient, 会将客户端和服务器端 socket 连接消耗殆尽, 详见参考文档1的分析.  所以, 客户端应用程序一般使用单例模式使用 HttpClient 类.   Blazor webassembly 也是如此.
  • 如果使用单例模式,  如要为 不同url 设置不同的 header, 就很不方便.
  • HttpClient 还会缓存 IP, 如果 DNS 之后有更新, HttpClient 仍会使用老的 IP

Net Core2.1 提供的 IHttpClientFactory 解决了直接使用HttpClient的所有问题, IHttpClientFactory 提供了更优雅 Http  Client 功能.

===================================
IHttpClientFactory 简单方法生成 HttpClient
===================================

IHttpClientFactory 所在的类库是 Microsoft.Extensions.Http ,   将它加到blazor wasm 项目的依赖中,

Program.Main 函数必须使用 AddHttpClient 完成DI容器注册,  这样DI容器就能为我们注入 IHttpClientFactory 实例.

builder.Services.AddHttpClient();

Razor 页面使用 IHttpClientFactory 的实例生成 HttpClient 对象. 

@page "/hello"
@inject IHttpClientFactory HttpClientFactory
<div>
    _statusCode: @_statusCode
</div>

@code{

    private string _statusCode = "";
    protected override async Task   OnInitializedAsync()
    {
        var httpClient = HttpClientFactory.CreateClient();

        //gorest.co.in 网站已经开启 CORS 共享, 所以我们用它来测试, 而不是 https://www.baidu.com
        httpClient.BaseAddress=new Uri("https://gorest.co.in");
        var result = await httpClient.GetAsync("/public/v1/users");
        _statusCode = result.StatusCode.ToString();
    }
}

使用这个简单的方式,  IHttpClientFactory 注入的实例未经任何初始化, 比如未设置BaseAddress参数,  需要在使用该实例时候, 进行各种设置,  代码复用性较差.

===================================
IHttpClientFactory 采用命名方式生成 HttpClient
===================================

命名方式在使用友好性方面比简单方式好很多.

注册DI容器时, AddHttpClient()传入名称, 同时还可以为将来的HttpClient对象设置各种参数.

使用时, 先获取注入的 IHttpClientFactory HttpClient实例, 然后CreateClient()传入命名值即可得到经过预设的HttpClient对象对象 , 不需要再进行参数设置.

builder.Services.AddHttpClient(name: "gorest", c =>
    {
        c.BaseAddress = new Uri("https://gorest.co.in");
    }
);
@page "/hello"
@inject IHttpClientFactory HttpClientFactory
<div>
    _statusCode: @_statusCode
</div>

@code{

    private string _statusCode = "";
    protected override async Task   OnInitializedAsync()
    {
        var httpClient = HttpClientFactory.CreateClient(name: "gorest");  
        var result = await httpClient.GetAsync("/public/v1/users");
        _statusCode = result.StatusCode.ToString();
    }
}

===================================
IHttpClientFactory 采用类型化方式生成 HttpClient
===================================

类型化方式比命名方式更进一步, 注册DI容器时, AddHttpClient()传入一个泛型类型, 将HttpClient的各种设置转移到泛型类中

这样的好处时, AddHttpClient() 方法更简单, 代码内聚性更好.

包装了 HttpClient 的泛型类:

  public class GorestHttpService
    {
        private readonly HttpClient _httpClient;
        public GorestHttpService(HttpClient httpClient)
        {
            _httpClient = httpClient;
            _httpClient.BaseAddress = new Uri("https://gorest.co.in"); 
        }

        public  async Task<string> GetStatusCodeAsync()
        {
            var result = await _httpClient.GetAsync("/public/v1/users");
            return result.StatusCode.ToString();
        }
       
    }

Program.Main 函数 AddHttpClient 完成DI容器注册

builder.Services.AddHttpClient<GorestHttpService>();

Razor 代码:

@page "/hello"
@inject GorestHttpService gorestHttpService
<div>
    _statusCode: @_statusCode
</div>

@code{

    private string _statusCode = "";
    protected override async Task   OnInitializedAsync()
    {
        var result = await gorestHttpService.GetStatusCodeAsync();
        _statusCode = result;
    }
}

===================================
 为 HttpClient 增加 Header
===================================

如需要增加 Bearer Header, 可以通过为 httpClient.DefaultRequestHeaders.Authorization 属性赋值.

public class GorestHttpService
{
    private readonly HttpClient _httpClient;
    public GorestHttpService(HttpClient httpClient)
    {
        _httpClient = httpClient;
        _httpClient.BaseAddress = new Uri("https://gorest.co.in");
        string token = "changeMe";  
        _httpClient.DefaultRequestHeaders.Authorization= new AuthenticationHeaderValue("Bearer", token);
    }

    public  async Task<string> GetStatusCodeAsync()
    {
        var result = await _httpClient.GetAsync("/public/v1/users");
        return result.StatusCode.ToString();
    }
   
}

===================================
开放的 Rest api 服务
===================================

示例中使用了 GoRest 网站, 它是 Online REST API for Testing and Prototyping  https://gorest.co.in/

一些简单的api网站 https://mixedanalytics.com/blog/list-actually-free-open-no-auth-needed-apis/

免责声明:文章转载自《深入浅出Blazor webassembly之HttpClient使用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇第一次使用Layui 分页Oracle之PL/SQL编程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ShowDoc速记

编写文档好工具showdoc部署 参考:https://www.showdoc.cc/ 一定要看,一定要用卷,丢失数据的痛苦,痛何如哉。 https://www.cnblogs.com/harrychinese/p/showdoc.html   @@@code # 由于国内镜像与官网原镜像同步可能延迟,如果有网络条件,建议使用原镜像。如果网络不好,建...

VUE 进阶

4. 通过axios实现数据请求vue.js默认没有提供ajax功能的。 所以使用vue的时候,一般都会使用axios的插件来实现ajax与后端服务器的数据交互。 注意,axios本质上就是javascript的ajax封装,所以会被同源策略限制。 下载地址: https://unpkg.com/axios@0.18.0/dist/axios.js ht...

Linux 安装SonarQube

            1、在安装SonarQube 之前需要先了解一下它是做什么的   SonarQube助力于让所有开发人员编写更干净、更安全的代码   SonarQube是一个用于管理代码质量的开放平台,可以快速的定位代码中潜在的或者明显的错误。目前支持Java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groov...

个性化windows10主题/换成winxp主题

win10系统主题手动更换为仿winXp系统主题 突然想念家里那台被遗忘了好久的旧电脑,思绪被拉回小时候偷玩电脑的场景。 如果你也是一个念旧的人的话,我相信你一定喜爱Windows XP的经典界面。 上个图:  实现步骤如下: 1、下载软件Classic Shell。 链接:https://pan.baidu.com/s/13cTkeSQOMwg8jOQQ...

odoo中接口开发

文章参考:https://blog.csdn.net/qq_33472765/article/details/81913627案例0000001接口调用请求说明:https请求方式:GET(请使用https协议)csrf=Falsecsrf(Cross-site request forgery跨站请求伪造)问题,get请求不影响,post就需要csrf认证...

微信 ios端config配置失败 android端正常

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script> 如果你页面启用了https,务必引入 https://res.wx.qq.com/open/js/jweixin-1.0.0.js ,否则将无法在iOS9.0以上系统中成功使用JSSDK...