Tiêu đề tùy chỉnh cho yêu cầu httpClient


140

Làm cách nào để thêm tiêu đề tùy chỉnh vào HttpClientyêu cầu? Tôi đang sử dụng PostAsJsonAsyncphương thức để đăng JSON. Tiêu đề tùy chỉnh mà tôi cần phải thêm vào là

"X-Version: 1"

Đây là những gì tôi đã làm cho đến nay:

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

3
Bản sao có thể có của việc thêm Tiêu đề http vào HttpClient
Liam

@Liam: Câu hỏi của tôi là làm thế nào để thêm tiêu đề tùy chỉnh. Trường hợp như câu hỏi khác là làm thế nào để thêm tiêu đề
Libin Joseph

2
Tôi nghĩ rằng nó đã được tìm thấy rằng chúng ta không nên loại bỏ httpClient. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Don

Câu trả lời:


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
câu trả lời là vô cùng khó hiểu ... tại sao bạn lại mang mã cho các tài liệu, blank.pdf, v.v? khởi tạo các lớp bytearray để vượt qua các tiêu đề tùy chỉnh trong param param?
heug

2
@heug Vâng. Nếu bạn đang tìm kiếm tiêu đề, bạn có thể thấy nó. Nội dung có mặt ở đây để hoàn thành bức tranh vì rất có thể bạn muốn thêm một số nội dung vào yêu cầu của bạn. Và để không tẻ nhạt, nội dung phức tạp và chứa cả dữ liệu JSON và nhị phân.
Anubis

2
có vẻ như đơn giản hơn để làm điều đó như thế này: tạo StringContent bằng JSON nội dung của bạn, tạo thông báo HTTP bằng phương thức và URI của bạn, sau đó thêm các tiêu đề như message.Headers.Add ("x": "y") .... sau đó chuyển chúng vào một var phản hồi như "var answer = await httpClient.SendAsync (message);"
heug

@heug Tôi sẽ nhớ điều này cho các furute. Cảm ơn!
Anubis

3
Dòng nào trong câu trả lời được chấp nhận ở trên thực sự thực hiện tiêu đề mà OP yêu cầu, Phiên bản X? Tại sao điều này được coi là câu trả lời được chấp nhận?
Ron

215

Tôi đã tìm thấy câu trả lời cho câu hỏi của tôi.

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

Điều đó sẽ thêm một tiêu đề tùy chỉnh cho yêu cầu của bạn


49
Không nó không. Câu trả lời này nên được xem một cách thận trọng, vì các tiêu đề yêu cầu mặc định được gửi với mỗi yêu cầu. Bạn nên xây dựng yêu cầu của bạn như @Anubis đề xuất. DefaultsRequestHeaders nên được điền khi bạn tạo HTTPClient.
Ruhrpottpatriot

6
Điều này chỉ hoạt động vì bạn đang khởi tạo một httpClient mới cho mọi yêu cầu. Đây không phải là cách lớp này nên được sử dụng: nó phải là một trường tĩnh, được sử dụng lại cho tất cả các yêu cầu, ít nhất là những yêu cầu đến cùng một điểm cuối. Xem tài liệu và vô số bài viết trên blog. Sau đó, như tất nhiên, như @Ruhrpottpatriot chỉ ra, việc thay đổi tiêu đề mặc định sẽ ảnh hưởng đến tất cả các yêu cầu.
kamilk

@Ruhrpottpatriot Có gì sai khi gửi tiêu đề cho mọi yêu cầu?
David Klempfner

1
@ajbeaven Không, đó không phải là những gì nó nói. Ví dụ ở đầu trang hiển thị phương thức Chính của ứng dụng, do đó, mặc dù httpClient bị loại bỏ, nhưng cùng một ví dụ được sử dụng trong suốt vòng đời của ứng dụng và điều đó đúng với những gì tài liệu nói một chút tiếp tục xuống một chút: 'HttpClient dự định được khởi tạo một lần và được sử dụng lại trong suốt vòng đời của một ứng dụng' . Tiếp theo đoạn này là một ví dụ khuyên bạn nên gán một httpClient cho trường tĩnh.
kamilk

1
@kamilk, bạn đã chết đúng - ví dụ đó khiến tôi sai. Cảm ơn vì đã đặt tôi đúng :)
ajbeaven

79

Dưới đây là câu trả lời dựa trên câu hỏi của Anubis (đây là cách tiếp cận tốt hơn vì nó không sửa đổi các tiêu đề cho mọi yêu cầu) nhưng tương đương với mã trong câu hỏi ban đầu:

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 chắc chắn không. Content-Type là một tiêu đề Nội dung.
Panagiotis Kanavos

1
Đồng ý đây là câu trả lời. Nó trình bày cách thêm tiêu đề mà OP yêu cầu. Trả lời câu hỏi của tôi là tốt.
Ron

1
FYI tôi nghĩ HttpRequestHeader.Accessnên được HttpRequestHeader.Accept.
Mass Dot Net

Nhân tiện là gì?
vào

@aswzen Đó là từ câu hỏi của OP - một mô hình nào đó tôi sẽ đoán. Các đối tượng được nối tiếp.
Chris Peacock

2

Có một Headerstài sản trong HttpRequestMessagelớp. Bạn có thể thêm các tiêu đề tùy chỉnh ở đó, sẽ được gửi với mỗi yêu cầu HTTP. Mặt khác, DefaultRequestHeaderstrong HttpClientlớp, đặt các tiêu đề được gửi với mỗi yêu cầu được gửi bằng đối tượng khách đó, do đó có tên Tiêu đề yêu cầu mặc định .

Hy vọng điều này làm cho mọi thứ rõ ràng hơn, ít nhất là cho ai đó nhìn thấy câu trả lời này trong tương lai.


Không, không làm cho nó rõ ràng hơn. Trong cả hai trường hợp, bạn đang nói rằng bạn đang gửi tiêu đề cho mỗi yêu cầu - Vậy sự khác biệt là gì?
joedotnot

3
Headerslà một tài sản của một HttpRequestMessageđối tượng cá nhân . Do đó bạn có thể tạo các thông điệp khác nhau với các tiêu đề khác nhau. DefaultRequestHeaderslà tài sản của HttpClientđối tượng; nếu nhiều tin nhắn được gửi qua một tin nhắn nhất định HttpClient, tất cả các tin nhắn như vậy sẽ có cùng một phần DefaultRequestHeadersđược thêm vào tiêu đề riêng của tin nhắn.
Ross Presser
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.