222

我正在 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();
    }
}

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

这是我正在谈论的带有标题的 Postman(chrome 扩展)的图像: 在此处输入图像描述

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

4

7 回答 7

426

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

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

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

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

像这样使用它:

using (var requestMessage =
            new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
    requestMessage.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", your_token);
    
    await httpClient.SendAsync(requestMessage);
}
于 2016-11-20T18:00:14.403 回答
234

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

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

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

这是一个详细的SO答案

于 2015-04-22T14:50:17.590 回答
91

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

client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
于 2016-06-28T13:38:19.890 回答
9

有时,您只需要此代码。

 httpClient.DefaultRequestHeaders.Add("token", token);
于 2020-05-06T09:20:29.993 回答
8

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

  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")
于 2018-05-03T13:18:55.280 回答
6

您可以将所需的任何标题添加到HttpClient.

这是一个很好的教程

这不仅仅引用 POST 请求,您还可以将其用于 GET 请求。

于 2015-04-22T14:49:20.927 回答
0

这些天来,如果您使用 MS 依赖注入,强烈建议插入 IHttpClientFactory:

builder.Services.AddHttpClient("GitHub", httpClient =>
{
    httpClient.BaseAddress = new Uri("https://api.github.com/");

    // using Microsoft.Net.Http.Headers;
    // The GitHub API requires two headers.
    httpClient.DefaultRequestHeaders.Add(
        HeaderNames.Accept, "application/vnd.github.v3+json");
    httpClient.DefaultRequestHeaders.Add(
        HeaderNames.UserAgent, "HttpRequestsSample");
});

var httpClient = _httpClientFactory.CreateClient("GitHub");

通过这种方式,您可以避免将默认请求标头添加到全局共享的 httpclient,而且不必处理手动创建HttpRequestMessage.

来源: https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0#consumption-patterns

于 2022-02-25T12:47:22.153 回答