【问题标题】:Adding Http Headers to HttpClient将 Http 标头添加到 HttpClient
【发布时间】:2012-08-14 21:58:49
【问题描述】:

在向 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();

【问题讨论】:

    标签: c# asp.net-web-api dotnet-httpclient


    【解决方案1】:

    创建一个HttpRequestMessage,将方法设置为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”媒体类型。
    • @Talon 这就是 406 的意思。客户端要求服务器不支持的媒体类型。如果你不在乎你得到什么媒体类型,那么不要要求一个。 OP 只是询问如何向请求添加标头。我只是随便选了一个例子。
    • 这些天你可能想要var response = await client.SendAsync 而不是ContinueWithtask.Wait()
    • 请注意,为了获得最佳性能,您不应像这样实例化 HTTP 客户端。你可以在这里阅读更多关于这个stackoverflow.com/a/15708633/1406930
    【解决方案2】:

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

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

    【讨论】:

    • 我相信这会将标头添加到该 HttpClient 发送的所有消息中。这与 OP 的观点相矛盾:“我如何为单个请求执行此操作(而不是在 HttpClient 上针对所有未来的请求)?” HttpClient 实例被设计为创建一次并多次使用。
    • 要在请求上设置自定义标头,请使用自定义标头构建一个请求,然后将其传递给 httpclient 以发送到 http 服务器。在 httpclient 上设置默认标头以在每个请求上发送到服务器。
    【解决方案3】:

    要在请求中设置自定义标头,请使用自定义标头构建请求,然后将其传递给 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 版本,它们有很大的不同,转换可能会导致代码粗鲁且无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 2017-10-15
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多