自定义 header 到 HttpClient 请求
Custom header to HttpClient request
如何将自定义 header 添加到 HttpClient
请求?我正在使用 PostAsJsonAsync
方法来 post JSON。我需要添加的自定义 header 是
"X-Version: 1"
这是我到目前为止所做的:
using (var client = new HttpClient()) {
client.BaseAddress = new Uri("https://api.clickatell.com/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "xxxxxxxxxxxxxxxxxxxx");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.PostAsJsonAsync("rest/message", svm).Result;
}
我找到了问题的答案。
client.DefaultRequestHeaders.Add("X-Version","1");
应该向您的请求添加自定义 header
var request = new HttpRequestMessage {
RequestUri = new Uri("[your request url string]"),
Method = HttpMethod.Post,
Headers = {
{ "X-Version", "1" } // HERE IS HOW TO ADD HEADERS,
{ HttpRequestHeader.Authorization.ToString(), "[your authorization token]" },
{ HttpRequestHeader.ContentType.ToString(), "multipart/mixed" },//use this content type if you want to send more than one content type
},
Content = new MultipartContent { // Just example of request sending multipart request
new ObjectContent<[YOUR JSON OBJECT TYPE]>(
new [YOUR JSON OBJECT TYPE INSTANCE](...){...},
new JsonMediaTypeFormatter(),
"application/json"), // this will add 'Content-Type' header for the first part of request
new ByteArrayContent([BINARY DATA]) {
Headers = { // this will add headers for the second part of request
{ "Content-Type", "application/Executable" },
{ "Content-Disposition", "form-data; filename=\"test.pdf\"" },
},
},
},
};
HttpRequestMessage
class里面有个Headers
属性。您可以在那里添加自定义 headers,它将随每个 HTTP 请求一起发送。另一方面,HttpClient
class 中的 DefaultRequestHeaders
设置 headers 与使用该客户端 object 发送的每个请求一起发送,因此名称为 默认请求Headers。
希望这能让事情变得更清楚,至少对于将来看到这个答案的人来说是这样。
这是一个基于 Anubis 的答案(这是一种更好的方法,因为它不会为每个请求修改 headers)但它更等同于原始问题中的代码:
using Newtonsoft.Json;
...
var client = new HttpClient();
var httpRequestMessage = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.clickatell.com/rest/message"),
Headers = {
{ HttpRequestHeader.Authorization.ToString(), "Bearer xxxxxxxxxxxxxxxxxxx" },
{ HttpRequestHeader.Accept.ToString(), "application/json" },
{ "X-Version", "1" }
},
Content = new StringContent(JsonConvert.SerializeObject(svm))
};
var response = client.SendAsync(httpRequestMessage).Result;
我在 HttpClient headers 中添加了 x-api-version,如下所示:
var client = new HttpClient(httpClientHandler)
{
BaseAddress = new Uri(callingUrl)
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("x-api-version", v2);
以防万一有人想知道如何调用 httpClient.GetStreamAsync() 没有重载需要 HttpRequestMessage 来提供自定义 headers 你可以使用@Anubis 给出的上述代码并调用
await response.Content.ReadAsStreamAsync()
如果您返回范围为 Header 的 blob url 作为 FileStreamResult
特别有用
我的两分钱。我同意 heug。接受的答案是令人费解的。让我们退一步。
默认 headers 适用于特定 HttpClient 发出的所有请求。因此,您将使用默认 headers 共享 headers.
_client.DefaultRequestHeaders.UserAgent.ParseAdd(_options.UserAgent);
但是,我们有时需要 header 特定于某个请求。因此,我们会在方法中使用类似这样的东西:
public static async Task<HttpResponseMessage> GetWithHeadersAsync(this
HttpClient httpClient, string requestUri, Dictionary<string, string> headers)
{
using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
{
foreach(var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
return await httpClient.SendAsync(request);
}
}
如果您只需要一个额外的 non-default header,您只需使用:
request.Headers.Add("X-Version","1")
如何将自定义 header 添加到 HttpClient
请求?我正在使用 PostAsJsonAsync
方法来 post JSON。我需要添加的自定义 header 是
"X-Version: 1"
这是我到目前为止所做的:
using (var client = new HttpClient()) {
client.BaseAddress = new Uri("https://api.clickatell.com/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "xxxxxxxxxxxxxxxxxxxx");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.PostAsJsonAsync("rest/message", svm).Result;
}
我找到了问题的答案。
client.DefaultRequestHeaders.Add("X-Version","1");
应该向您的请求添加自定义 header
var request = new HttpRequestMessage {
RequestUri = new Uri("[your request url string]"),
Method = HttpMethod.Post,
Headers = {
{ "X-Version", "1" } // HERE IS HOW TO ADD HEADERS,
{ HttpRequestHeader.Authorization.ToString(), "[your authorization token]" },
{ HttpRequestHeader.ContentType.ToString(), "multipart/mixed" },//use this content type if you want to send more than one content type
},
Content = new MultipartContent { // Just example of request sending multipart request
new ObjectContent<[YOUR JSON OBJECT TYPE]>(
new [YOUR JSON OBJECT TYPE INSTANCE](...){...},
new JsonMediaTypeFormatter(),
"application/json"), // this will add 'Content-Type' header for the first part of request
new ByteArrayContent([BINARY DATA]) {
Headers = { // this will add headers for the second part of request
{ "Content-Type", "application/Executable" },
{ "Content-Disposition", "form-data; filename=\"test.pdf\"" },
},
},
},
};
HttpRequestMessage
class里面有个Headers
属性。您可以在那里添加自定义 headers,它将随每个 HTTP 请求一起发送。另一方面,HttpClient
class 中的 DefaultRequestHeaders
设置 headers 与使用该客户端 object 发送的每个请求一起发送,因此名称为 默认请求Headers。
希望这能让事情变得更清楚,至少对于将来看到这个答案的人来说是这样。
这是一个基于 Anubis 的答案(这是一种更好的方法,因为它不会为每个请求修改 headers)但它更等同于原始问题中的代码:
using Newtonsoft.Json;
...
var client = new HttpClient();
var httpRequestMessage = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.clickatell.com/rest/message"),
Headers = {
{ HttpRequestHeader.Authorization.ToString(), "Bearer xxxxxxxxxxxxxxxxxxx" },
{ HttpRequestHeader.Accept.ToString(), "application/json" },
{ "X-Version", "1" }
},
Content = new StringContent(JsonConvert.SerializeObject(svm))
};
var response = client.SendAsync(httpRequestMessage).Result;
我在 HttpClient headers 中添加了 x-api-version,如下所示:
var client = new HttpClient(httpClientHandler)
{
BaseAddress = new Uri(callingUrl)
};
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("x-api-version", v2);
以防万一有人想知道如何调用 httpClient.GetStreamAsync() 没有重载需要 HttpRequestMessage 来提供自定义 headers 你可以使用@Anubis 给出的上述代码并调用
await response.Content.ReadAsStreamAsync()
如果您返回范围为 Header 的 blob url 作为 FileStreamResult
特别有用我的两分钱。我同意 heug。接受的答案是令人费解的。让我们退一步。
默认 headers 适用于特定 HttpClient 发出的所有请求。因此,您将使用默认 headers 共享 headers.
_client.DefaultRequestHeaders.UserAgent.ParseAdd(_options.UserAgent);
但是,我们有时需要 header 特定于某个请求。因此,我们会在方法中使用类似这样的东西:
public static async Task<HttpResponseMessage> GetWithHeadersAsync(this
HttpClient httpClient, string requestUri, Dictionary<string, string> headers)
{
using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
{
foreach(var header in headers)
{
request.Headers.Add(header.Key, header.Value);
}
return await httpClient.SendAsync(request);
}
}
如果您只需要一个额外的 non-default header,您只需使用:
request.Headers.Add("X-Version","1")