空のボディをHttpClient経由でREST APIに投稿する


119

私が呼び出そうとしているAPIでは、POSTを実行する必要がありますが、本文は空です。私はWCF Web API HttpClientを使用するのが初めてで、本文が空の投稿を作成するコードを見つけられないようです。いくつかのHttpContent.CreateEmpty()メソッドへの参照を見つけましたが、そのメソッドが見つからないようなので、それはWeb API HttpClientコード用ではないと思います。


HttpContent.CreateEmptyは、RESTスターターキットの一部であった古いHttpClientプロトタイプからのものです。残念ながら、新しいHttpClientには同等のものはありません。
Darrel Miller、


1
@MichaelFreidgeim時空連続体に穴があり、どういうわけか2013年が2011年より前に来た場合、それは可能性のある複製です。
ライアンリナルディ

1
「可能性のある重複」は、クリーンアップする方法です。同様の質問を閉じて、最良の回答を保持します。日付は必須ではありません。meta.stackexchange.com/questions/147643/…を参照してください。明確化が必要であることに同意する場合は、meta.stackexchange.com / questions / 281980 /…に
Michael Freidgeim

回答:


117

使用StringContentまたはObjectContentそこから派生するHttpContentか、あなたが使用できるnullようHttpContent

var response = await client.PostAsync(requestUri, null);


これは.NET Framework 4.5にのみあるように見えますか? msdn.microsoft.com/en-us/library/...
ダン

WCF Web APIと一緒に出荷されますが、「良い部分」のいくつかがフレームワーク自体に組み込まれると思います。
Alexander Zeitler

HttpContentクラスを必要としないオーバーロードメソッドがないのはなぜですか?少なくとも何かを(空の文字列でさえ)提供して、http投稿を作成する必要がありますか?
tugberk 2012年

75
nullとして使用できますHttpContent。これにより、リクエストの本文は送信されません。例var response = await client.PostAsync(requestUri, null);
Owain Williams

105

これは以前に行ったのですが、単純にしてください。

Task<HttpResponseMessage> task = client.PostAsync(url, null);

7
これは受け入れられた回答よりもきれいで、投票する必要があります。
David Ebbo 2017年

4

それを発見した:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

WSO2で失敗したリクエスト本文にnullを追加します。交換された:

Task<HttpResponseMessage> task = client.PostAsync(url, new {});

そして働いた。


この結果は確認できません(ただし、テストが完全に適切であったかどうかはわかりません)。nullコンテンツを含む自分のAPIの1つにPOSTしてHttpRequestMessage、で見つかったコンテンツを見ると、長さがゼロバイトになっているようです。
またはMapper、

1

この問題を解決するには、次の例を使用します。

   using (var client = new HttpClient())
            {
                var stringContent = new StringContent(string.Empty);
                stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
                var response = client.PostAsync(url, stringContent).Result;
                var result = response.Content.ReadAsAsync<model>().Result;
            }

-6

Webメソッドにパラメーターがない場合、またはパラメーターがすべてURLテンプレートに適合する場合、それは自動的に行われると思います。

たとえば、次の宣言は空の本文を送信します。

  [OperationContract]
  [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void GetStatus(string emailAddress, out long statusMask);

空のボディを送信しようとしています。HttpClient.Post()メソッドには、URIとHttpContentオブジェクトが必要です。何も送信したくない場合、HttpContentとして何を渡すべきかわかりません。
ライアンリナルディ

つまり、WCFを使用していません。それはさらに簡単です:... HttpWebRequest request =(HttpWebRequest)WebRequest.Create( "http:// ..."); request.Method = "POST"; HttpWebResponse respose =(HttpWebResponse)request.GetResponse(); ...結果として返答
Ivan G.

1
私はHttpWebRequestではなくHttpClientを使用しています。空の文字列でStringContentを使用すると機能しました。
Ryan Rinaldi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.