我试图从Web API使用HttpClient POST一个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("", ???);

我认为我需要将我的JsonObject转换为StreamContent,但我在这一步上被挂断了。


当前回答

谢谢你pomber

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

我使用

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

因为结果使应用程序锁定高请求

其他回答

最简单的方法是使用StringContent,使用JSON对象的JSON表示形式。

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

我花了好几个小时才解出来。 但是@anthls anwser救了我的命。

var data = new StringContent(JsonConvert.SerializeObject(new
   {
      abc = "jsjs",
      xyz = "hhhh"
    }));
data.Headers.ContentType = new MediaTypeHeaderValue("application/json"); // <--
var response = await client.PostAsync(url, data);

我也遇到过同样的问题

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json"); 

gave

“400个坏请求”

单独序列化JsonObject并在StringContent()中传递字符串解决了我的问题,不需要设置Encoding。use UTF8分开。

我没有足够的声誉来评论pomber的答案,所以我发布了另一个答案。使用pomber的方法,我不断收到来自我正在发布JSON请求的API的“400个坏请求”响应(Visual Studio 2017, . net 4.6.2)。最终问题被追踪到StringContent()产生的“Content-Type”报头不正确(参见https://github.com/dotnet/corefx/issues/7864)。

博士tl;

使用pomber's answer和额外的一行来正确设置请求的头部:

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

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

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