Header kustom ke permintaan HttpClient

147

Bagaimana cara menambahkan tajuk khusus ke HttpClientpermintaan? Saya menggunakan PostAsJsonAsyncmetode untuk memposting JSON. Header khusus yang perlu saya tambahkan adalah

"X-Version: 1"

Inilah yang telah saya lakukan sejauh ini:

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;
}
Libin Joseph
sumber
3
Kemungkinan duplikat dari Menambahkan Header Http ke HttpClient
Liam
@Liam: Pertanyaan saya adalah bagaimana menambahkan tajuk khusus. Sedangkan pertanyaan lainnya adalah bagaimana menambahkan header
Libin Joseph
3
Saya pikir telah ditemukan bahwa kita tidak boleh membuang HttpClient. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Don Rolling

Jawaban:

63
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\"" },
            },
        },
    },
};
Anubis
sumber
46
jawaban sangat membingungkan ... mengapa Anda membawa kode untuk dokumen, blank.pdf, dll? membuat instance kelas bytearray untuk meneruskan header kustom dalam parameter Content?
angkat
2
@sukasukaaaa. Jika Anda mencari header, Anda dapat melihatnya. Konten hadir di sini untuk melengkapi gambar karena kemungkinan besar Anda ingin menambahkan beberapa konten ke permintaan Anda. Dan agar tidak membosankan, kontennya rumit dan berisi JSON dan data biner.
Anubis
2
sepertinya lebih mudah untuk melakukannya seperti ini: buat StringContent menggunakan konten JSON Anda, buat pesan HTTP dengan metode dan URI Anda, lalu tambahkan header seperti message.Headers.Add ("x": "y") .... lalu teruskan itu ke dalam var tanggapan seperti "var response = await httpClient.SendAsync (message);"
angkat
@ heug Saya akan mengingat ini untuk furute. Terima kasih!
Anubis
3
Baris mana dalam jawaban yang diterima di atas yang benar-benar mengimplementasikan header yang diminta OP, X-Version? Mengapa ini dianggap sebagai jawaban yang diterima?
Ron
232

Saya telah menemukan jawaban atas pertanyaan saya.

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

Itu harus menambahkan tajuk khusus ke permintaan Anda

Libin Joseph
sumber
55
Tidak. Jawaban ini harus dilihat dengan hati-hati, karena header permintaan default dikirim dengan setiap permintaan. Anda harus membuat permintaan Anda seperti yang disarankan @Anubis. DefaultsRequestHeaders harus diisi saat Anda membuat HttpClient.
Ruhrpottpatriot
8
Ini hanya berfungsi karena Anda membuat instance HttpClient baru untuk setiap permintaan. Kelas ini tidak harus digunakan dengan cara ini: kelas ini harus berupa bidang statis, digunakan kembali untuk semua permintaan, setidaknya yang ke titik akhir yang sama. Lihat dokumentasi dan posting blog yang tak terhitung jumlahnya di luar sana. Kemudian, tentu saja, seperti yang ditunjukkan @Ruhrpottpatriot, mengubah tajuk default akan memengaruhi semua permintaan.
kamilk
@Ruhrpottpatriot Apa yang salah dengan mengirimkan header untuk setiap permintaan?
David Klempfner
1
@ajbeaven Tidak, bukan itu yang dikatakan. Contoh di bagian atas halaman menunjukkan metode Utama aplikasi, jadi meskipun HttpClient dibuang, instance yang sama digunakan sepanjang masa aplikasi, dan itu benar sehubungan dengan apa yang dikatakan sedikit dokumentasi. sedikit lebih jauh ke bawah: 'HttpClient dimaksudkan untuk dipakai sekali dan digunakan kembali sepanjang masa pakai aplikasi' . Mengikuti paragraf ini adalah contoh yang merekomendasikan menetapkan HttpClient ke bidang statis.
kamilk
1
@ Kamilk, kau benar sekali - contoh itu membuatku salah. Terima kasih telah membuat saya benar :)
ajbeaven
88

Berikut adalah jawaban berdasarkan jawaban dari Anubis (yang merupakan pendekatan yang lebih baik karena tidak mengubah header untuk setiap permintaan) tetapi yang lebih setara dengan kode dalam pertanyaan asli:

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;
Chris Peacock
sumber
@RossPresser jelas tidak. Jenis Konten adalah header Konten.
Panagiotis Kanavos
1
Setuju inilah jawabannya. Ini menunjukkan bagaimana menambahkan header yang diminta OP. Menjawab pertanyaan saya juga.
Ron
1
FYI saya pikir HttpRequestHeader.Accessharus HttpRequestHeader.Accept.
Mass Dot Net
apa itu svm?
aswzen
@aswzen Ini dari pertanyaan OP - model sesuatu yang saya duga. Objek sedang dibuat serial.
Chris Peacock
4

Ada Headersproperti di HttpRequestMessagekelas. Anda dapat menambahkan tajuk khusus di sana, yang akan dikirim dengan setiap permintaan HTTP. Di DefaultRequestHeadersdalam HttpClientkelas, di sisi lain, menetapkan header yang akan dikirim dengan setiap permintaan yang dikirim menggunakan objek klien itu, maka nama Header Permintaan Default .

Semoga ini membuat segalanya lebih jelas, setidaknya bagi seseorang yang melihat jawaban ini di masa depan.

Bob si tukang bangunan
sumber
1
Tidak, tidak membuatnya lebih jelas. Dalam kedua kasus, Anda mengatakan bahwa Anda mengirimkan header pada setiap permintaan - Jadi apa bedanya?
joedotnot
4
Headersadalah properti HttpRequestMessageobjek individu . Dengan demikian, Anda dapat membuat pesan berbeda dengan header berbeda. DefaultRequestHeadersadalah properti HttpClientobjek; jika beberapa pesan dikirim melalui pesan tertentu HttpClient, semua pesan tersebut akan DefaultRequestHeadersditambahkan ke header individual pesan tersebut.
Ross Presser