向.NET 6 Web API发送JSON时出现400(Bad Request)错误求助
错误原因及解决办法
核心错误原因
- 重复序列化JSON:在
button2_Click中已经将数据源序列化为JSON字符串table,但ApiSender.POSTData方法里又对这个字符串执行了一次JsonConvert.SerializeObject(json),导致最终发送的是被转义的字符串(比如原本的数组变成带双引号包裹的"[{...}]"),Web API无法将这种格式解析为LabData对象或数组。 - 接口参数不匹配:如果Web API的POST接口接收的是单个
LabData对象,但你实际发送的是List<LabData>数组,也会触发类型转换失败的400错误。
分步解决办法
1. 修复重复序列化问题
修改代码,避免两次序列化JSON:
- 调整
button2_Click方法,直接传递数据源对象(无需提前序列化):
private void button2_Click(object sender, EventArgs e) { var url = "https://localhost:7248/api/Lab"; var labDataList = LabResult.GetLabData(); dataGridView1.DataSource = labDataList; ApiSender apiSender = new ApiSender(); apiSender.POSTData(labDataList, url); }
- 修改
ApiSender.POSTData方法,仅对数据源对象序列化一次:
public bool POSTData(object data, string url) { using (var content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json")) { HttpResponseMessage result = _httpClient.PostAsync(url, content).Result; if (result.StatusCode == System.Net.HttpStatusCode.Created) return true; string returnValue = result.Content.ReadAsStringAsync().Result; throw new Exception($"Failed to POST data: ({result.StatusCode}): {returnValue}"); } }
2. 确保Web API接口参数匹配
检查Web API的POST接口,保证参数类型与发送的数据一致:
- 若发送的是
List<LabData>数组,接口需定义为接收集合类型:
[HttpPost] public IActionResult Post([FromBody] List<LabData> labDataList) { // 业务处理逻辑 return CreatedAtAction(nameof(Get), new { id = ... }, labDataList); }
- 若接口原本仅支持单个
LabData,要么修改接口支持批量接收,要么循环发送单个对象。
3. 验证最终发送的JSON格式
修复后,发送的JSON需为你提供的原始数组格式:
[{"SerialNumber":1,"LabParameterName":"abc","LabValue":7.80,"LabDate":"2001-11-16T10:10:00"},{"SerialNumber":2,"LabParameterName":"xyz","LabValue":10.00,"LabDate":"2001-11-16T10:10:00"},{"SerialNumber":3,"LabParameterName":"qq","LabValue":5.00,"LabDate":"2001-03-16T10:10:00"},{"SerialNumber":18,"LabParameterName":"cbc","LabValue":200.0,"LabDate":"2001-11-16T10:10:00"}]
可通过抓包工具确认格式是否正确,确保没有被额外转义。
内容的提问来源于stack exchange,提问作者saeef ahmed
相关产品推荐
相关产品推荐

