1. 从零开始:HttpClient Post请求的基础入门
如果你刚开始接触C#的网络请求,或者之前一直用着老旧的WebClient,那么HttpClient可能会让你觉得有点陌生,但又充满惊喜。我刚开始用的时候也觉得,不就是发个请求吗,能有多复杂?但真正用起来才发现,这里面门道不少,用好了能极大提升开发效率和代码质量。今天,我就从一个实战开发者的角度,带你从最基础的PostAsync用起,一步步走到高级封装,让你手里的HttpClient真正变成一把得心应手的利器。
首先,我们得搞清楚一个核心问题:HttpClient的PostAsync方法,它到底要我们传个什么东西进去?翻看微软的文档或者智能提示,你会发现它接受一个HttpContent类型的参数。这个HttpContent是个抽象类,你不能直接new HttpContent(),这就好比告诉你“需要一辆车”,但没说是轿车、卡车还是自行车。你得找到它的具体实现。这其实就是理解HttpClient Post请求的第一把钥匙——理解不同的HttpContent子类,就理解了如何发送不同类型的数据。
在实际项目中,我们最常打交道的有四位“明星选手”:
- StringContent: 这是你的“万金油”,当你需要发送JSON、XML或纯文本字符串时,用它就对了。它内部就是把你的字符串转换成字节流。
- FormUrlEncodedContent: 专门用于模拟网页表单提交,对应
application/x-www-form-urlencoded格式。比如你要登录一个网站,提交用户名和密码,用这个最合适。 - MultipartFormDataContent: 功能更强大的表单提交,支持
multipart/form-data格式。它的绝活是可以混合发送文本字段和文件(比如图片、文档)。上传文件时,它是唯一的选择。 - StreamContent: 当你已经有一个数据流(比如
FileStream、MemoryStream),想直接把这个流发出去时,就用它。它非常灵活,适合处理二进制数据。
光说理论有点枯燥,我直接给你看一个最常用、也最基础的例子:发送JSON数据。这也是现在前后端交互(比如和Vue、React前端,或者移动端)最主流的格式。
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json; // 需要安装Newtonsoft.Json包
public class User
{
public string Account { get; set; }
public string Password { get; set; }
}
class Program
{
static async Task Main(string[] args)
{
// 1. 创建HttpClient实例。这里用using包裹是良好习惯,确保资源释放。
using (var client = new HttpClient())
{
try
{
// 2. 准备要发送的数据对象,并序列化成JSON字符串
var user = new User { Account = "testUser", Password = "myPassword123" };
string jsonData = JsonConvert.SerializeObject(user);
// 3. 关键步骤:创建StringContent,并明确告诉服务器这是JSON
var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
// 4. 发送POST请求并等待响应
HttpResponseMessage response = await client.PostAsync("https://api.example.com/login", content);
// 5. 确保响应是成功的(状态码2xx),否则会抛出异常
response.EnsureSuccessStatusCode();
// 6. 读取响应体的内容
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine($"服务器返回: {responseBody}");
}
catch (HttpRequestException e)
{
// 处理网络错误、连接失败、超时等问题
Console.WriteLine($"网络请求出错: {e.Message}");
}
catch (Exception e)
{
// 处理其他意外错误
Console.WriteLine($"发生错误: {e.Message}");
}
}
}
}
这段代码虽然简单,但包含了几个新手容易忽略的关键点。第一,StringContent的构造函数里,我传入了Encoding.UTF8和"application/json"。指定编码可以避免中文乱码,而设置Content-Type为application/json是告诉服务器:“我发过来的是JSON格式,请按这个格式解析”。很多新手忘了设置这个Header,导致后端收到数据后一脸懵,不知道如何解析。第二,我用了response.EnsureSuccessStatusCode()。这个方法非常有用,如果响应的HTTP状态码不是200-299之间的成功码(比如404、500),它会直接抛出HttpRequestException,让你能快速定位是请求出了问题,而不是逻辑问题。第三,也是最重要的,HttpClient实现了IDisposable接口,但最佳实践是长时间复用单个实例,而不是每次请求都new一个。上面的using写法在简单控制台程序里没问题,但对于Web应用(如ASP.NET Core)或长期运行的服务,你应该考虑将其注入为单例。这个我们后面在封装时会详细讲。
2. 深入四大HttpContent:搞定所有数据发送场景
了解了基础用法,我们得把这四大HttpContent的看家本领摸透。在实际开发中,面对不同的API接口,你得能迅速选出最合适的“兵器”。这就像工具箱,你不能只用一把螺丝刀去应付所有活儿。
2.1 StringContent:JSON传输的核心担当
上面我们已经演示了JSON的发送。但StringContent不止于此。假设你需要调用一个旧的SOAP WebService接口,它可能接受XML格式。操作几乎一模一样:
string xmlData = @"<request><user>admin

1万+

被折叠的 条评论
为什么被折叠?



