首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >我又踩坑了!如何为HttpClient请求设置Content-Type标头?

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

作者头像
有态度的马甲
发布于 2020-10-10 06:28:37
发布于 2020-10-10 06:28:37
9K20
代码可运行
举报
文章被收录于专栏:精益码农精益码农
运行总次数:0
代码可运行

最近在重构认证代码,认证过程相当常规:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
POST   /open-api/v1/user-info?client_id&timstamp&rd=12345&sign=***&method=hmac
content-type: application/json
payload: { "token":"AA2917B0-C23D-40AB-A43A-4C4B61CC7C74"}

平台显示 :签名校验失败, 排查到平台收到的Post Payload并非预期,阅读本文,解锁正确使用Content-Type标头的姿势。

1. 入坑

下面是构造HttpClient对象、发起请求的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 初始化HttpClientFactory
context.Services.AddHttpClient("platform", c =>
{
    c.BaseAddress = new Uri("https://alpha-engage.demohost.com/");
    c.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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{\"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时(下面黄色背景行代码):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
context.Services.AddHttpClient("platform", c =>
{
    c.BaseAddress = new Uri("https://alpha-engage.demohost.com/");
    c.DefaultRequestHeaders.Accept
         .Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header
    c.DefaultRequestHeaders.Add("content-type", "application/json");
})

此时抛出以下异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
InvalidOperationException: Misused header name. Make sure request headers are used with
HttpRequestMessage, response headers with HttpResponseMessage, and
content headers with HttpContent objects. 

纳尼,HttpContent Headers是啥?Chrome dev tools显示只有两种Header啊?

2. 爬坑

官方资料显示:HTTP Headers被分为如下四类:

---

信息

举例

.NET类型

General Header

可同时作用在请求/响应中,但是与传输数据无关

Upgrade、Connection

---

Request Header

将要获取的资源或客户端本身的信息

Accept、Authorization

HttpRequestHeaders

Response Header

响应信息

Location、ETag

HttpResponseHeaders

EntityHeader

实体Body额外的信息

Content-Length、Connection

HttpContentHeaders

Content-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。

3. 填坑

给这个常规的Post请求设置正确的Content-Type标头。

方法① 对HttpRequestMessage对象Content属性添加Header

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 using (var request = new HttpRequestMessage())
{
     request.Method = new HttpMethod(method);
     request.RequestUri = new Uri(url);
     request.Content = new StringContent(payload);
     request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
     var response = await _httpClient.SendAsync(request);
     return response;
}

使用HttpClient.SendAsync(request)

方法② 写入HttpContent时传入媒体类型

StringContent某个重载构造函数 : 参数3 可直接设置media type

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var response = await client.PostAsync($"open-api/v1/user-token/info?{req.AuthString()}",new StringContent(req.ReqPayload.ToString(),Encoding.UTF8,"application/json") );

4.干货旁白

  1. 小编对于Http协议有知识漏洞,搬砖时一直关注Chrome DevTools,忽略了还有Entity Header一说。
  2. Content-Type 这个实体标头,会出现了请求/响应标头,指示资源的媒体类型。
  3. .NTE针对4种HTTP Header强化了区别,在实际开发中要区别使用。
  • https://tools.ietf.org/html/rfc2616#page-41
  • https://developer.mozilla.org/en-US/docs/Glossary/Entity_header
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
https://cloud.tencent.com/act/group/amdv2/detail?from=10822&group=65734 最新拼团地址 6/14
https://cloud.tencent.com/act/group/amdv2/detail?from=10822&group=65734 最新拼团地址 6/14
回复回复点赞举报
在不在 我用你的链接参团失败
在不在 我用你的链接参团失败
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
腾讯云AMD拼团 2019.3
老用户(团长):购买过本活动拼团AMD服务器且产品在有效期内的个人用户,每人限购1次
用户3995581
2019/04/08
7.5K6
AMD 1核1C 2M 拼团来 有小伙伴一起来吗
老用户(团长):购买过本活动拼团AMD服务器且产品在有效期内的个人用户,每人限购1次
用户3586228
2019/06/02
1.4K0
AMD 1核1C 2M 拼团来 有小伙伴一起来吗
抓紧上车:腾讯云服务器拼团8元每月(11.08发起)
腾讯云服务器拼团8元每月 点击链接参团:https://cloud.tencent.com/act/group/amd/detail?group=56129 活动规则 活动时间 2018.10.22-
用户3831281
2018/11/08
5.2K4
抓紧上车:腾讯云服务器拼团8元每月(11.08发起)
腾讯云新车,有没有小伙伴一起
https://cloud.tencent.com/act/group/amd/detail?from=10137&group=52767&create=0 一、活动时间2018.9.19-2018.
用户3603364
2018/10/16
2.3K2
AMD服务器拼团活动
云服务器 1核1G 1M带宽 50G系统盘 8元/月 链接: https://cloud.tencent.com/act/group/amd/detail?group=54301 ☆本次活动云
用户3692078
2018/10/24
10.6K2
2019. 4 腾讯云AMD拼团
活动马上结束 https://cloud.tencent.com/act/group/amdv2/detail?from=10521&group=64752 链接有效只有24小时 如果过期了 留言
用户3995581
2019/04/09
5.6K3
腾讯云双11最强优惠攻略详解 || 上云拼团Go
> 每逢双11,各家云服务商都会推出一系列优惠活动,对于个人开发者、企业用户来说,这也正是一年中最适合入手云服务产品的最佳时机。下面给大家准备了一份 腾讯云双11优惠攻略详解,带你了解最实惠的购买方案,省钱薅羊毛,轻松上云。
在人间负债^
2024/11/18
4.6K0
腾讯云双十一重磅优惠来袭,带你掌握最强攻略密码
在当今数字化飞速发展的时代,云服务器已经成为了众多企业和开发者的得力助手,特别是人工智能的发展,为云计算平台带来了更为智能的数据处理与分析能力。云服务器将能够更好地支持人工智能模型的训练和部署,为各行各业的智能化转型提供更强大的技术支持,云服务器的强大之处远不止于此。
2的n次方
2024/11/11
9.3K0
腾讯云双十一重磅优惠来袭,带你掌握最强攻略密码
腾讯云双十一拼团:上云抢购云服务器的超值攻略
腾讯云凭借其卓越的技术实力和广泛的服务范围,已成为众多企业和开发者的首选云服务平台。为了回馈用户的信任与支持,腾讯云特别推出了双十一拼团活动,提供上百款折扣商品和低门槛拼团机制,让每位用户都能以超值的价格享受高质量的云服务。活动期间,丰富的奖励机制和高性价比的云产品将进一步助力业务的快速发展。
江湖有缘
2024/11/17
4.2K0
腾讯云双十一拼团:上云抢购云服务器的超值攻略
腾讯云双11羊毛攻略大揭秘:最强优惠全解析
双11不仅仅是电商购物的节日,也是云服务商们推出优惠的最佳时机。今年,腾讯云也不例外,提前启动了双11活动,优惠力度空前,特别适合个人用户和企业用户上云。本文将详细介绍腾讯云双11的优惠活动,帮助大家更好地享受腾讯云的福利。
可知春风过
2024/11/08
5.7K0
腾讯云双11羊毛攻略大揭秘:最强优惠全解析
腾讯云重庆云服务器拼团 1 核/1G 内存/1M 带宽/8 元/月
腾讯云今年在重庆和成都地区新开通了业务,为大西南上云提供了绝好的本地条件。为了普及云服务产品,腾讯云开通了重庆云服务器拼团活动,1 核 1G 内存 1M 带宽 50GB 云盘,通过下面的团购链接购买仅需 8 元/月。下面魏艾斯博客介绍一下详细情况。
魏艾斯博客www.vpsss.net
2018/09/29
12.7K1
腾讯云重庆云服务器拼团 1 核/1G 内存/1M 带宽/8 元/月
AMD 1G内存1M带宽50G盘 服务器拼团活动
云服务器 1核1G 1M带宽 50G系统盘 8元/月 链接: https://cloud.tencent.com/act/group/amd/detail?group=54487 买3个月送1
用户3666965
2018/10/25
4K0
AMD 1G内存1M带宽50G盘 服务器拼团活动
云服务选择攻略手册 | 带你玩转腾讯云双十一“云上拼团”,直击底价狂欢
而腾讯云一直是国内最大的云服务厂商之一,为我们提供了各种各样的云服务资源。而今年的双十一也是马上要到了,为了然更多开发者体验上便捷的云服务,腾讯云今年的双十一也是对各种云服务资源其中包括云服务器、云数据库、COS、CDN,为各位准备了重磅福利直击底价狂欢!
鸽芷咕
2024/11/10
1.6K1
云服务选择攻略手册 | 带你玩转腾讯云双十一“云上拼团”,直击底价狂欢
腾讯云双十一上云拼团Go详细攻略
一年一度的腾讯云双十一活动来袭啦!!!!!!腾讯云再次推出超级优惠活动,为企业和开发者提供更具竞争力的云服务解决方案。无论是新用户还是老用户,大家都能享受到前所未有的折扣和特惠,助力数字化转型与业务增长。
堕落飞鸟
2024/11/04
3.1K3
腾讯云双十一上云拼团Go详细攻略
云+校园学生服务器政策解读
现在云服务商对学生都是很优惠的,腾讯云也推出了9.9元购买云服务器的优惠活动,是一款固定的优惠套餐,包含特价云服务器、域名(加钱可选)、免费对象存储空间(6个月),但是好多用户却不知道在哪里申请,需要什么条件,流程是怎么样的,下面给大家做个介绍:
JunyouYH
2019/10/23
10.4K0
【上云拼团Go】如何在腾讯云双十一活动中省钱
双十一已经成为了全球最大的购物狂欢节,除了电商平台的优惠,云计算服务商也纷纷在这个期间推出了诱人的促销活动。腾讯云作为中国云计算的领军企业之一,每年双十一的活动都吸引了大量开发者、企业和个人用户参与。那么,在腾讯云双十一活动中,什么该买,什么不该买?如何最大化地节省开支?接下来,我将分享一些隐藏的省钱攻略,助你在这个双十一获取更多的优惠。
辭七七
2024/11/08
3.4K0
【上云拼团Go】如何在腾讯云双十一活动中省钱
腾讯云学生优惠套餐-腾讯云学生服务器优惠券
腾讯云学生优惠服务器一个月只需要10元,一年需要114元。如果学生优惠价格有变动,以腾讯云官网为准。
好好的生活吧
2019/04/11
71K1
腾讯云学生优惠套餐-腾讯云学生服务器优惠券
腾讯云双11最强优惠攻略详解
1.云服务发展趋势 近年来,随着云服务器技术的快速发展,越来越多的个人和企业开始意识到云服务器的价值和优势。云服务器通过提供灵活的计算和存储资源,为用户提供了
Token_w
2024/11/08
4.9K0
腾讯云双11最强优惠攻略详解
最强攻略密码 | 腾讯云双十一活动爆款直击底价
双十一已成为全球范围内最盛大的购物节,不仅电商平台提供各种折扣优惠,云计算服务商也趁此机会推出极具吸引力的促销活动。
空白诗
2024/11/11
4.3K0
最强攻略密码 | 腾讯云双十一活动爆款直击底价
【最强攻略】腾讯云双十一最强攻略密码
每年双十一的电商大战已经从传统的购物狂欢扩展到云服务行业,而腾讯云作为国内领先的云服务提供商,也在这个节点推出了众多优惠活动。作为企业和个人用户,如何在这场活动中找到最合适的云产品,并以最低的成本获取最高的价值?以下就是腾讯云双十一活动的最强攻略,让你不再迷茫,轻松应对各种优惠。
小羊失眠啦.
2024/11/14
5.5K0
【最强攻略】腾讯云双十一最强攻略密码
推荐阅读
相关推荐
腾讯云AMD拼团 2019.3
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入[游戏服务器] 腾讯云官方交流站
游戏服运维小技巧 常见问题齐排查
加入[跨境业务] 腾讯云官方方案交流站
共享跨境方案指南 洞察行业动向
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验