使用 httpClient.GetAsync 时添加报头 headers

我正在实现其他同事基于 Apiary.io 写的 API 接口,这是一个 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扩展)的图片,我正在谈论的标题: enter image description here

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

386149 次浏览

当在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);

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

如果你不想通过将其添加到DefaultRequestHeaders您可以为每个请求设置报头. xml实例中来设置HttpClient实例的头文件。

但是你必须使用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")

有时,您只需要这个代码。

 httpClient.DefaultRequestHeaders.Add("token", token);

现在,如果你正在使用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

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