如何用C#的PostAsJsonAsync调用指定Header和Body的Post API?
C# 使用PostAsJsonAsync调用Post API的代码校验与优化
你的代码存在的几个问题
- 变量名拼写错误:定义的是
posturl,但调用PostAsJsonAsync时写的是posturi,会直接导致编译失败 - 匿名对象语法错误:C#中匿名对象的属性名不能加双引号,正确写法是用
=赋值,而非: - 同步阻塞风险:用
.Result强制等待异步操作完成,违背异步API设计初衷,在ASP.NET、WPF等有同步上下文的环境中极易引发死锁 - HttpClient使用不当:每次请求新建
HttpClient会快速耗尽系统套接字资源,这是.NET开发中的常见误区
修正后的可运行代码
// 核心:HttpClient需复用,避免频繁创建销毁 private static readonly HttpClient _httpClient = new HttpClient(); public async Task GetRateAsync() { var postUrl = "api/getRate"; // 添加请求头(若为固定标识,可在HttpClient初始化时一次性添加) _httpClient.DefaultRequestHeaders.Add("msgNo", "abc123"); _httpClient.DefaultRequestHeaders.Add("receiver", "Customer_A"); // 正确的匿名对象写法 var requestBody = new { dateTime = "2023/08/19 18:00:00", Currency = "USD", Ratetype = "COST" }; // 用await异步等待,禁止使用.Result阻塞线程 var response = await _httpClient.PostAsJsonAsync(postUrl, requestBody); // 校验请求是否成功,失败直接抛出异常 response.EnsureSuccessStatusCode(); // 读取响应内容,替换为实际的API响应类型 var result = await response.Content.ReadFromJsonAsync<RateResponse>(); } // 推荐定义强类型响应类,提升代码可维护性与类型安全性 public class RateResponse { // 根据API返回字段定义对应属性 public decimal RateValue { get; set; } // 其他响应字段... }
关键注意事项
- HttpClient复用原则:HttpClient是长生命周期对象,应通过静态字段、依赖注入单例等方式全局复用,频繁创建会导致套接字泄漏
- 异步编程规范:所有异步操作必须使用
await,禁止用.Result或.Wait()阻塞线程 - 强类型模型优化:若需多次调用该API,建议为请求体也定义强类型类,示例如下:
使用时直接实例化该类:public class RateRequest { public string dateTime { get; set; } public string Currency { get; set; } public string Ratetype { get; set; } }var requestBody = new RateRequest { ... },可获得编译时类型检查,避免字段名拼写错误 - 请求头重复添加处理:若
msgNo为动态生成值,添加前需先检查是否已存在,避免抛出InvalidOperationException:if (!_httpClient.DefaultRequestHeaders.Contains("msgNo")) { _httpClient.DefaultRequestHeaders.Add("msgNo", "abc123"); }
内容的提问来源于stack exchange,提问作者LeonJasonLu
相关产品推荐
相关产品推荐

