当前位置 主页 > 网站技术 > 代码类 >

    .Net Core下HTTP请求IHttpClientFactory示例详解

    栏目:代码类 时间:2019-10-07 21:04

    使用方式

    IHttpClientFactory有四种模式:

    基本用法 命名客户端 类型化客户端 生成的客户端

    基本用法

    在 Startup.ConfigureServices 方法中,通过在 IServiceCollection 上调用 AddHttpClient 扩展方法可以注册 IHttpClientFactory

    services.AddHttpClient();

    注册之后可以像依赖注入DI似得在类中通过构造函数注入形式使用,伪代码:

    class A
    {
     private readonly IHttpClientFactory _clientFactory;
     public A(IHttpClientFactory clientFactory)
     {
      _clientFactory = clientFactory;
     }
     
     Public void Use()
     {
       var request=new HttpRequestMessage(HttpMethod.Get,"www.baidu.com") ;
       var client = _clientFactory.CreateClient();
       var response = await client.SendAsync(request); 
       if (response.IsSuccessStatusCode)
       {
       Branches = await response.Content.ReadAsAsync<IEnumerable<GitHubBranch>>();
       }
      else
      {
       GetBranchesError = true;
       Branches = Array.Empty<GitHubBranch>();
      }  
     }
    }

    命名客户端

    也是在基本用法的基础上增加配置参数:例如增加一个baidu下的客户端:

    services.AddHttpClient("baidu",c=>
    {
     c.BaseAddress = new Uri("https://api.baidu.com/");
     //其他一些参数
    });

    然后在使用的时候只是需要传递客户端名称就自动使用baidu这个地址的基础地址配置:

     var client = _clientFactory.CreateClient("baidu");

    类型化客户端

    说的明白一点就是在使用类的构造函数中可以直接接受HttpClient 类型,不用在使用IHttpClientFactory 接口的CreateClient方法创建,但是首要条件就是要先创建注入类型,然后在ConfigureServices 方法同时注入:

    services.AddHttpClient<classHttp>();

    注入类型:

    public class classHttp
    {
       public HttpClient Client { get; }
       public GitHubService(HttpClient client)
       {
          client.BaseAddress = new Uri("https://api.baidu.com/");
          //同ConfigureServices 中一样设置一些其他参数
          Client = client;
       }
    }

    生成的客户端

    这个我个人理解为就是配置使用第三方库,然后可以注入接口类型,接口中可以写一些方法接口。然后通过接口类直接调用接口。

    个人理解:就是类似于一个接口映射,地址映射似得。通过结合第三方库(官方推荐Refit)实现请求一个地址别名的方式,别名就是指定义的接口。然后别名通过增加特性Get(“路径”)或者post("路径)的形式重新指向真实的请求接口地址。通过请求这个本地接口方法实现转化请求的真实地址。

    举例定义接口:

    public interface IHelloClient
    {
      [Get("/MyInterFace")]
      Task<Reply> GetMessageAsync();
    }

    配置Refit插件:

    也是和正常配置类似,在后面增加接口的服务注入。

    public void ConfigureServices(IServiceCollection services)
    {
      services.AddHttpClient("hello", c =>
      {
        c.BaseAddress = new Uri("http://localhost:5000");
      })
      .AddTypedClient(c => Refit.RestService.For<IHelloClient>(c));
    
      services.AddMvc();
    }