使用httpClient.GetAsync时添加标题


152

我正在Windows Store应用程序项目中实现由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();
    }
}

在这种方法和其他方法中,我需要具有一个标头,该标头带有我之前获得的令牌。

这是邮递员(chrome扩展名)的图片,其中包含我正在谈论的标题: 在此处输入图片说明

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



5
警告对于潜在的代码搜索者:这是对HttpClient的不正确使用!检查aspnetmonsters.com/2016/08/2016-08-27-httpclient错误
321X

Answers:


174

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

httpClient.DefaultRequestHeaders.Authorization 
                         = new AuthenticationHeaderValue("Bearer", "Your Oauth token");

这确实会在HttpClient的整个生命周期内添加授权标头,因此如果您访问的是授权标头未更改的站点,该功能将非常有用。

这是详细的答案


31
-1是因为HttpClient必须可重用(请参阅aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong)。如果必须可重用,则设置默认请求标头是一种不好的做法。
JCKödel

22
@JCKödel这是一个错误的假设。如果您在HttpClient的整个生命周期中始终使用相同的凭据调用同一站点,则可以避免使用DefaultRequestHeaders再次用相同的值连续设置它们。您应该重新阅读有关使用HttpClient的相同实例的文章,它不会发表有关默认请求标头的声明。如果我仅使用HTTP客户端调用一个站点,而实际上使用DefaultRequestHeaders确实会发生这种情况,则无需每次设置它们。
kmcnamee

@JCKödel,尽管您的假设不正确,但我赞成您的评论,因为您提出了重要的观点。答案更加清晰。
Najeeb

@kmcnamee,如果我需要传递两个令牌怎么办?
Najeeb

281

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

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

但是您将不得不使用该SendAsync()方法。

如果您想重用HttpClient -这是一个很好的做法,那么这是正确的解决方案

像这样使用它:

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

5
如果值频繁更改,似乎不使用DefaultRequestHeaders更安全。
詹森·罗

3
请注意,您很有可能需要requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);“ Bearer”是无效的HTTP标头
Chris Marisic

3
谢谢,我们重新使用了HttpClient,这对我们
有所

2
@JCKodel它会增加噪音,因为您没有必要使用它,using但可以在构造函数中实例化并放置在Dispose()
Philippe

3
我从未using在HttpClient上说过使用(这很不好),我在HttpRequesMessage上说过(因为它具有用于流式传输的非托管内存缓冲区,必须在使用后处置)。请求和响应是并且必须在每个请求时都进行处理(否则,您将长时间锁定大内存块)。在一定HttpClient程度上,它是可重用的。
JCKödel

70

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

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

添加基本​​授权标头的最简单方法
sandyiit


4

按照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;
        }
    }

并使用:

string _tokenUpdated = "TOKEN";
HttpClient _client;
_client.AddTokenToHeader(_tokenUpdated).GetAsync("/api/values")

-1

有时,您只需要此代码。

 httpClient.DefaultRequestHeaders.Add("token", token);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.