Thêm tiêu đề http vào httpClient


158

Tất cả:

Tôi cần thêm tiêu đề http vào httpClient trước khi gửi yêu cầu đến dịch vụ web. Làm thế nào để tôi làm điều đó cho một yêu cầu riêng lẻ (trái ngược với trên httpClient cho tất cả các yêu cầu trong tương lai)? Tôi không chắc nếu điều này thậm chí có thể.

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âu trả lời:


245

Tạo một HttpRequestMessage, đặt Phương thức thành GET, đặt các tiêu đề của bạn và sau đó sử dụng SendAsyncthay vì 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();

2
Cảm ơn, Darrel! Tôi đã thất vọng HttpClientcho đến khi tôi thấy rằng bạn có thể làm điều này.
Sam

23
@Talon Đó là 406 nghĩa là gì. Máy khách yêu cầu loại phương tiện mà máy chủ không hỗ trợ. Nếu bạn không quan tâm loại phương tiện nào bạn nhận được, thì đừng hỏi loại phương tiện nào. OP chỉ đơn giản là hỏi làm thế nào để thêm tiêu đề vào một yêu cầu. Tôi chỉ chọn một ví dụ ngẫu nhiên.
Darrel Miller

15
Những ngày này bạn có thể muốn var response = await client.SendAsyncthay vì ContinueWithtask.Wait()
Michael Parker

1
@MichaelParker Thật vậy.
Darrel Miller

1
Xin lưu ý để có hiệu suất tốt nhất, bạn không nên khởi tạo ứng dụng khách HTTP như thế này. Bạn có thể đọc thêm về điều này tại đây stackoverflow.com/a/15708633/1406930
ScottBurfieldMills

16

Khi nó có thể là cùng một tiêu đề cho tất cả các yêu cầu hoặc bạn loại bỏ ứng dụng khách sau mỗi yêu cầu, bạn có thể sử dụng DefaultRequestHeaders.Addtùy chọn:

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

3
Tôi tin rằng điều đó sẽ thêm tiêu đề cho tất cả các tin nhắn được gửi bởi httpClient đó. Điều đó mâu thuẫn với quan điểm của OP: "Làm thế nào để tôi thực hiện điều đó cho một yêu cầu riêng lẻ (trái ngược với httpClient đối với tất cả các yêu cầu trong tương lai)?" Các phiên bản httpClient được thiết kế để được tạo một lần và được sử dụng nhiều lần.
Flydog57

Để đặt tiêu đề tùy chỉnh theo yêu cầu, hãy tạo một yêu cầu với tiêu đề tùy chỉnh trước khi chuyển nó tới httpclient để gửi đến máy chủ http. Tiêu đề mặc định được đặt trên httpclient để gửi mọi yêu cầu đến máy chủ.
Zimba

0

Để đặt tiêu đề tùy chỉnh TRÊN YÊU CẦU, hãy tạo một yêu cầu với tiêu đề tùy chỉnh trước khi chuyển nó tới httpclient để gửi đến máy chủ http. ví dụ:

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

Tiêu đề mặc định là THIẾT LẬP HTTPCLIENT để gửi mọi yêu cầu đến máy chủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.