上一篇
httpclient调用webapi
- 行业动态
- 2025-04-28
- 3728
使用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"); |
高级使用场景
异步调用模式
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); var response = await client.GetAsync("https://api.example.com/longprocess", cts.Token);
带认证的请求
| 认证类型 | 实现方式 |
|———-|———-|
| Basic认证 |client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes("user:pass")));
|
| Bearer Token |client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "token字符串");
|文件上传下载
// 上传文件 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:
- 检查认证信息是否正确(如Token是否过期)
- 实现自动刷新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");
|