如何添加“Content-Type = application/json;v=2.0”,包括使用 HttpClient 进行版本控制?
Posted
技术标签:
【中文标题】如何添加“Content-Type = application/json;v=2.0”,包括使用 HttpClient 进行版本控制?【英文标题】:How to add "Content-Type = application/json;v=2.0" including versioning with HttpClient? 【发布时间】:2019-09-05 04:51:41 【问题描述】:很抱歉这样问这个问题。我可以给你一种我希望你为我编写代码的感觉。我已经花了一天时间编写代码以发送包含带有版本控制的标头的 http 请求:
对于版本控制,我使用来自 Microsoft/aspnet-api-versioning 项目的 versioning by Media Type。
我的 API 部分工作正常,我可以通过 Postman 请求正确的版本:
您看到“Content-Type = application/json;v=2.0”这一行了吗?在邮递员上没问题。使用 C# 中的 HttpClient 是不可能的。
让我在这里复制所有我尝试过的错误解决方案。每次尝试新解决方案时,我都会编辑此问题。方便起见,但为了更清楚,我将复制粘贴图像:
解决方案 1: 带有 new Content = ... 的扩展方法
解决方案 1B: 来自初学者Tejas
解决方案 1C: 来自 BeginnerTejas,但现在使用 MediaTypeWithQualityHeaderValue
解决方案 2: 带有 request.Headers.Add(...) 的扩展方法
解决方案 3: BaseProxy 与 Client.DefaultRequestHeaders.TryAddWithoutValidation(...) 看来我无法添加任何“Content-Type”
解决方案 4: BaseProxy 与 Client.DefaultRequestHeaders.Accept.Add(...)
解决方案 5: request.Headers.TryAddWithoutValidation("Content-Type", "application/json");
【问题讨论】:
你试过ApiVersion属性吗? ApiVersion 属性用于服务器端。是的,我所有的 API 都使用 [ControllerName("Client")] 然后 [ApiVersion("2.0")] 类似的设置。同样,服务器工作正常。我可以从 Postman 发送我的所有请求。问题是如何使用 HttpClient 添加标头? 有什么解决办法吗? 【参考方案1】:你可以试试这个吗?
request.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue( "application/json" )
Parameters = new NameValueHeaderValue( "v", "2.0" )
;
【讨论】:
System.NullReferenceException: '对象引用未设置为对象的实例。'根据要求。内容。我可以解决这个问题,但我认为这是我的解决方案 1. 已经过测试。如果您发现任何差异,您可以交叉检查吗? 您在解决方案 2 中添加此代码的方法正确吗? 实际上是解决方案 1。【参考方案2】:当您不发送任何内容时,您不能(或至少不应该)使用Content-Type
。对GET
和DELETE
请求使用Accept
标头,如下所示:
request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse("application/json; v=2.0"));
如果两个标头都指定了Content-Type
,则在Accept
之前考虑。如果Accept
为一个版本指定了多种媒体类型,则匹配具有最高质量 的媒体类型。不支持每个请求混合版本(例如发送 2.0,但接收 1.0)。目前也不支持使用版本协商多种媒体类型(除了质量)。
【讨论】:
以上是关于如何添加“Content-Type = application/json;v=2.0”,包括使用 HttpClient 进行版本控制?的主要内容,如果未能解决你的问题,请参考以下文章