HttpClient向ASP.NET API发送JSON时接口接收参数全为null的问题咨询
问题根因
你当前遇到的参数全为null的核心原因是:客户端发送的是JSON格式的请求体,但API接口默认只会从查询字符串、表单数据中绑定零散的入参,不会主动解析请求体中的JSON内容,因此无法匹配到对应的参数值。
1. 验证生成的JSON是否符合要求的方法
- 先单独输出序列化结果验证:构造StringContent前先把序列化后的JSON字符串打印/打日志,确认结构是否和期望一致:
var jsonStr = JsonConvert.SerializeObject(formData); // 输出jsonStr查看,正常结构应为 {"listId":"xxx","email":"xxx","firstName":"xxx","lastName":"xxx"} - 读取StringContent内容验证:构造完content后可以读取其内容确认数据是否正确写入:
var sendContent = await content.ReadAsStringAsync(); // 输出sendContent即可确认实际要发送的内容 - 抓包验证:用Fiddler、Wireshark或浏览器开发者工具的网络面板,抓取实际发出的POST请求,查看请求体内容、
Content-Type请求头是否为application/json。
2. 实现API正常接收有效值的方案
提供两种可选方案,根据你的实际场景选择即可:
方案1:修改API接口(更符合REST规范,无需修改客户端代码)
直接用你定义的Report类作为API入参,加上[FromBody]特性,告知ASP.NET Core从请求体的JSON中解析参数:
[HttpPost] [Route("Create")] public async Task<IActionResult> Create([FromBody] Report formData) { // 直接通过formData.listId、formData.email等属性取值即可 }
方案2:修改客户端发送逻辑(无需修改现有API接口)
如果不能调整API定义,就把客户端发送的内容从JSON改成表单格式,适配API的参数绑定逻辑:
string apiurl = "http://localhost:5000/"; // 替换原来的StringContent为FormUrlEncodedContent var content = new FormUrlEncodedContent(new Dictionary<string, string> { {"listId", formData.listId}, {"email", formData.email}, {"firstName", formData.firstName}, {"lastName", formData.lastName} }); using (var httpClient = new HttpClient()) { using (var response = await httpClient.PostAsync($"{apiurl}api/Contact/Create", content)) { await response.Content.ReadAsStringAsync(); } }
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

