HttpClient请求的自定义标头


140

如何在HttpClient请求中添加自定义标头?我正在使用PostAsJsonAsync发布JSON的方法。我需要添加的自定义标头是

"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;
}


@Liam:我的问题是如何添加自定义标题。凡为其他的问题是如何添加页眉
利宾约瑟夫

2
我认为已经发现我们不应该丢弃HttpClient。aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Don Rolling

Answers:


57
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\"" },
            },
        },
    },
};

38
答案非常混乱……为什么要引入文档,blank.pdf等代码?实例化bytearray类以在Content参数中传递自定义标头?
HEUG

2
@heug好。如果您正在寻找标题,则可以看到它。这里的内容是为了使图片完整,因为您很可能想在请求中添加一些内容。而且为了避免繁琐,内容很复杂,同时包含JSON和二进制数据。
阿努比斯

2
这样做似乎更直接:使用内容JSON创建StringContent,使用方法和URI创建HTTP消息,然后添加诸如message.Headers.Add(“ x”:“ y”)等标头。然后将其传递给响应变量,例如“ var response = await httpClient.SendAsync(message);”
heug

@heug我会记住这一点。谢谢!
阿努比斯

3
上面接受的答案中的哪一行实际上实现了OP请求的标头X版本?为什么这被认为是可接受的答案?
罗恩

215

我找到了我问题的答案。

client.DefaultRequestHeaders.Add("X-Version","1");

那应该在您的请求中添加一个自定义标头


50
不,不是的。应谨慎查看此答案,因为默认请求标头随每个请求一起发送。您应该像@Anubis建议的那样建立您的请求。创建HttpClient时应填充DefaultsRequestHeaders。
Ruhrpottpatriot

6
这仅起作用,因为您为每个请求实例化了一个新的HttpClient。这不是使用此类的方式:它应该是一个静态字段,可重用于所有请求,至少是对同一端点的请求。在那里查看文档和无数博客文章。然后,正如@Ruhrpottpatriot所指出的那样,更改默认标头将影响所有请求。
卡米尔克

@Ruhrpottpatriot为每个请求发送标头有什么问题?
David Klempfner '19

1
@ajbeaven不,那不是它的意思。页面顶部的示例显示了应用程序的Main方法,因此,即使处理了HttpClient,在应用程序的整个生命周期中也使用相同的实例,这对于文档中所说的内容是正确的再进一步:“ HttpClient旨在实例化一次,并在应用程序的整个生命周期内重复使用”。在本段之后是一个示例,建议向静态字段分配HttpClient。
kamilk

1
@kamilk,你说得没错-这个例子使我错了。感谢您说对了:)
ajbeaven '19

79

这是基于Anubis的答案(这是一种更好的方法,因为它不会为每个请求修改标头),但与原始问题中的代码等效:

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 xxxxxxxxxxxxxxxxxxxx" },
                { HttpRequestHeader.Accept.ToString(), "application/json" },
                { "X-Version", "1" }
            },
            Content = new StringContent(JsonConvert.SerializeObject(svm))
        };

    var response = client.SendAsync(httpRequestMessage).Result;

@RossPresser绝对不是。Content-Type是一个Content标头。
Panagiotis Kanavos

1
同意这是答案。它演示了如何添加OP请求的标头。也回答了我的问题。
罗恩

1
仅供参考,我认为HttpRequestHeader.Access应该是HttpRequestHeader.Accept
Mass Dot Net

svm是什么?
aswzen

@aswzen这是来自OP的问题-我猜是某种模型。被序列化的对象。
克里斯·孔雀

2

该类中有一个Headers属性HttpRequestMessage。您可以在此处添加自定义标头,该标头将随每个HTTP请求一起发送。的DefaultRequestHeadersHttpClient类,另一方面,设置为与每个请求一起发送报头使用该客户对象,因此得名发送默认请求头。

希望这使事情变得更清楚,至少对于将来看到这个答案的人来说。


1
不,没有使其更清晰。在这两种情况下,您都说要在每个请求上发送标头-那么有什么区别?
joedotnot

3
Headers是单个HttpRequestMessage对象的属性。因此,您可以创建具有不同标题的不同消息。 DefaultRequestHeadersHttpClient对象的属性;如果通过给定发送多个消息HttpClient,则所有此类消息都将DefaultRequestHeaders在消息的各个标头中添加相同的消息。
罗斯·Presser
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.