我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?


我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?文章插图
作者 | 小码甲
来源 | Dotnet Plus(ID:nodotnet)
头图 | CSDN 下载自东方IC
最近在重构认证代码 , 认证过程相当常规:
POST /open-api/v1/user-info?client_idc.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));})...// 产生命名HttpClient , 发起请求var client = _clientFactory.CreateClient("platform");var response = await client.PostAsync($"open-api/v1/user-token/info?{req.AuthString}",new StringContent(req.ReqPayload.ToString,Encoding.UTF8) );平台日志显示 , 收到的请求 payload:
{\"token\":\"AA2917B0-C23D-40AB-A43A-4C4B61CC7C74\"}额 , 平台收到的 JSON 数据被转码了 , 没有识别出 JSON?
明眼人一看 , HttpClient 请求没有设置 Content-Type , 接收端没有识别出JSON 格式的 payload , 进行了转码 , 生成了错误签名 。
① Content-Type是一个Entity Header , 指示资源的mediaType, 可用在请求/响应中
② 代码中new StringContent(req.ReqPayload.ToString,Encoding.UTF8) 没有指定mediaType参数 , 故函数会使用text/plain默认值
当我尝试添加 Content-Type时(下面黄色背景行代码):
context.Services.AddHttpClient("platform", c =>{c.BaseAddress = new Uri("");c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT headerc.DefaultRequestHeaders.Add("content-type", "application/json");})此时抛出以下异常:
InvalidOperationException: Misused header name. Make sure request headers are used withHttpRequestMessage, response headers with HttpResponseMessage, andcontent headers with HttpContent objects.【我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?】纳尼 , HttpContent Headers 是啥?Chrome dev tools 显示只有两种Header 啊?
我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?文章插图
我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?文章插图
爬坑官方资料显示:HTTP Headers 被分为如下四类:
---信息举例.NET类型General Header可同时作用在请求/响应中 , 但是与传输数据无关Upgrade、Connection---Request Header将要获取的资源或客户端本身的信息Accept、AuthorizationHttpRequestHeadersResponse Header响应信息Location、ETagHttpResponseHeadersEntityHeader实体Body额外的信息Content-Length、ConnectionHttpContentHeadersContent-Type 属于 Entity Header 的一种 , 对应.NET 类型 HttpContent Header;
虽然Entity Header不是请求标头也不是响应标头 , 它们还是会包含在请求/响应标头术语中(此说法来自官方) 。
所以我们在 Chrome DevTools 没有看到 Entity Headers 分组, 却常在请求/响应标头中看到 Content-Type 标头 。
回到上面的异常 , .NET 严格区分四种标头 , 所以c.DefaultRequestHeaders.Add("content-type", "application/json")尝试将 content-type 添加到请求头 , 姿势不正确 , .NET 提示InvalidOperationException 。
我又踩坑了!如何为 HttpClient 请求设置 Content-Type 标头?文章插图
填坑给这个常规的 Post 请求设置正确的 Content-Type 标头 。