httpClient.GetAsyncを使用する場合のヘッダーの追加


152

私は、Apiary.ioを使用して他の同僚が作成したAPIをWindowsストアアプリプロジェクトに実装しています。

彼らは私が実装しなければならないメソッドのこの例を示しています:

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

これと他のいくつかのメソッドでは、以前に取得したトークンを含むヘッダーが必要です。

これが、私が話しているヘッダー付きのPostman(クロム拡張)の画像です。 ここに画像の説明を入力してください

そのAuthorizationヘッダーをリクエストに追加するにはどうすればよいですか?



5
警告潜在的なコード検索者向け:これはHttpClientの誤った使用です!! aspnetmonsters.com/2016/08/2016-08-27-httpclient間違った理由を確認してください。
321X

回答:


174

HttpClientでGetAsyncを使用する場合、次のように認証ヘッダーを追加できます。

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

これにより、HttpClientの存続期間中に認証ヘッダーが追加されるため、認証ヘッダーが変更されないサイトにアクセスする場合に役立ちます。

これがSOの詳細な答えです


31
-1は、HttpClientが再利用可能である必要があるためです(aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongを参照)。再利用可能にする必要がある場合は、デフォルトのリクエストヘッダーを設定することはお勧めできません。
JCKödel

22
@JCKödelそれはあなたがしている誤った仮定です。DefaultRequestHeadersを使用してHttpClientの有効期間中、常に同じ資格情報で同じサイトを呼び出す場合は、同じ値を使用してサイトを継続的に再設定する必要がなくなります。HttpClientの同じインスタンスの使用について説明している記事をもう一度読んでください。デフォルトのリクエストヘッダーが悪い習慣であることについては何も述べていません。HTTPクライアントで1つのサイトだけを呼び出す場合、実際にはDefaultRequestHeadersを使用してこれを行うと、毎回それらを設定する必要がなくなります。
kmcnamee

@JCKödel、あなたはあなたの仮定が間違っていますが、あなたが重要なポイントを持ち出したので、私はあなたのコメントを賛成しました。回答がより明確になりました。
Najeeb

@ kmcnamee、2つのトークンを渡す必要がある場合はどうなりますか?
Najeeb

281

後で答えますが、誰もこの解決策を与えなかったので...

HttpClient追加してインスタンスにヘッダーを設定したくない場合はDefaultRequestHeadersリクエストごとにヘッダーを設定できます

ただし、このSendAsync()方法を使用する必要があります。

これは、再利用する場合HttpClientの適切なソリューションです。これは、

次のように使用します。

using (var requestMessage =
            new HttpRequestMessage(HttpMethod.Get, "https://your.site.com"))
{
    requestMessage.Headers.Authorization =
        new AuthenticationHeaderValue("Bearer", your_token);
    httpClient.SendAsync(requestMessage);
}

5
値が頻繁に変更される場合は、DefaultRequestHeadersを使用しない方が安全と思われます。
Jason Rowe

3
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", your_token);「ベアラー」が無効なHTTPヘッダーになる可能性が非常に高いことに注意してください
Chris Marisic

3
このおかげで、私たちはHttpClientを再利用し、これが私たちを助けてくれました
StevenMcD

2
@JCKodel使用する必要はありませんusingが、コンストラクタでインスタンス化してDispose()
Philippe

3
私はusingHttpClientでの使用を言ったことはありません(これは悪いことです)、HttpRequesMessageで(使用後に破棄する必要があるストリーミング用のアンマネージメモリバッファーがあるため)と述べました。リクエストとレスポンスはリクエストごとに破棄する必要があります(そうしないと、大量のメモリチャンクを長期間ロックされたままにします)。HttpClient延長に、再利用可能です。
JCKödel

70

受け入れられた回答は機能しますが、Acceptヘッダーを追加しようとすると複雑になる場合があります。これは私が結局終わったものです。それは私には簡単に思えるので、私は将来それを続けるつもりだと思います:

client.DefaultRequestHeaders.Add("Accept", "application/*+xml;version=5.1");
client.DefaultRequestHeaders.Add("Authorization", "Basic " + authstring);

Basic Authorizationヘッダーを追加する
最も簡単

7

必要なヘッダーはすべてに追加できますHttpClient

これについての素晴らしいチュートリアルがあります。

これは、POSTリクエストだけでなく、GETリクエストにも使用できます。


サイトリンクの有効期限が切れた場合のGithub url
Sen Jacob

4

greenhoornの答えに従って、次のように「拡張」を使用できます。

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

そして使用:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.