972

呼び出している API の要求に応じてContent-Type、オブジェクトのヘッダーを設定しようとしています。HttpClient

以下のように設定してみました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

4

20 に答える 20

1213

コンテンツ タイプは、リクエストではなくコンテンツのヘッダーであるため、これが失敗しています。AddWithoutValidationRobert Levy によって提案されたように動作する可能性がありますが、リクエスト コンテンツ自体を作成するときにコンテンツ タイプを設定することもできます (コード スニペットは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);
      });
于 2012-05-21T03:54:34.030 に答える
201

カルロスのソリューションに対するジョンのコメントを見ていない人のために...

req.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
于 2013-06-06T10:15:17.987 に答える
60

小さなライブラリ依存関係が気にならない場合は、Flurl.Http [開示: 私が作成者です] を使用すると、これが非常に簡単になります。そのPostJsonAsyncメソッドは、コンテンツのシリアルcontent-type化とヘッダーの設定の両方を処理ReceiveJsonし、応答を逆シリアル化します。ヘッダーが必要な場合acceptは、自分で設定する必要がありますが、Flurl はそれを行うための非常にクリーンな方法も提供します。

using Flurl.Http;

var result = await "http://example.com/"
    .WithHeader("Accept", "application/json")
    .PostJsonAsync(new { ... })
    .ReceiveJson<TResult>();

Flurl は内部で HttpClient と Json.NET を使用し、PCL であるため、さまざまなプラットフォームで動作します。

PM> Install-Package Flurl.Http
于 2014-06-22T15:19:50.010 に答える
42

TryAddWithoutValidation を使用してみてください

  var client = new HttpClient();
  client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");
于 2015-11-19T22:48:39.167 に答える
18

AddWithoutValidationの代わりに呼び出しますAdd(この MSDN リンクを参照してください)。

あるいは、あなたが使用している API は、(通常の GET リクエストではなく) POST または PUT リクエストに対してのみこれを必要としていると思います。その場合、 を呼び出しHttpClient.PostAsyncて渡すときに、そのオブジェクトのプロパティにHttpContentthis を設定します。HeadersHttpContent

于 2012-05-21T03:32:53.207 に答える