HttpClient 是 .NET 中用于发送 HTTP 请求和接收 HTTP 响应的类。它与 HttpContent 类一起使用,后者表示 HTTP 请求或响应的内容。HttpContent 是一个抽象类,提供了多种派生类来处理不同类型的 HTTP 内容,例如 ByteArrayContent、StreamContent、MultipartContent 和 JsonContent。
System.Net.Http.ByteArrayContent
ByteArrayContent 是 HttpContent 的一个派生类,用于发送字节数组形式的数据。它提供了一个构造函数,接受一个字节数组并将其用作 HTTP 请求的内容。
使用方法:
- 创建
ByteArrayContent实例,传入字节数组。 - 设置
HttpRequestMessage的Content属性为ByteArrayContent实例。 - 发送请求。
示例代码:
byte[] fileContents = File.ReadAllBytes("file_path");
ByteArrayContent byteArrayContent = new ByteArrayContent(fileContents);
using (HttpClient httpClient = new HttpClient())
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://example.com/api");
request.Content = byteArrayContent;
HttpResponseMessage response = await httpClient.SendAsync(request);
// 处理响应
}
System.Net.Http.Json.JsonContent
JsonContent 是一个用于发送 JSON 格式数据的 HttpContent 派生类。它使用 System.Text.Json 序列化对象到 JSON。
使用方法:
- 使用
JsonContent.Create方法创建实例,传入要序列化的对象。 - 设置
HttpRequestMessage的Content属性为JsonContent实例。 - 发送请求。
示例代码:
var data = new { Name = "Kimi", Age = 30 };
JsonContent jsonContent = JsonContent.Create(data);
using (HttpClient httpClient = new HttpClient())
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://example.com/api");
request.Content = jsonContent;
HttpResponseMessage response = await httpClient.SendAsync(request);
// 处理响应
}
System.Net.Http.MultipartContent
MultipartContent 是用于发送多部分表单数据的 HttpContent 派生类,常用于文件上传。
使用方法:
- 创建
MultipartFormDataContent实例。 - 使用
Add方法添加字符串或文件内容。 - 设置
HttpRequestMessage的Content属性为MultipartContent实例。 - 发送请求。
示例代码:
using (HttpClient client = new HttpClient())
{
var content = new MultipartFormDataContent();
content.Add(new StringContent("value"), "key");
content.Add(new ByteArrayContent(File.ReadAllBytes("file_path")), "file", "file_name");
var response = await client.PostAsync("http://example.com/api", content);
// 处理响应
}
System.Net.Http.StreamContent
StreamContent 是用于发送流数据的 HttpContent 派生类。
使用方法:
- 创建
StreamContent实例,传入一个Stream对象。 - 设置
HttpRequestMessage的Content属性为StreamContent实例。 - 发送请求。
示例代码:
using (Stream stream = File.OpenRead("file_path"))
{
StreamContent streamContent = new StreamContent(stream);
using (HttpClient httpClient = new HttpClient())
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "http://example.com/api");
request.Content = streamContent;
HttpResponseMessage response = await httpClient.SendAsync(request);
// 处理响应
}
}
设计思路:
ByteArrayContent允许开发者直接将字节数组发送到服务器,适用于较小的数据。JsonContent提供了一种方便的方式来发送 JSON 数据,自动处理序列化。MultipartContent支持同时发送文件和其他数据,非常适合表单数据和文件上传场景。StreamContent则提供了一种灵活的方式来发送流数据,适用于大文件或未知大小的数据。
这些类的设计使得 HttpClient 能够灵活地处理各种类型的 HTTP 请求内容。