我正在实现Apiary的其他同事所做的API。io,在Windows商店应用程序项目。

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

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扩展)的图片,我正在谈论的标题:

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


当前回答

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

如果你不想通过将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);
}

其他回答

当在HttpClient中使用GetAsync时,你可以像这样添加授权头:

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

这确实在HttpClient的生命周期内添加了授权头,所以如果你正在访问一个授权头没有改变的站点,这是很有用的。

这里是一个详细的SO答案

接受的答案是可行的,但是当您想尝试添加Accept头时可能会变得复杂。这是我最后得到的。这对我来说似乎更简单,所以我想我将来会坚持这样做:

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

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

如果你不想通过将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);
}

根据新手的回答,你可以像这样使用“扩展”:

  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")

现在,如果你正在使用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://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-6.0#consumption-patterns