在C#中,StringContent 是 HttpContent 的一个派生类,用于在HTTP请求中发送字符串数据(通常是JSON、XML、表单数据等)。
1. 基本用法
最简单的创建方式:
csharp
var content = new StringContent("Hello World");
实际HTTP请求中的使用:
csharp
using var client = new HttpClient();
// 发送字符串数据
var stringContent = new StringContent("This is plain text");
var response = await client.PostAsync("https://api.example.com/data", stringContent);
2. 构造函数重载
StringContent 提供了多个构造函数来满足不同需求:
csharp
// 1. 最基本 - 只有内容
var content1 = new StringContent("Hello World");
// 2. 指定编码
var content2 = new StringContent("Hello World", Encoding.UTF8);
// 3. 指定编码和媒体类型
var content3 = new StringContent("Hello World", Encoding.UTF8, "text/plain");
// 4. 指定编码、媒体类型和额外的格式化程序(较少使用)
var content4 = new StringContent("Hello World", Encoding.UTF8, "text/plain", null);
3. 常用媒体类型(Media Types)
csharp
// JSON 数据
var jsonContent = new StringContent(
"{\"name\":\"John\", \"age\":30}",
Encoding.UTF8,
"application/json"
);
// XML 数据
var xmlContent = new StringContent(
"<user><name>John</name><age>30</age></user>",
Encoding.UTF8,
"application/xml"
);
// HTML 数据
var htmlContent = new StringContent(
"<html><body>Hello</body></html>",
Encoding.UTF8,
"text/html"
);
// 表单数据
var formContent = new StringContent(
"name=John&age=30",
Encoding.UTF8,
"application/x-www-form-urlencoded"
);
// 纯文本
var textContent = new StringContent(
"Plain text data",
Encoding.UTF8,
"text/plain"
);
4. 实际应用示例
发送JSON数据到API:
csharp
public async Task<string> CreateUserAsync(User user)
{
using var client = new HttpClient();
// 序列化对象为JSON字符串
var json = JsonSerializer.Serialize(user);
// 创建StringContent,指定JSON媒体类型
var content = new StringContent(json, Encoding.UTF8, "application/json");
// 添加自定义请求头
content.Headers.Add("X-API-Key", "your-api-key");
var response = await client.PostAsync("https://api.example.com/users", content);
return await response.Content.ReadAsStringAsync();
}
// 使用示例
var user = new { Name = "John Doe", Email = "john@example.com" };
await CreateUserAsync(user);
发送XML数据:
csharp
public async Task<string> SendXmlDataAsync()
{
using var client = new HttpClient();
var xmlData = """
<?xml version="1.0" encoding="UTF-8"?>
<user>
<name>John Doe</name>
<email>john@example.com</email>
</user>
""";
var content = new StringContent(xmlData, Encoding.UTF8, "application/xml");
var response = await client.PostAsync("https://api.example.com/xml-endpoint", content);
return await response.Content.ReadAsStringAsync();
}
5. 添加请求头
csharp
var content = new StringContent(
"{\"data\":\"value\"}",
Encoding.UTF8,
"application/json"
);
// 添加自定义请求头
content.Headers.Add("X-Custom-Header", "CustomValue");
content.Headers.Add("X-Request-ID", Guid.NewGuid().ToString());
// 设置缓存控制
content.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue
{
NoCache = true
};
6. 与HttpClientFactory结合使用
csharp
public class ApiService
{
private readonly HttpClient _httpClient;
public ApiService(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient();
}
public async Task<string> PostDataAsync<T>(T data)
{
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await _httpClient.PostAsync("https://api.example.com/data", content);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
throw new HttpRequestException($"Request failed with status code: {response.StatusCode}");
}
}
}
7. 高级用法
流式处理大量数据:
csharp
public async Task SendLargeDataAsync(IEnumerable<string> dataItems)
{
using var client = new HttpClient();
// 对于大量数据,可以考虑分块发送或使用StreamContent
var json = JsonSerializer.Serialize(dataItems);
var content = new StringContent(json, Encoding.UTF8, "application/json");
// 设置超时
client.Timeout = TimeSpan.FromMinutes(5);
await client.PostAsync("https://api.example.com/bulk-data", content);
}
处理特殊字符:
csharp
// StringContent会自动处理编码
var specialText = "Hello 世界! 🎉";
var content = new StringContent(specialText, Encoding.UTF8, "text/plain");
// 确保服务器也使用UTF-8解码
content.Headers.ContentType.CharSet = "utf-8";
8. 与其他HttpContent类型的比较
csharp
// StringContent - 用于字符串数据
var stringContent = new StringContent("text data");
// FormUrlEncodedContent - 用于表单数据(推荐用于表单)
var formContent = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("name", "John"),
new KeyValuePair<string, string>("age", "30")
});
// MultipartFormDataContent - 用于文件上传
var multipartContent = new MultipartFormDataContent();
multipartContent.Add(new StringContent("John"), "name");
multipartContent.Add(new ByteArrayContent(fileBytes), "file", "image.jpg");
// StreamContent - 用于流数据
var streamContent = new StreamContent(File.OpenRead("largefile.bin"));
9. 错误处理最佳实践
csharp
public async Task<string> SafePostAsync(string url, object data)
{
try
{
var json = JsonSerializer.Serialize(data);
using var content = new StringContent(json, Encoding.UTF8, "application/json");
using var client = new HttpClient();
var response = await client.PostAsync(url, content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
throw;
}
}
总结
StringContent 的主要特点:
- 用途:发送字符串格式的HTTP请求体
- 编码支持:自动处理字符串编码(默认UTF-8)
- 媒体类型:可指定内容类型(Content-Type)
- 内存管理:实现IDisposable,需要适当管理资源
- 灵活性:支持添加自定义请求头
它是C#中处理HTTP请求体最常用和最简单的类之一,特别适合发送JSON、XML等文本格式的数据。