ChatGPT解决这个技术问题 Extra ChatGPT

将 Http 标头添加到 HttpClient

在向 Web 服务发送请求之前,我需要将 http 标头添加到 HttpClient。我如何为单个请求执行此操作(而不是在 HttpClient 上对所有将来的请求)?我不确定这是否可能。

var client = new HttpClient();
var task =
    client.GetAsync("http://www.someURI.com")
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();

M
Massimiliano Kraus

创建一个 HttpRequestMessage,将 Method 设置为 GET,设置您的标头,然后使用 SendAsync 而不是 GetAsync

var client = new HttpClient();
var request = new HttpRequestMessage() {
    RequestUri = new Uri("http://www.someURI.com"),
    Method = HttpMethod.Get,
};
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));
var task = client.SendAsync(request)
    .ContinueWith((taskwithmsg) =>
    {
        var response = taskwithmsg.Result;

        var jsonTask = response.Content.ReadAsAsync<JsonObject>();
        jsonTask.Wait();
        var jsonObject = jsonTask.Result;
    });
task.Wait();

谢谢,达雷尔!我对 HttpClient 很失望,直到我看到你可以做到这一点。
小心使用这种方法。我现在用它来检查一堆 url 是否仍然可用。他们中的许多人返回 406 错误纯粹是因为他们没有要返回的“text/plain” mediaType。
@Talon 这就是 406 的意思。客户端要求服务器不支持的媒体类型。如果你不在乎你得到什么媒体类型,那么不要要求一个。 OP 只是询问如何向请求添加标头。我只是随机选择了一个例子。
这些天您可能想要 var response = await client.SendAsync 而不是 ContinueWithtask.Wait()
请注意,为了获得最佳性能,您不应像这样实例化 HTTP 客户端。您可以在此处阅读有关此内容的更多信息stackoverflow.com/a/15708633/1406930
A
Aage

当它可以是所有请求的相同标头时,您可以在每个请求后处理客户端,您可以使用 DefaultRequestHeaders.Add 选项:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      

我相信这会将标头添加到该 HttpClient 发送的所有消息中。这与 OP 的观点相矛盾:“我如何为单个请求执行此操作(而不是在 HttpClient 上针对所有未来的请求)?” HttpClient 实例被设计为一次创建并多次使用。
要在请求上设置自定义标头,请使用自定义标头构建请求,然后将其传递给 httpclient 以发送到 http 服务器。在 httpclient 上设置默认标头以在每个请求上发送到服务器。
我以后如何更改此标头?如果我使用另一个 .Add("apikey","yyy"),它会变成 "apikey: xxxxxxxxxyyy"
你可以阅读标题和更新?
如果您使用“services.AddHttpClient”注入客户端,这是在现代 .NET Core/6+ 中使用它的正确方法
Z
Zimba

要在请求上设置自定义标头,请使用自定义标头构建请求,然后将其传递给 httpclient 以发送到 http 服务器。例如:

HttpClient client = HttpClients.custom().build();
HttpUriRequest request = RequestBuilder.get()
  .setUri(someURL)
  .setHeader(HttpHeaders.CONTENT_TYPE, "application/json")
  .build();
client.execute(request);

默认标头设置为 HTTPCLIENT 以在每个请求上发送到服务器。


问题是关于 C# HttpClient,你的代码听起来像 Java 的东西
该问题不要求 C# 解决方案。问题显示“在向 Web 服务发送请求之前,我需要将 http 标头添加到 HttpClient。我如何为单个请求执行此操作(而不是在 HttpClient 上对所有未来的请求)?我不确定是否这甚至是可能的。”我给出的解决方案是回答这个问题。如果您正在寻找某种语言的代码,您可能会找到 code converters userful
这不是真的:问题被标记为 C#asp.net-web-apidotnet-httpclient,因此 Java 语法在这里根本不相关。此外,在许多情况下,简单的代码转换器不适合特定于语言的 API:仅考虑 Java 和 C# HttpClient 版本,它们有很大的不同,转换可能会导致代码粗鲁且无法正常工作。