Menambahkan Http Header ke HttpClient

158

Semua:

Saya perlu menambahkan header http ke HttpClient sebelum saya mengirim permintaan ke layanan web. Bagaimana saya melakukan itu untuk permintaan individu (yang bertentangan dengan pada HttpClient untuk semua permintaan di masa depan)? Saya tidak yakin apakah ini mungkin.

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();
Ryan James
sumber

Jawaban:

245

Buat HttpRequestMessage, setel Metode ke GET, setel tajuk Anda lalu gunakan SendAsyncsebagai ganti 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();
Darrel Miller
sumber
2
Terima kasih, Darrel! Saya kecewa HttpClientsampai saya melihat Anda bisa melakukan ini.
Sam
23
@Alon Itulah yang dimaksud 406. Klien meminta jenis media yang tidak didukung server. Jika Anda tidak peduli jenis media apa yang Anda dapatkan, maka jangan minta. OP hanya bertanya bagaimana cara menambahkan header ke permintaan. Saya baru saja mengambil contoh acak.
Darrel Miller
15
Hari-hari ini Anda mungkin menginginkannya var response = await client.SendAsyncdaripada ContinueWithdantask.Wait()
Michael Parker
1
@MichaelParker Memang.
Darrel Miller
1
Harap perhatikan untuk kinerja terbaik, Anda seharusnya tidak membuat instance klien HTTP seperti ini. Anda dapat membaca lebih lanjut tentang ini di sini stackoverflow.com/a/15708633/1406930
ScottBurfieldMills
16

Ketika itu bisa menjadi header yang sama untuk semua permintaan atau Anda membuang klien setelah setiap permintaan Anda dapat menggunakan DefaultRequestHeaders.Addopsi:

client.DefaultRequestHeaders.Add("apikey","xxxxxxxxx");      
Taran
sumber
3
Saya percaya bahwa itu menambahkan header ke semua pesan yang dikirim oleh HttpClient ke depan. Itu bertentangan dengan poin OP: "Bagaimana saya melakukan itu untuk permintaan individu (sebagai lawan dari HttpClient untuk semua permintaan di masa depan)?" Contoh HttpClient dirancang untuk dibuat satu kali dan digunakan berkali-kali.
Flydog57
Untuk mengatur header khusus pada permintaan, buat permintaan dengan header khusus sebelum meneruskannya ke httpclient untuk dikirim ke server http. Header default diatur pada httpclient untuk mengirim setiap permintaan ke server.
Zimba
0

Untuk mengatur header kustom PADA PERMINTAAN, buat permintaan dengan header khusus sebelum meneruskannya ke httpclient untuk dikirim ke server http. misalnya:

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

Header default adalah SET ON HTTPCLIENT untuk mengirim setiap permintaan ke server.

Zimba
sumber