1. ホーム
  2. c#

[解決済み] HttpClientリクエストのContent-Typeヘッダーはどのように設定するのですか?

2022-03-20 03:42:53

質問

を設定しようとしています。 Content-Type ヘッダーの HttpClient オブジェクトを呼び出すAPIで必要なものです。

を設定してみました。 Content-Type を以下のようにします。

using (var httpClient = new HttpClient())
{
    httpClient.BaseAddress = new Uri("http://example.com/");
    httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
    httpClient.DefaultRequestHeaders.Add("Content-Type", "application/json");
    // ...
}

これによって Accept ヘッダを追加しようとすると Content-Type は、次のような例外を投げます。

ヘッダー名の誤用です。リクエストヘッダは必ず HttpRequestMessage で、レスポンスヘッダーは HttpResponseMessage と コンテンツヘッダーは HttpContent オブジェクトを作成します。

を設定するにはどうすればよいのでしょうか? Content-Type ヘッダを HttpClient のリクエストに対応していますか?

解決方法は?

コンテンツタイプはリクエストのヘッダーではなく、コンテンツのヘッダーであるため、失敗しているのです。 AddWithoutValidation ロバート・レヴィの提案による は動作するかもしれませんが、 リクエストの内容そのものを作成するときにコンテンツタイプを設定することもできます (コードスニペットが application/json を Accept ヘッダと Content-Type ヘッダの 2 か所で使用します)。

HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://example.com/");
client.DefaultRequestHeaders
      .Accept
      .Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "relativeAddress");
request.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}",
                                    Encoding.UTF8, 
                                    "application/json");//CONTENT-TYPE header

client.SendAsync(request)
      .ContinueWith(responseTask =>
      {
          Console.WriteLine("Response: {0}", responseTask.Result);
      });