首页 > 其他分享 >httpClient使用GetStringAsync、GetByteArrayAsync、GetStreamAsync三种方法的使用场景

httpClient使用GetStringAsync、GetByteArrayAsync、GetStreamAsync三种方法的使用场景

时间:2024-06-24 11:11:18浏览次数:3  
标签:GetStringAsync GetStreamAsync httpClientFactory github 使用 GetByteArrayAsync publ

 

`HttpClient` 类中的 `GetStringAsync`、`GetByteArrayAsync` 和 `GetStreamAsync` 方法用于从远程服务器获取不同类型的数据。它们的主要使用场景如下:

1. `GetStringAsync` 方法:
- 使用场景:当您需要从远程服务器获取文本数据时,可以使用 `GetStringAsync` 方法。这通常用于获取 JSON 数据、HTML 内容或其他文本格式的数据。
- 返回类型:`Task<string>`,表示异步操作的结果是一个字符串。

2. `GetByteArrayAsync` 方法:
- 使用场景:当您需要从远程服务器获取二进制数据时,例如图像、音频或其他二进制文件时,可以使用 `GetByteArrayAsync` 方法。
- 返回类型:`Task<byte[]>`,表示异步操作的结果是一个字节数组。

3. `GetStreamAsync` 方法:
- 使用场景:当您需要从远程服务器获取数据流时,可以使用 `GetStreamAsync` 方法。这对于处理大文件或需要以流的方式进行处理的数据非常有用。
- 返回类型:`Task<Stream>`,表示异步操作的结果是一个数据流对象。

根据您需要获取的数据类型,您可以选择适当的方法来从远程服务器获取数据。这些方法使得从网络获取数据变得非常方便,并且可以轻松地在异步操作中使用它们。

 

 HttpClient 不能立即关闭连接、性能消耗严重等,故出现了HttpClientFactory.

下面以 ASP.NET Core 为例介绍 HttpClient 新的三种正确使用方式。

一、直接使用方式

不管是哪种方式,都要先注册服务,对于 ASP.NET Core 应用则是在 Startup.cs 文件的 ConfigureServices 添加如果代码:

services.AddHttpClient();

  然后在 Controller 中通过构造注入的试获得 IHttpClientFactory,然后通过它来创建 HttpClient 对象。示例代码:

public class ValuesController : BaseController
{
    private readonly IHttpClientFactory _httpClientFactory;
    public ValuesController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet]
    public async Task<ActionResult> Get()
    {
        var client = _httpClientFactory.CreateClient();
        client.BaseAddress = new Uri("http://api.github.com");
        string result = await client.GetStringAsync("/");
        return Ok(result);
    }
}

这种使用方式适合一次性的 HTTP 请求调用,弊端是如果多次都要请求 github 的接口,那就得写很多重复代码配置 HttpClient。

二、命名式使用方式

命名式的使用方式可以解决第一种方式的问题,对于特定域名的 HTTP 调用,可以只做一次配置,然后在多个地方通过名称拿到相同的 Client 来使用。

首先在 Startup.cs 注册服务的地方添加带有特定名称的 HttpClient 服务,并添加需要的配置,如下示例:

services.AddHttpClient();
services.AddHttpClient("github", c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
    c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

注意这里添加了两次 AddHttpClient,一次是没有命名的,一次是有命名的。在 Controller 中的使用方式是:

public class ValuesController : BaseController
{
    private readonly IHttpClientFactory _httpClientFactory;

    public ValuesController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet]
    public async Task<ActionResult> Get()
    {
        var client = _httpClientFactory.CreateClient("github");
        string result = await client.GetStringAsync("/");
        return Ok(result);
    }
}

但如果使用很频繁,这种获取 Client 的方式还是有一点麻烦。下面介绍第三种方式,可以在使用的时候方便一点,但配置要麻烦些。

三、类型化使用方式

类型化的使用方式可以预先把配置放到自定义的 HttpClient 中,然后在需要的地方都过依赖注入直接拿到 HttpClient 实例。

我们来看具体的例子,首先自定义一个 HttClient 类,比如访问 github 接口的类可以这样定义:

public class GitHubClient
{
    public HttpClient Client { get; private set; }

    public GitHubClient(HttpClient httpClient)
    {
        httpClient.BaseAddress = new Uri("https://api.github.com/");
        httpClient.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
        httpClient.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
        Client = httpClient;
    }

    public async Task<string> GetData()
    {
        return await _client.GetStringAsync("/");
    }
}

这里的 GetData 就是额外扩展的共用方法。使用前需要为这个类注册服务:

services.AddHttpClient<GitHubClient>();

然后在需要的地方(比如 Controller)中这样使用:

public class ValuesController : BaseController
{
    private readonly GitHubClient _gitHubClient;;

    public ValuesController(GitHubClient gitHubClient)
    {
        _gitHubClient = gitHubClient;
    }

    [HttpGet]
    public async Task<ActionResult> Get()
    {
        string result = await _gitHubClient.GetData();
        return Ok(result);
    }
}

类型化的方式和命名式的方式相比,虽然在配置的时候会麻烦一点,但它有两个好处:

一是不用通过名称字符串来获得 Client,而是直接通过依赖注入获得具体的 Client;

二是可以在自定义的 HttpClient 类中扩展共用的方法。

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

标签:GetStringAsync,GetStreamAsync,httpClientFactory,github,使用,GetByteArrayAsync,publ
From: https://www.cnblogs.com/yexiaoyanzi/p/18264611

相关文章

  • C# 后端请求 PostAsync GetStringAsync
     stringsendUrl=$"http://10.172.1.20/wtoptst/ws/r/awsp920";HttpClientsendclient=newHttpClient();stringtestStr=JsonConvert.SerializeObject(reques);//查看内容(测试用)HttpConten......