使用 httpClient.GetAsync 时添加 headers
Adding headers when using httpClient.GetAsync
我正在 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();
}
}
在这个和其他一些方法中,我需要一个 header 和我之前得到的令牌。
这是一张 Postman(chrome 扩展名)的图片,我说的是 header:
如何将授权 header 添加到请求中?
您可以将任何 headers 添加到 HttpClient
。
这是一个很好的tutorial。
这不只是引用 POST-requests,您还可以将其用于 GET-requests。
将 GetAsync 与 HttpClient 一起使用时,您可以像这样添加授权 header:
httpClient.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer", "Your Oauth token");
这确实为 HttpClient 的生命周期添加了授权 header,因此如果您访问一个授权 header 不变的站点,这将非常有用。
这是一个详细的 SOanswer
已接受的答案有效,但当我想尝试添加接受时可能会变得复杂 headers。这就是我最终得到的。这对我来说似乎更简单,所以我想我以后会坚持使用它:
client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
后来的回答,但是因为没有人给出这个解决方案...
如果您不想通过将 HttpClient
实例添加到 DefaultRequestHeaders
来设置 header, 您可以设置 header s 每个请求.
但您将不得不使用SendAsync()
方法。
如果您想重用 HttpClient
,这是正确的解决方案 ——这是
的一个好习惯
- performance and port exhaustion problems
- 做某事thread-safe
- 不是每次都发送相同的 headers
这样使用:
using (var requestMessage =
new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", your_token);
await httpClient.SendAsync(requestMessage);
}
根据 greenhoorn 的回答,您可以像这样使用 "Extensions":
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");
这样您就可以避免将默认请求 headers 添加到全局共享的 httpclient,而且不必手动创建 HttpRequestMessage
.
我正在 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();
}
}
在这个和其他一些方法中,我需要一个 header 和我之前得到的令牌。
这是一张 Postman(chrome 扩展名)的图片,我说的是 header:
如何将授权 header 添加到请求中?
您可以将任何 headers 添加到 HttpClient
。
这是一个很好的tutorial。
这不只是引用 POST-requests,您还可以将其用于 GET-requests。
将 GetAsync 与 HttpClient 一起使用时,您可以像这样添加授权 header:
httpClient.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer", "Your Oauth token");
这确实为 HttpClient 的生命周期添加了授权 header,因此如果您访问一个授权 header 不变的站点,这将非常有用。
这是一个详细的 SOanswer
已接受的答案有效,但当我想尝试添加接受时可能会变得复杂 headers。这就是我最终得到的。这对我来说似乎更简单,所以我想我以后会坚持使用它:
client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
后来的回答,但是因为没有人给出这个解决方案...
如果您不想通过将 HttpClient
实例添加到 DefaultRequestHeaders
来设置 header, 您可以设置 header s 每个请求.
但您将不得不使用SendAsync()
方法。
如果您想重用 HttpClient
,这是正确的解决方案 ——这是
- performance and port exhaustion problems
- 做某事thread-safe
- 不是每次都发送相同的 headers
这样使用:
using (var requestMessage =
new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", your_token);
await httpClient.SendAsync(requestMessage);
}
根据 greenhoorn 的回答,您可以像这样使用 "Extensions":
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");
这样您就可以避免将默认请求 headers 添加到全局共享的 httpclient,而且不必手动创建 HttpRequestMessage
.