自定义标头到Httpclient请求

Lib*_*eph 116 c# asp.net http-headers dotnet-httpclient

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

"X-Version: 1"
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所做的:

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;
}
Run Code Online (Sandbox Code Playgroud)

Lib*_*eph 172

我找到了问题的答案.

client.DefaultRequestHeaders.Add("X-Version","1");
Run Code Online (Sandbox Code Playgroud)

这应该为您的请求添加自定义标头

  • 不,不是的.应该谨慎查看此答案,因为默认请求标头随每个请求一起发送.您应该像@Anubis建议的那样构建您的请求.创建HttpClient时,应填充DefaultsRequestHeaders. (38认同)
  • 这只能起作用,因为您要为每个请求实例化一个新的HttpClient.这不是应该使用此类的方式:它应该是一个静态字段,重用于所有请求,至少是同一端点的那些请求.请参阅文档和无数博客文章.然后,当然,正如@Ruhrpottpatriot指出的那样,更改默认标头将影响所有请求. (5认同)
  • @ajbeaven 不,这不是它所说的。页面顶部的示例显示了应用程序的 Main 方法,因此即使 HttpClient 已被处理,在应用程序的整个生命周期中仍会使用相同的实例,这对于文档所说的内容是正确的再往下一点:_'HttpClient 旨在实例化一次并在应用程序的整个生命周期中重复使用'_。本段后面是一个建议将 HttpClient 分配给静态字段的示例。 (2认同)
  • 如果您使用“HttpClientFactory”实例化 httpclient,可以使用这个答案吗? (2认同)

Chr*_*ock 56

以下是基于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;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最常见的答案。 (4认同)
  • 同意这是答案。它演示了如何添加 OP 请求的标头。也回答了我的问题。 (3认同)

Anu*_*bis 45

var request = new HttpRequestMessage {
    RequestUri = new Uri(EnvironmentSetup.BaseAddress + "Folder"),
    Method = HttpMethod.Post,
    Headers = {
        { "X-Version", "1" },
        { HttpRequestHeader.Authorization.ToString(), "Basic " + EnvironmentSetup.GetAuthToken() },
        { HttpRequestHeader.ContentType.ToString(), "multipart/mixed" },
    },
    Content = new MultipartContent {
        new ObjectContent<FolderWithDocuments>(new FolderWithDocuments {
            Status = FolderStatus.Draft,
            Users = new List<User> { EnvironmentSetup.User1, EnvironmentSetup.User2 },
        }, new JsonMediaTypeFormatter(), "application/json"),
        new ByteArrayContent(ResourceHelper.ReadResourceToByteArray("blank.pdf")) {
            Headers = {
                { "Content-Type", "application/Executable" },
                { "Content-Disposition", "form-data; filename=\"test.pdf\"" },
            },
        },
    },
};
Run Code Online (Sandbox Code Playgroud)

  • 答案非常令人困惑...你为什么要带来文件代码,blank.pdf等?实例化bytearray类以在Content param中传递自定义标头? (22认同)
  • 上面接受的答案中的哪一行实际上实现了 OP 请求的标题,X-Version?为什么这被认为是公认的答案? (7认同)
  • @heug 好吧。如果您正在寻找标题,您可以看到它。此处显示内容是为了完成图片,因为您很可能希望向您的请求添加一些内容。为了不乏味,内容很复杂,同时包含 JSON 和二进制数据。 (2认同)
  • 这样做似乎更直接:使用内容JSON创建StringContent,使用方法和URI创建HTTP消息,然后添加诸如message.Headers.Add(“ x”:“ y”)等标头。然后将其传递给响应变量,例如“ var response = await httpClient.SendAsync(message);” (2认同)
  • 我发现这个答案非常有帮助,感谢您提供额外的示例。 (2认同)

小智 8

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

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

  • `Headers` 是单个 `HttpRequestMessage` 对象的属性。因此,您可以创建具有不同标题的不同消息。`DefaultRequestHeaders` 是 `HttpClient` 对象的一个​​属性;如果通过给定的 `HttpClient` 发送多条消息,则所有此类消息都将具有相同的 `DefaultRequestHeaders` 添加到消息的各个标头中。 (7认同)
  • 不,并没有使它变得更清楚。在这两种情况下,您都说您在每个请求上发送标头 - 那么有什么区别呢? (2认同)