374

JsonObjectWebAPIから使用をPOSTしようとしていHttpClientます。私はこれをどうやって行うのかよくわかりませんし、サンプルコードの方法で多くを見つけることができません。

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

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そのステップでハングアップしています。

4

8 に答える 8

593

パッケージの新しいバージョンがある場合HttpClientとない場合は、次のようになります。WebApi

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);
于 2016-09-09T14:45:01.360 に答える
171

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

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));
于 2011-05-24T23:18:15.273 に答える
74

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

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

于 2015-08-10T23:08:31.363 に答える
64

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())
于 2017-07-05T23:41:16.257 に答える
24

pomberからの回答にコメントを追加するのに十分な評判がないので、別の回答を投稿します。pomberのアプローチを使用して、JSONリクエストをPOSTしたAPI(Visual Studio 2017、.NET 4.6.2)から「400BadRequest」応答を受信し続けました。最終的に、問題は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;
于 2018-05-28T02:54:50.777 に答える
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)

この助けを願っています

于 2018-11-13T09:51:18.067 に答える
0

ポンバーありがとうございますが

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

使用しました

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

結果は高いリクエストに対してアプリをロックするため

于 2020-12-20T08:42:45.157 に答える
0

私は、この仕事をすべての人と私自身へのメモとして行うときに、すべてを1つの応答で答えたいと思います。

Serezの回答によると、HttpContent派生クラスのリストは以下のとおりです https://stackoverflow.com/a/42380027/914284

HttpClient PostAsyncには、作業しているコンテキストに応じていくつかの背景があります。

  • サーバーコンテキストが次のように待機する場合に備えて、サーバーに送信するタイプごとにデータを投稿できます。
    [HttpPost]
    public async Task<IActionResult> Submit(MyModel model)
    [HttpPost]
    public async Task<IActionResult> Submit([FromForm] MyModel model)
    [HttpPost]
    public async Task<IActionResult> Submit([FromBody] MyModel model)

FromFormまたはBodyを作成する場合、FromFormとして機能します。FromBodyにはjsonコンテンツが必要です。それ以外の場合は、行としてKeyValuePairsが必要です。以下のように、両方の実装がいくつかあります。

FromFormの場合:拡張機能を使用しました

public static class HelperExtensions
    {
        public static FormUrlEncodedContent ToFormData(this object obj)
        {
            var formData = obj.ToKeyValue();

            return new FormUrlEncodedContent(formData);
        }

        public static IDictionary<string, string> ToKeyValue(this object metaToken)
        {
            if (metaToken == null)
            {
                return null;
            }

            // Added by me: avoid cyclic references
            var serializer = new JsonSerializer { ReferenceLoopHandling = ReferenceLoopHandling.Ignore };
            if (metaToken is not JToken token)
            {
                // Modified by me: use serializer defined above
                return ToKeyValue(JObject.FromObject(metaToken, serializer));
            }

            if (token.HasValues)
            {
                var contentData = new Dictionary<string, string>();
                foreach (var child in token.Children().ToList())
                {
                    var childContent = child.ToKeyValue();
                    if (childContent != null)
                    {
                        contentData = contentData.Concat(childContent)
                                                 .ToDictionary(k => k.Key, v => v.Value);
                    }
                }

                return contentData;
            }

            var jValue = token as JValue;
            if (jValue?.Value == null)
            {
                return null;
            }

            var value = jValue?.Type == JTokenType.Date ?
                            jValue?.ToString("o", CultureInfo.InvariantCulture) :
                            jValue?.ToString(CultureInfo.InvariantCulture);

            return new Dictionary<string, string> { { token.Path, value } };
        }
    }

FromBodyの場合:任意のjsonコンバータライブラリNewtonsoftまたはmicrosoftを使用します

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

どちらの場合も、コンテンツタイプは要件に従って定義する必要があります。たとえば、json(ヘッダーへの書き込み)の場合です。

request.Headers.Accept.Clear();
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

または別の使用法

        using (var content = new StringContent(JsonConvert.SerializeObject(answer), System.Text.Encoding.UTF8, "application/json"))
        {
            var answerResponse = await client.PostAsync(url, content);
            //use await it has moved in some context on .core 6.0
        }

コンテキストで承認を使用する必要がある場合は、以下のように承認を提供することもできます。

httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");
于 2021-09-12T08:51:50.607 に答える