HttpClient PostAsJsonAsyncを使用してASP.NET CoreでHTTP POSTメッセージを送信する


142

のような動的オブジェクトを送信したい

new { x = 1, y = 2 };

HTTP POSTメッセージの本文として。だから私は書こうとします

var client = new HttpClient();

方法が見つかりません

client.PostAsJsonAsync()

そこで、Microsoft.AspNetCore.Http.Extensionsパッケージをproject.jsonに追加して、

using Microsoft.AspNetCore.Http.Extensions; 

句を使用します。しかし、それは私を助けませんでした。

それでは、ASP.NET CoreでJSONボディを含むPOSTリクエストを送信する最も簡単な方法は何ですか?


回答:


205

"Microsoft.AspNet.WebApi.Client"パッケージへの参照を追加する必要があります(サンプルについてはこの記事参照してください)。

追加の拡張子なしで、あなたは標準的なPostAsync方法を使うかもしれません:

client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));

どこjsonInString値あなたが呼び出すことによって取得することができますJsonConvert.SerializeObject(<your object>);


1
ただし、Microsoft.AspNet.WebApi.ClientはASP.NET Core RC2ライブラリのようには見えません。そして、2番目の方法はコードの繰り返しが多すぎる((
Rem

@Rem 2番目の方法を使用するHttpClient 拡張メソッド(PostAsJsonAsync)を作成しないでください。コードの繰り返しを回避できます。
adem caglin

1
承知しました。しかし、何かが足りないかどうかを確認するために質問しました。まだコアに実装されていないなんて信じられません!
Rem

1
このライブラリはコア/.net標準のものではありません。System.Net.Http.Formattingはまだ移植されていないと思います
Chris S

1
これは、nugetパッケージMicrosoft.Extensions.Httpから.NET Core 2.2のIHttpClientFactoryによって作成されたHttpClientで機能します。ただし、このようにするにはどうすればよいのでしょうが、認証キーなどのヘッダーを追加します。
Nick Gallimore

98

私はこのクラスを使用します:

public class JsonContent : StringContent
{
    public JsonContent(object obj) :
        base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
    { }
}

使用例:

new HttpClient().PostAsync("http://...", new JsonContent(new { x = 1, y = 2 }));

5
拡張メソッドではないのですか?public static class JsonContent {public Task <?> PostAsJSonAsync(this HttpClient client、object toSerializeAsJson){...}}
TamusJRoyce

2
私はJsonContentクラスのアプローチが好き
Marco Alves

これはContent-Length:HTTPヘッダーを設定しますか?
Vyacheslav Napadovsky

1
@VyacheslavNapadovskyこれはHttpClient設定に依存します。たとえば、1つのセットclient.DefaultRequestHeaders.TransferEncodingChunked = true Content-LengthヘッダーTransfer-Encoding: chunkedが設定されず、代わりに設定される場合などです。ただし、のようなクライアントを作成した場合var client = new HttpClient();、ヘッダーContent-Lengthはデフォルトでこのコンテンツクラスに設定されます。
stop-cran

12

受け入れられた回答に、Acceptヘッダーも追加したいことを追加しますhttpClient

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

はい、私にもこれが必要です。postmanを使用して確認しました。
Weihui Guo

1

これは長い間.NET Coreに実装されていたと思います。

執筆時点(2019年9月)では、project.jsonNuGet 3.x +のファイルはPackageReferencehttps://docs.microsoft.com/en-us/nuget/archive/project-jsonで説明されているように)置き換えられています

クラスの*AsyncメソッドにアクセスするにはHttpClient.csprojファイルが正しく構成されている必要があります。

.csprojプレーンテキストエディターでファイルを開き、最初の行が
<Project Sdk="Microsoft.NET.Sdk.Web">
https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#theで指摘されているように)あることを確認します-csproj-format)。

クラスの*Asyncメソッドにアクセスするには、次のように、ファイルにHttpClient正しいパッケージ参照が必要です.csproj

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <!-- ... -->
</ItemGroup>

https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereferenceを参照してください。また、ASP.NET Core 2.1および後でMicrosoft.AspNetCore.Appメタパッケージを使用するhttps://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage

以下のような方法にはPostAsJsonAsyncReadAsAsyncPutAsJsonAsyncDeleteAsync今箱から出して動作するはずです。(usingディレクティブは必要ありません。)

更新: PackageReferenceタグは、.NET Core 3.0では不要になりました。


PostAsJsonAsyncを.NET Core 3.1で動作させることができませんでした。ありがとう
クリスコレンコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.