使用httpClient.GetAsync时添加标头

Ric*_*Ric 117 c# windows-runtime dotnet-httpclient windows-store-apps apiary.io

我在Windows商店应用程序项目中实现了其他同事与Apiary.io的api.

他们展示了我必须实现的方法的这个例子

var baseAddress = new Uri("https://private-a8014-xxxxxx.apiary-mock.com/");

using (var httpClient = new HttpClient{ BaseAddress = baseAddress })
{
    using (var response = await httpClient.GetAsync("user/list{?organizationId}"))
    {
        string responseData = await response.Content.ReadAsStringAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

在这个和其他一些方法中,我需要一个带有我之前获得的标记的标题

下面是一个邮递员(镀铬扩展)的图像,标题我正在谈论 在此输入图像描述

如何将该授权标头添加到请求中?

Phi*_*ppe 232

后来的答案,但因为没有人给出这个解决方案......

如果您不想通过将HttpClient实例添加到HttpClient实例来设置标头HttpClient,则可以为每个请求设置标头.

但是你将不得不使用这种DefaultRequestHeaders方法.

这是正确的解决方案,如果你想重用httpclient - 这是性能和端口耗尽问题的一个很好的做法- 并做一些线程安全的事情,而不是每次都发送相同的标题 ...

像这样使用它:

using (var requestMessage =
            new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
    requestMessage.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", your_token);
    httpClient.SendAsync(requestMessage);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果值频繁更改,似乎不使用DefaultRequestHeaders更安全。 (4认同)
  • 请注意,您很可能需要`requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer",your_token);`"Bearer"将是无效的HTTP标头 (3认同)
  • 多亏了这一点,我们正在重用我们的HttpClient,这对我们有所帮助 (3认同)
  • 我从来没有说过在HttpClient上使用`using`(这很糟糕),我在HttpRequesMessage上说过(因为它有非托管内存缓冲区用于流式传输,必须在使用后处理).请求和响应是并且必须在每个请求中处理(否则您将长时间锁定大内存块).`HttpClient`可以重复使用. (3认同)
  • @JCKodel会增加噪音,因为您不必强制使用using,但是可以在构造函数中实例化并在Dispose()中进行处置。 (2认同)
  • 最好是每个 api/server 有 1 个 httpClient 来查询并保持尽可能长的时间。大多数情况下,这与使用 `using` 不兼容。静态可能很好(至少比多个实例更好),但更好的是使用依赖注入。在整个应用程序生命周期中保留一个实例是好的。 (2认同)

kmc*_*mee 135

将GetAsync与HttpClient一起使用时,您可以像这样添加授权标头:

httpClient.DefaultRequestHeaders.Authorization 
                         = new AuthenticationHeaderValue("Bearer", "Your Oauth token");
Run Code Online (Sandbox Code Playgroud)

这确实为HttpClient的生命周期添加了授权标头,因此如果您访问授权标头未更改的一个站点,这将非常有用.

这是一个详细的SO 答案

  • -1因为HttpClient必须可重用(请参阅https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/).如果必须可重用,则设置默认请求标头是一种不好的做法. (20认同)
  • @JCKödel这是一个错误的假设.如果您始终使用DefaultRequestHeaders在HttpClient的生命周期内使用相同的凭据调用同一站点,则无需使用相同的值再次连续设置它们.您应该重新阅读它讨论使用HttpClient的相同实例的那篇文章,它没有声明默认请求标头是不好的做法.如果我只使用HTTP客户端调用一个站点,实际上使用DefaultRequestHeaders确实会发生这种情况,这使您不必每次都设置它们. (14认同)
  • @JCKödel,虽然你的假设是不正确的,但我对你的评论投了赞成票,因为你提出了一个重要的观点。使答案更加清晰。 (3认同)

sir*_*ank 49

接受的答案有效但当我想尝试添加Accept标头时可能会变得复杂.这就是我最终的结果.这对我来说似乎更简单,所以我想我将来会坚持下去:

client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
Run Code Online (Sandbox Code Playgroud)

  • @akash-limbani 如果您重复使用同一客户端,请在尝试添加之前进行检查。``` if (!client.DefaultRequestHeaders.Contains("授权")) { client.DefaultRequestHeaders.Add("授权", "基本" + authstring); } ``` (2认同)

gre*_*orn 8

您可以添加所需的任何标头HttpClient.

这是一个很好的教程.

这不只是引用POST请求,您也可以将它用于GET请求.


小智 7

按照greenhoorn的回答,您可以像这样使用“扩展”:

  public static class HttpClientExtensions
    {
        public static HttpClient AddTokenToHeader(this HttpClient cl, string token)
        {
            //int timeoutSec = 90;
            //cl.Timeout = new TimeSpan(0, 0, timeoutSec);
            string contentType = "application/json";
            cl.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contentType));
            cl.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", token));
            var userAgent = "d-fens HttpClient";
            cl.DefaultRequestHeaders.Add("User-Agent", userAgent);
            return cl;
        }
    }
Run Code Online (Sandbox Code Playgroud)

并使用:

string _tokenUpdated = "TOKEN";
HttpClient _client;
_client.AddTokenToHeader(_tokenUpdated).GetAsync("/api/values")
Run Code Online (Sandbox Code Playgroud)


小智 7

有时,您只需要此代码。

 httpClient.DefaultRequestHeaders.Add("token", token);
Run Code Online (Sandbox Code Playgroud)