Menambahkan header saat menggunakan httpClient.GetAsync

152

Saya menerapkan API yang dibuat oleh rekan kerja lainnya dengan Apiary.io, dalam proyek aplikasi Windows Store.

Mereka menunjukkan contoh metode yang harus saya terapkan:

var baseAddress = new Uri("https://private-a8014-xxxxxx.apiary-mock.com/");

using (var httpClient = new HttpClient{ BaseAddress = baseAddress })
{
    using (var response = await httpClient.GetAsync("user/list{?organizationId}"))
    {
        string responseData = await response.Content.ReadAsStringAsync();
    }
}

Dalam hal ini dan beberapa metode lain, saya harus memiliki header dengan token yang saya dapatkan sebelumnya.

Ini gambar Postman (ekstensi chrome) dengan header yang saya bicarakan: masukkan deskripsi gambar di sini

Bagaimana saya menambahkan header Otorisasi ke permintaan?

Ric
sumber
2
kemungkinan duplikat dari Kepala Otorisasi Pengaturan dari HttpClient
Daniel Kelley
5
Peringatan Untuk pencari kode potensial: ini adalah penggunaan HttpClient yang salah !! Lihat aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong why.
321X

Jawaban:

174

Saat menggunakan GetAsync dengan HttpClient Anda dapat menambahkan header otorisasi seperti:

httpClient.DefaultRequestHeaders.Authorization 
                         = new AuthenticationHeaderValue("Bearer", "Your Oauth token");

Ini menambahkan tajuk otorisasi untuk seumur hidup dari HttpClient jadi berguna jika Anda menekan satu situs di mana tajuk otorisasi tidak berubah.

Berikut adalah jawaban SO yang terperinci

kmcnamee
sumber
31
-1 karena HttpClient harus dapat digunakan kembali (lihat aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong ). Jika harus dapat digunakan kembali, menetapkan header permintaan default adalah praktik yang buruk.
JCKödel
23
@ JCKödel Itu anggapan keliru yang Anda buat. Jika Anda selalu memanggil situs yang sama dengan kredensial yang sama untuk masa pakai HttpClient menggunakan DefaultRequestHeaders menyelamatkan Anda dari keharusan untuk terus menetapkannya lagi dengan nilai yang sama. Anda harus membaca kembali artikel yang dibicarakan tentang penggunaan instance HttpClient yang sama, itu tidak membuat pernyataan tentang header permintaan default menjadi praktik yang buruk. Jika saya hanya menelepon satu situs dengan klien HTTP yang dalam praktiknya terjadi menggunakan DefaultRequestHeaders membuat Anda tidak perlu mengaturnya setiap kali.
kmcnamee
@ JCKödel, meskipun Anda salah dalam anggapan Anda, saya membenarkan komentar Anda, karena Anda mengemukakan poin penting. Menambah kejelasan jawaban.
Najeeb
@kmcnamee, bagaimana jika saya harus melewati dua token?
Najeeb
281

Jawaban nanti, tetapi karena tidak ada yang memberikan solusi ini ...

Jika Anda tidak ingin mengatur header pada HttpClientinstance dengan menambahkannya ke DefaultRequestHeaders, Anda bisa mengatur header per permintaan .

Tetapi Anda harus menggunakan SendAsync() metode ini.

Ini adalah solusi yang tepat jika Anda ingin menggunakan kembaliHttpClient - yang merupakan praktik yang baik untuk

Gunakan seperti ini:

using (var requestMessage =
            new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
    requestMessage.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", your_token);
    httpClient.SendAsync(requestMessage);
}
Philippe
sumber
5
Tampaknya lebih aman untuk tidak menggunakan DefaultRequestHeaders jika nilainya sering berubah.
Jason Rowe
3
Perhatikan bahwa Anda kemungkinan besar membutuhkan requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);"Pembawa" akan menjadi tajuk HTTP yang tidak valid
Chris Marisic
3
Terima kasih untuk ini, kami menggunakan kembali HttpClient kami dan ini membantu kami
StevenMcD
2
@JCKodel itu akan menambah kebisingan karena Anda tidak perlu diwajibkan untuk menggunakan usingtetapi bisa instantiate di konstruktor dan membuang diDispose()
Philippe
3
Saya tidak pernah mengatakan penggunaan usingpada HttpClient (ini buruk), saya katakan pada HttpRequesMessage (karena memiliki buffer memori yang tidak dikelola untuk streaming yang HARUS dibuang setelah digunakan). Permintaan dan responsnya adalah dan harus dibuang setiap permintaan (jika tidak, Anda akan menyimpan potongan memori besar terkunci untuk waktu yang lama). Dapat HttpClientdigunakan kembali, sampai batas tertentu.
JCKödel
70

Jawaban yang diterima berfungsi tetapi bisa menjadi rumit ketika saya ingin mencoba menambahkan header Terima. Inilah yang akhirnya saya lakukan. Tampaknya lebih sederhana bagi saya jadi saya pikir saya akan tetap menggunakannya di masa depan:

client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);
sirdank
sumber
Cara termudah untuk menambahkan tajuk Otorisasi Dasar
sandyiit
7

Anda dapat menambahkan header apa pun yang Anda butuhkan ke HttpClient .

Ini tutorial yang bagus tentang itu.

Ini tidak hanya merujuk pada permintaan POST, Anda juga dapat menggunakannya untuk permintaan GET.

hiu hijau
sumber
Github url , jika tautan situs kedaluwarsa.
Sen Jacob
5

Mengikuti jawaban greenhoorn, Anda dapat menggunakan "Extensions" seperti ini:

  public static class HttpClientExtensions
    {
        public static HttpClient AddTokenToHeader(this HttpClient cl, string token)
        {
            //int timeoutSec = 90;
            //cl.Timeout = new TimeSpan(0, 0, timeoutSec);
            string contentType = "application/json";
            cl.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(contentType));
            cl.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", token));
            var userAgent = "d-fens HttpClient";
            cl.DefaultRequestHeaders.Add("User-Agent", userAgent);
            return cl;
        }
    }

Dan gunakan:

string _tokenUpdated = "TOKEN";
HttpClient _client;
_client.AddTokenToHeader(_tokenUpdated).GetAsync("/api/values")
RDyego
sumber
-1

Terkadang, Anda hanya perlu kode ini.

 httpClient.DefaultRequestHeaders.Add("token", token);
Jackdon Wang
sumber