我正在实现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扩展)的图片,我正在谈论的标题:
如何将授权标头添加到请求中?
现在,如果你正在使用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
一个后来的答案,但因为没有人给出这个解决方案…
如果你不想通过将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")