【问题标题】:how to add 'Content-Type' header in (HTTP GET) Rest request header collection using HttpClient?如何使用 HttpClient 在(HTTP GET)Rest 请求标头集合中添加“Content-Type”标头?
【发布时间】:2017-01-25 06:17:22
【问题描述】:

我正在使用 HttpClient 进行休息服务。有一次,当我尝试在 'Get' 请求标头中添加 "Content-Type" 时遇到问题。

我知道“Content-Type”适合在请求正文部分发送内容,但我需要发送带有请求头部分的“Content-Type”。

我还尝试从 HttpRequestHeaders 的无效标头列表中删除“Content-Type”标头

我找到链接How do you set the Content-Type header for an HttpClient request?

        Dim field = GetType(System.Net.Http.Headers.HttpRequestHeaders).GetField("invalidHeaders", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.[Static])

        If field IsNot Nothing Then
            Dim invalidFields = DirectCast(field.GetValue(Nothing), HashSet(Of String))
            invalidFields.Remove("Content-Type")
        End If

但我的问题没有解决我有异常

内部异常:

Message=必须使用适当的 属性或方法修改“content-type”标头。

   StackTrace:
        at System.Net.WebHeaderCollection.ThrowOnRestrictedHeader(String headerName)
        at System.Net.WebHeaderCollection.Add(String name, String value)
        at System.Net.Http.HttpClientHandler.SetRequestHeaders(HttpWebRequest webRequest, HttpRequestMessage request)
        at System.Net.Http.HttpClientHandler.CreateAndPrepareWebRequest(HttpRequestMessage request)
        at System.Net.Http.HttpClientHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   InnerException:

我发现 Postman 或 SoupUI 等一些工具允许这样做。

请帮我找到解决办法。

谢谢

【问题讨论】:

  • 那么您的要求是什么?您想在请求中添加 Content-Type 标头还是要删除它?您在添加时遇到任何问题吗?
  • stackoverflow.com/questions/29801195/… 关注这篇文章,了解使用httpClient调用GET API时如何在请求中添加header。
  • 它的有用链接,但实际问题是我想在标题中添加内容类型,如client.DefaultRequestHeaders.Add("Content-Type","apllication/json")
  • 它允许我添加 Accept 标头,但是当我尝试添加 Content-Type 时会引发以下异常:Misused header name。确保请求标头与 HttpRequestMessage 一起使用,响应标头与 HttpResponseMessage 一起使用,内容标头与 HttpContent 对象一起使用。
  • 似乎 HTTP 规则不允许为 GET 请求设置“Content-Type”。 stackoverflow.com/questions/26109650/…你能解释一下你的要求是什么迫使你将此标头添加到请求中吗?

标签: vb.net rest dotnet-httpclient webservices-client


【解决方案1】:

HttpWebRequest 可能会来救你。

private static string CallService(string url)
{
    WebRequest req = WebRequest.Create(url);
    req.Method = "GET";
    String json;
    req.ContentType = "application/json; charset=utf-8";
    var resp = req.GetResponse();
    using (varstream = resp.GetResponseStream())
    {
        var re = new StreamReader(stream);

            json = re.ReadToEnd();
        }

        return json; 
    }
}

可以从Getting the Response of a Asynchronous HttpWebRequest找到它的异步实现

【讨论】:

  • 它很有用但出于某些原因,例如 HttpClient 优于 WebRequest 的好处。所以我选择httpclient来实现。我希望你能理解,所以请给我另一个解决方案。
  • HttpClient 本身不支持此功能,除非您想破解它。这里解释了一个这样的黑客stackoverflow.com/questions/10679214/…
  • 我试过但是当我在 .Net 4 上使用 System.Net.Http (2.0.0.0) 但不能使用更新的受支持版本 System.Net.Http (2.2.29.0) 时,使用反射是可行的.Net 4
  • 感谢 Chetan 对我的疑问的所有回答,如果您有更多相同的信息,请在以后与我分享。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多