web-dev-qa-db-ja.com

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

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("", ???);

私はJsonObjectStreamContentとしてキャストする必要があると思いますが、私はそのステップでハングアップしています。

225
Mark

HttpClientの新しいバージョンがあってWebApiパッケージがなければ、それは次のようになります。

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

非同期にしたい場合は、

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

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

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

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

https://msdn.Microsoft.com/ja-jp/library/system.net.http.httpclientextensions.postasjsonasync.aspx

51
user3285954

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())
35

Pomberからの回答にコメントを追加するのに十分な評判がないので、私は別の回答を投稿しています。 Pomberのアプローチを使用して、JSONリクエストをPOSTしていたAPIから "400 Bad Request"レスポンスを受け取り続けました(Visual Studio 2017、.NET 4.6.2)。最終的には、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;
18
anthls

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)

この助けを願っています

0