Web APIからHttpClientを使用してJsonObjectをPOSTする


288

Web APIからJsonObjectを使用HttpClientしてPOSTしようとしています。私はこれにどう対処するかよくわからないので、サンプルコードのように多くを見つけることができません。

ここに私がこれまで持っているものがあります:

var myObject = (dynamic)new JsonObject();
myObject.Data = "some data";
myObject.Data2 = "some more data";

HttpClient httpClient = new HttpClient("myurl");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = httpClient.Post("", ???);

私は自分をJsonObjectとしてキャストする必要があると思いますStreamContentが、そのステップに夢中になっています。

回答:


440

パッケージの新しいバージョンHttpClientWebApiパッケージなしでは、次のようになります。

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
var result = client.PostAsync(url, content).Result;

または、必要に応じてasync

var result = await client.PostAsync(url, content);

3
そのオーバーロードされたStringContentコンストラクターが私にとってはトリックでした。
船長、


2
using私のようにこれを投げたくなった人のために:aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
maxshuty

でも私usingStringContent創作の周りに置いた。
bcr

この回答を使用して、JSONリクエストをPOSTしていたAPI(Visual Studio 2017、.NET 4.6.2)から「400 Bad Request」応答を受け取り続けました。加えてvar content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json")私は設定する必要がありましたcontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");。詳細については、以下の回答を参照してください。
2009年

161

最も簡単な方法はStringContent、JSONオブジェクトのJSON表現でを使用することです。

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));

14
コンテンツタイプに注意してください。私はそれを省いて、思ったよりずっとずっと長い間デバッグしてもらいました。
Zapnologica 2015年

ただし、StringContentインスタンスを破棄すべきではありませんか?
Phil Haselden

63

.NETバージョンによっては、HttpClientExtensions.PostAsJsonAsyncメソッドを使用することもできます。

https://msdn.microsoft.com/en-us/library/system.net.http.httpclientextensions.postasjsonasync.aspx


4
現在、Microsoft.AspNet.Client.WebApi nugetで見つかりました
jle

2
Microsoft.AspNet.WebApi.Clientからインストールしました
Adriaan Davel '19 / 03/16

これは私の問題を解決しました。client.PostAsync、client.SendAsync。を使用して、リストであるいくつかのプロパティを含むC#クラスを渡しながら(長い)の間いじっていました。非常に複雑な結果が得られていました。配列が空の場合、私のAPIソリューションはそれを取得しますが、配列に項目がある場合、コントローラーメソッドはJSONをモデルバインドできませんでした。これをありがとう.. PostAsJsonAsyncがより確実に複雑なC#オブジェクトをJSONに変換するように思えます。
フランクリンターター2017年

このためのnugetパッケージはありますか?プロジェクトを新しいマシンに転送するときは嫌いで、この参照は常にありません。
Zapnologica 2017年

これか何かを探していますか?nuget.org/packages/Microsoft.AspNet.WebApi.Client
user3285954

51

Newtonsoft.Jsonを使用している場合:

using Newtonsoft.Json;
using System.Net.Http;
using System.Text;

public static class Extensions
{
    public static StringContent AsJson(this object o)
        => new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json");
}

例:

var httpClient = new HttpClient();
var url = "https://www.duolingo.com/2016-04-13/login?fields=";
var data = new { identifier = "username", password = "password" };
var result = await httpClient.PostAsync(url, data.AsJson())

これはasp.netコア固有のものではなく、実際には4.5.6までジェネリックです
danatcofo 2017

JsonConvert.SerializeObject使用して問題日付時刻ISO 8601種類を:ローカルまたはUTC ... hackered.co.uk/articles/...
Kiquenet

21

pomberからの回答にコメントを追加するのに十分な評判がないため、別の回答を投稿します。pomberのアプローチを使用して、JSONリクエストをPOSTしていたAPI(Visual Studio 2017、.NET 4.6.2)から「400 Bad Request」応答を受け取り続けました。最終的に問題は、StringContent()によって生成された「Content-Type」ヘッダーが正しくないことが原因でした(https://github.com/dotnet/corefx/issues/7864を参照))。

tl; dr

リクエストのヘッダーを正しく設定するには、追加の行を含むpomberの回答を使用します。

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;

回答ありがとうございます。var content = new StringContent(jsonObject.ToString()、Encoding.UTF8、 "application / json")では不十分でした。content.Headers.ContentType = new MediaTypeHeaderValue( "application / json");が必要です。私の正気を救ってくれてありがとう。
ゲイルフォーム2018

1
これはうまくいきました。「application / json」を2回設定する必要がある理由は1つです。1つはコンストラクターで、もう1回はプロパティで設定します。バグですか?
Festus Martingale、

@FestusMartingale:いい質問です!githubの問題(回答にリンクされています)を読んだ結果"application/json"StringContentコンストラクターで渡すことは、結果のcontent.Headers.ContentTypeプロパティに明示的に設定されているため、おそらく必要ありません。ただし、これをコードでテストしていません。
2009

サーバーが完全なコンテンツタイプ文字列をサポートしていないようです。ContentTypeをオーバーライドせずにコンストラクターを使用すると、値はとして設定されapplication/json; charset=utf-8ます。
Bertm13

2

vbnetのコード:

dim FeToSend as new (object--> define class)

Dim client As New HttpClient
Dim content = New StringContent(FeToSend.ToString(), Encoding.UTF8,"application/json")
content.Headers.ContentType = New MediaTypeHeaderValue( "application/json" )
Dim risp = client.PostAsync(Chiamata, content).Result

msgbox(risp.tostring)

この助けを願っています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.