Asp.net Core 2.1中使用HttpClient发PATCH请求返回400错误如何解决
排查与解决步骤
1. 验证JsonPatch序列化格式合法性
标准JsonPatch请求体为数组结构,示例如下:
[ { "op": "replace", "path": "/name", "value": "修改后的名称" } ]
你可以先断点查看serializedDoc的输出内容,确认两个点:
- 是否为标准数组结构,没有多余的外层包裹对象
- 路径字段的大小写是否和后端接口要求匹配,如果后端要求驼峰命名,需要在序列化时添加驼峰配置,修改代码如下:
var serializedDoc = JsonConvert.SerializeObject(patchDoc, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() });
2. 修正请求头配置
你当前配置的Accept头为业务自定义媒体类型,部分API要求PATCH请求同时兼容json-patch的媒体类型,可修改Accept头配置:
// 先添加json-patch的可接受类型 _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json-patch+json")); // 再添加业务自定义的媒体类型 _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.yellowfin.api-v1.3+json"));
3. 校验授权头格式
你当前用逗号拼接多值授权头的方式不符合通用标准,多数服务端会直接拒绝这类格式错误的授权头并返回400,可先修改为标准的Bearer令牌格式测试:
_httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.SecurityToken);
4. 若你有权限访问后端接口,检查JsonPatch支持配置
ASP.NET Core 2.1默认不集成JsonPatch支持,需要手动配置:
- 安装
Microsoft.AspNetCore.JsonPatch、Microsoft.AspNetCore.Mvc.NewtonsoftJson两个NuGet包 - 在Startup.cs的ConfigureServices方法中添加NewtonsoftJson支持:
services.AddMvc() .AddNewtonsoftJson();
- 确认PATCH接口的参数配置正确:
[HttpPatch("api/orgs/{clientRefId}")] public IActionResult UpdateOrg(int clientRefId, [FromBody] JsonPatchDocument<ClientOrganisationRequestArgs> patchDoc) { // 业务逻辑 }
5. 排查Postman 500错误
Postman返回500说明请求已经到达服务端,但服务端处理时抛出运行时异常:
- 确认Postman请求头的Content-Type设置为
application/json-patch+json - 确认请求体为标准的JsonPatch数组格式,不要直接传修改后的业务对象JSON
- 查看服务端的异常日志,定位具体的空引用、类型不匹配等运行时错误
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

