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?



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


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

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

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.


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")

-1

Terkadang, Anda hanya perlu kode ini.

 httpClient.DefaultRequestHeaders.Add("token", token);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.