web-dev-qa-db-ja.com

StringContentとObjectContent

System.Net.HttpのHttpClientを使用してREST API with "POST" with the following codeを呼び出しています:

using (HttpRequestMessage requestMessage = new HttpRequestMessage(
                                           HttpMethod.Post, new Uri(request)) { })
{
     response = await httpClient.PostAsync(request, objectContent);
}

「objectContent」は現在これです-

objectContent = new ObjectContent(jsonContent.GetType(),
                                  jsonContent,
                                  new JsonMediaTypeFormatter());

これがこのようなObjectContentではなくStringContentである場合、どのような違いがあるのでしょうか。

objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

どちらも正常に動作します。 JSONなので、StringContentが理にかなっていると思いがちです。ただし、送信されるほとんどすべてのコンテンツが「文字列」であるため、ObjectContentをいつ使用するか。

16
Lalman

これがこのようなObjectContentではなくStringContentである場合、どのような違いがあるのでしょうか。

あなたの例では違いはありません。 ObjectContentは、単にHttpClientを介して「より広い」範囲のタイプを送信できるようにしますが、StringContentは、JSONなどのstring値に対してのみ狭くなります。

StringContentByteArrayContentのスリムなラッパーで、実際にはbyte[]として渡された値を格納します。 stringを前後に変換する必要がないという利点が得られます。

編集:

JSONを投稿しているという事実を考えると、 HttpClientExtensions.PostAsJsonAsync<T> を使用して、JSONをより冗長にすることもできます。

await httpClient.PostAsJsonAsync(url, json);
14
Yuval Itzchakov

誰かが.NET Core 2.1でPostAsyncによってリクエストを送信する方法を検索する場合:HttpClientにPostAsJsonAsyncメソッドが見つかりませんでしたが、設定を使用したソリューション:

objectContent = new StringContent(content);
objectContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

.NET Coreでも完全に「仕事をする」。

編集:

さらに、独自のヘッダーを追加する場合は、次のように入力できます。

objectContent.Headers.Add("Your header", "Value");
2
greygreg87

ObjectContentは、組み込みまたはカスタム記述のフォーマッターを使用して、より複雑なMimeタイプをフォーマットするために使用されます。単純な文字列にもObjectContentを使用しても問題ありません。文字列用に特別に最適化されている可能性があるため、StringContentの方が優れている(IMHOとチェックされていない)パフォーマンスを除いて、それほど大きな違いはありません。

0
Denis Yarkovoy