HttpClientリクエストへのカスタムヘッダー


140

HttpClientリクエストにカスタムヘッダーを追加するにはどうすればよいですか?PostAsJsonAsyncメソッドを使用してJSONを投稿しています。追加する必要があるカスタムヘッダーは

"X-Version: 1"

これは私がこれまでに行ったことです:

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


@Liam:私の質問は、カスタムヘッダーを追加する方法でした。他の質問と同じようにヘッダーを追加する方法
リビンジョセフ2017

2
HttpClientを破棄してはいけないことがわかったと思います。aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
Don Rolling

回答:


57
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\"" },
            },
        },
    },
};

38
答えは非常に紛らわしいです...なぜドキュメントのコード、blank.pdfなどを取り込むのですか?Content param内でカスタムヘッダーを渡すために、bytearrayクラスをインスタンス化しますか?
2018年

2
@heugまあ。あなたがヘッダーを探しているなら、あなたはそれを見ることができます。リクエストにコンテンツを追加する可能性が最も高いため、画像を完成させるためにコンテンツがここにあります。また、面倒にならないように、コンテンツは複雑で、JSONデータとバイナリデータの両方が含まれています。
Anubis

2
次のようにするのは簡単です:コンテンツJSONを使用してStringContentを作成し、メソッドとURIを使用してHTTPメッセージを作成し、message.Headers.Add( "x": "y")などのヘッダーを追加します。次に、「var response = await httpClient.SendAsync(message);」のような応答変数にそれらを渡します。
2018年

@heug私はこれをフルートのために覚えています。ありがとう!
Anubis

3
上記の受け入れられた回答のどの行が、OPが要求したヘッダー、X-Versionを実際に実装していますか?なぜこれは受け入れられた回答と見なされますか?
Ron

215

私の質問に対する答えを見つけました。

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

それはあなたのリクエストにカスタムヘッダーを追加するはずです


49
いいえ、違います。デフォルトのリクエストヘッダーはリクエストごとに送信されるため、この回答は注意して表示する必要があります。@Anubisが提案するようにリクエストを作成する必要があります。DefaultsRequestHeadersは、HttpClientを作成するときに入力する必要があります。
Ruhrpottpatriot 2017

6
これは、すべての要求に対して新しいHttpClientをインスタンス化しているためにのみ機能します。これは、このクラスの使用方法ではありません。静的フィールドであり、少なくとも同じエンドポイントに対するすべての要求で再利用する必要があります。ドキュメントと無数のブログ投稿をご覧ください。そしてもちろん、@ Ruhrpottpatriotが指摘するように、デフォルトのヘッダーを変更するとすべてのリクエストに影響します。
kamilk

@Ruhrpottpatriotすべてのリクエストのヘッダーを送信することの何が問題になっていますか?
David Klempfner、

1
@ajbeavenいいえ、そうではありません。ページの上部にある例はアプリのMainメソッドを示しているため、HttpClientが破棄されても、アプリケーションの存続期間を通じて同じインスタンスが使用されます。これは、ドキュメントに記載されている内容に関しては正しいですさらにダウンビット:「のHttpClientは一度インスタンス化され、アプリケーションの寿命を通じて再使用することを意図しています」。この段落の後に、静的フィールドにHttpClientを割り当てることを推奨する例を示します。
kamilk

1
@kamilk、あなたは正しかった-その例は私を誤解した。私を正しく入れてくれてありがとう:)
ajbeaven

79

これは、Anubisによる回答に基づいています(すべてのリクエストのヘッダーを変更しないため、より優れたアプローチです)が、元の質問のコードと同等です。

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;

@RossPresser間違いなく。Content-TypeはContentヘッダーです。
Panagiotis Kanavos

1
これが答えであることに同意しました。OPが要求したヘッダーを追加する方法を示します。私の質問にも答えました。
Ron

1
ちなみに私は思いHttpRequestHeader.AccessますHttpRequestHeader.Accept
Mass Dot Net、

ところでsvmとは何ですか?
aswzen

@aswzenそれはOPの質問からです-私が推測するモデルです。シリアル化されるオブジェクト。
クリス・ピーコック

2

クラスにHeadersプロパティがありますHttpRequestMessage。ここにカスタムヘッダーを追加できます。これは、各HTTPリクエストで送信されます。DefaultRequestHeadersHttpClientクラス、一方、各要求と共に送信する設定ヘッダーは、名前、したがって、そのクライアントオブジェクトを使用して送信されるデフォルトの要求ヘッダー。

これにより、少なくとも将来この答えを見た人にとって、物事がより明確になることを願っています。


いいえ、明確にしません。どちらの場合でも、すべてのリクエストでヘッダーを送信していると言っています-それで違いは何ですか?
joedotnot

3
Headers個々のHttpRequestMessageオブジェクトのプロパティです。したがって、異なるヘッダーで異なるメッセージを作成できます。 オブジェクトのDefaultRequestHeadersプロパティHttpClientです。特定のを介して複数のメッセージが送信される場合HttpClient、そのようなメッセージはすべてDefaultRequestHeaders、メッセージの個々のヘッダーに同じものが追加されます。
ロスプレッサー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.