当前位置:首页 > 行业动态 > 正文

httpclient调用webapi

使用HttpClient调用WebAPI需创建实例,配置请求地址和参数,通过GetAsync/PostAsync发送请求,读取响应内容

HttpClient调用WebAPI详解

基础用法

步骤 说明 代码示例
创建HttpClient实例 建议复用实例,避免频繁创建导致端口耗尽 var client = new HttpClient();
构建请求 设置URL、方法、Headers、Body等 var request = new HttpRequestMessage(HttpMethod.Get, "https://api.example.com/data");
发送请求 同步/异步调用 var response = await client.SendAsync(request);
处理响应 解析状态码、响应体 if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); }

关键配置选项

配置项 作用 示例代码
超时设置 控制请求最大时长 client.Timeout = TimeSpan.FromSeconds(30);
默认Headers 设置全局请求头 client.DefaultRequestHeaders.Add("Api-Key", "123456");
代理配置 通过代理服务器发送请求 client.Proxy = new WebProxy("http://proxyserver:8080");

高级使用场景

  1. 异步调用模式

    using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
    var response = await client.GetAsync("https://api.example.com/longprocess", cts.Token);
  2. 带认证的请求
    | 认证类型 | 实现方式 |
    |———-|———-|
    | Basic认证 | client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("user:pass"))); |
    | Bearer Token | client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "token字符串"); |

    httpclient调用webapi  第1张

  3. 文件上传下载

    // 上传文件
    using var fs = new FileStream("file.txt", FileMode.Open);
    var content = new StreamContent(fs);
    await client.PostAsync("https://api.example.com/upload", content);
    // 下载文件
    var response = await client.GetAsync("https://api.example.com/download");
    await response.Content.CopyToAsync(new FileStream("download.zip", FileMode.Create));

常见问题解决方案

问题现象 解决方案
端口耗尽异常 通过依赖注入复用HttpClient实例,例如在.NET Core中配置services.AddHttpClient()
SSL证书错误 安装证书到受信任存储
临时解决方案:ServicePointManager.ServerCertificateValidationCallback = (s,c,t,p) => true;(慎用)
大文件内存溢出 使用StreamContent配合流式处理,避免一次性加载到内存

相关问题与解答

Q1:如何处理WebAPI返回的401未授权错误?

  • A1
    1. 检查认证信息是否正确(如Token是否过期)
    2. 实现自动刷新Token机制:
      if (response.StatusCode == HttpStatusCode.Unauthorized) {
          // 触发Token刷新逻辑
          var newToken = RefreshAccessToken();
          client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", newToken);
          // 重新发送请求
      }

Q2:在多线程环境中如何安全使用HttpClient?

  • A2
    | 方案 | 说明 |
    |——|——|
    | 单例模式 | 在整个应用生命周期内复用同一个HttpClient实例 |
    | DI容器管理 | .NET Core中通过IHttpClientFactory创建命名客户端:

     services.AddHttpClient("apiClient", client => {
           client.BaseAddress = new Uri("https://api.example.com/");
       });

    使用时注入:var client = httpClientFactory.CreateScoped("apiClient"); |

0