2011-05-24 127 views
136

我試圖使用來自Web API的HttpClient發佈JsonObject。我不太清楚如何去解決這個問題,並且無法找到很多示例代碼。從Web API發佈帶有HttpClient的JsonObject

這是我到目前爲止有:

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,但我發現掛了這一步。

回答

148

隨着新版本的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); 
+0

重載StringContent構造函數爲我做了竅門。 – 2018-01-25 13:30:40

149

最簡單的方法是使用StringContent,並使用JSON對象的JSON表示。

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

請注意內容類型。我離開了它,讓我調試的時間比我想要的要長得多。 – Zapnologica 2015-06-11 20:02:21

35

根據你的.Net版本,你也可以使用HttpClientExtensions.PostAsJsonAsync方法。

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

+2

現在發現在Microsoft.AspNet.Client.WebApi nuget – jle 2016-02-09 19:08:22

+1

我剛剛從Microsoft.AspNet.WebApi.Client – 2016-03-19 12:23:05

+0

安裝它解決了我的問題。我在爲一個(很長一段時間)在傳遞一個包含一些使用client.PostAsync,client.SendAsync的屬性的C#類時亂搞亂七八糟。我得到的結果非常混雜。如果數組是空的,我的API解決方案會檢測它,但是如果數組有一個控制器方法無法模型綁定JSON。感謝這..看起來PostAsJsonAsync更可靠地將複雜的C#對象轉換爲JSON。 – 2017-03-18 01:01:34

17

如果使用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()) 
+0

這是不是特定於asp.net核心,其實際通用甚至4.5.6 – danatcofo 2017-07-20 15:08:26

+0

'JsonConvert.SerializeObject'問題使用*** DateTimes ISO 8601 ***類型:本地或UTC ... http:// www。 hackered.co.uk/articles/useful-c-extensions-for-working-with-iso-8601-dates-and-strings – Kiquenet 2018-02-23 13:42:29