在c#开发中,HttpClient是专门用于发送HTTP请求和接收HTTP响应的类,属于System.Net.Http命名空间,支持异步操作,适合处理各类网络接口调用场景。开发者可以通过它完成与后端服务、第三方API的交互,获取或提交数据。

HttpClient基础使用准备
使用HttpClient前需要先引入对应的命名空间,同时建议将HttpClient实例设置为单例或者复用,避免频繁创建销毁带来的资源消耗问题。以下是基础的初始化代码:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class HttpClientDemo
{
// 建议复用HttpClient实例,不要每次请求都新建
private static readonly HttpClient _httpClient = new HttpClient();
static async Task Main(string[] args)
{
// 后续请求操作
}
}
常见用法一:发送GET请求
GET请求是最常用的HTTP请求方式,用于从服务器获取数据。使用HttpClient发送GET请求可以直接调用GetAsync方法,也可以调用GetStringAsync快速获取字符串格式的响应内容。
static async Task SendGetRequest()
{
string url = "https://ipipp.com/api/getData";
try
{
// 方式1:获取完整响应
HttpResponseMessage response = await _httpClient.GetAsync(url);
// 确保响应成功
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"GET请求响应内容:{responseBody}");
// 方式2:直接获取字符串响应
string directResult = await _httpClient.GetStringAsync(url);
Console.WriteLine($"直接获取结果:{directResult}");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"GET请求发生错误:{ex.Message}");
}
}
常见用法二:发送POST请求
POST请求通常用于向服务器提交数据,比如提交表单、上传JSON数据等。需要根据提交的内容类型设置对应的请求内容,常见的是提交JSON格式数据。
using System.Text;
using System.Text.Json;
// 定义提交的数据模型
public class PostData
{
public string Name { get; set; }
public int Age { get; set; }
}
static async Task SendPostRequest()
{
string url = "https://ipipp.com/api/postData";
// 构造提交的数据
PostData data = new PostData { Name = "测试用户", Age = 25 };
string jsonData = JsonSerializer.Serialize(data);
// 设置内容类型为application/json
StringContent content = new StringContent(jsonData, Encoding.UTF8, "application/json");
try
{
HttpResponseMessage response = await _httpClient.PostAsync(url, content);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"POST请求响应内容:{responseBody}");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"POST请求发生错误:{ex.Message}");
}
}
常见用法三:设置请求头
很多接口需要设置请求头来完成鉴权、指定数据格式等,比如设置Authorization请求头传递令牌,设置User-Agent标识客户端信息。可以通过HttpClient的DefaultRequestHeaders属性添加全局请求头,也可以在单个请求中设置。
static async Task SendRequestWithHeaders()
{
string url = "https://ipipp.com/api/secureData";
// 添加全局请求头,所有通过该实例的请求都会携带
_httpClient.DefaultRequestHeaders.Add("User-Agent", "CSharpHttpClientDemo");
_httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer test_token_123");
try
{
HttpResponseMessage response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"带请求头的请求响应:{responseBody}");
}
catch (HttpRequestException ex)
{
Console.WriteLine($"请求发生错误:{ex.Message}");
}
}
常见用法四:处理不同类型的响应内容
除了获取字符串格式的响应,还可以根据需要获取字节流、JSON对象等不同格式的内容。比如下载文件时可以获取字节数组,调用JSON接口时可以直接反序列化为对应的对象。
static async Task HandleDifferentResponse()
{
string jsonUrl = "https://ipipp.com/api/getJsonData";
string fileUrl = "https://ipipp.com/files/test.pdf";
try
{
// 获取JSON并反序列化为对象
HttpResponseMessage jsonResponse = await _httpClient.GetAsync(jsonUrl);
jsonResponse.EnsureSuccessStatusCode();
string jsonBody = await jsonResponse.Content.ReadAsStringAsync();
PostData resultData = JsonSerializer.Deserialize<PostData>(jsonBody);
Console.WriteLine($"反序列化结果:姓名{resultData.Name},年龄{resultData.Age}");
// 获取文件字节流(如下载文件场景)
byte[] fileBytes = await _httpClient.GetByteArrayAsync(fileUrl);
Console.WriteLine($"文件字节长度:{fileBytes.Length}");
// 后续可以将字节数组保存为本地文件
}
catch (Exception ex)
{
Console.WriteLine($"处理响应发生错误:{ex.Message}");
}
}
使用HttpClient的注意事项
- 不要频繁创建和销毁HttpClient实例,否则会导致端口耗尽问题,建议复用同一个实例或者使用IHttpClientFactory管理(依赖注入场景)。
- 所有异步方法都需要使用
await关键字等待结果,避免阻塞线程。 - 调用
EnsureSuccessStatusCode可以快速判断响应是否成功,避免处理错误响应的内容。 - 如果请求需要设置超时时间,可以通过
_httpClient.Timeout = TimeSpan.FromSeconds(30)设置,默认超时时间是100秒。
HttpClientcsharpHTTP请求异步编程修改时间:2026-07-23 00:48:19