使用HttpClient从Web API发布JsonObject

Mar*_*ark 259 c# asp.net wcf wcf-web-api asp.net-web-api

我正在尝试从Web API发布一个JsonObject使用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("", ???);
Run Code Online (Sandbox Code Playgroud)

我想我需要把我JsonObject当成一个StreamContent但是我已经挂了这一步.

pom*_*ber 387

使用新版本的HttpClient并且没有WebApi包它将是:

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

或者如果你想要它是异步的:

var result = await client.PostAsync(url, content);
Run Code Online (Sandbox Code Playgroud)

  • 在通过https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html调用Async方法上的Result之前请三思而后行 (18认同)
  • 使用此答案,我不断收到来自我将 JSON 请求发布到(Visual Studio 2017,.NET 4.6.2)的 API 的“400 Bad Request”响应。除了 `var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json")` 我必须设置 `content.Headers.ContentType = new MediaTypeHeaderValue("application/json");`。有关更多详细信息,请参阅下面的答案。 (5认同)
  • 对于任何想像我一样使用“使用”的人来说:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ (4认同)
  • 那个重载的StringContent构造函数对我有用. (3认同)

car*_*ira 159

最简单的方法是使用StringContent带有JSON对象的JSON表示的a.

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));
Run Code Online (Sandbox Code Playgroud)

  • 记下内容类型.我把它拿出来让我调试的时间比我想要的要长. (13认同)
  • 难道你不应该 Dispose StringContent 实例吗? (2认同)

use*_*954 55

根据您的.NET版本,您也可以使用HttpClientExtensions.PostAsJsonAsync方法.

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

  • 现在可以在Microsoft.AspNet.Client.WebApi nuget中找到 (4认同)
  • 我刚刚从Microsoft.AspNet.WebApi.Client安装了它 (2认同)

Mat*_*kan 44

如果使用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");
}
Run Code Online (Sandbox Code Playgroud)

例:

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())
Run Code Online (Sandbox Code Playgroud)


ant*_*hls 18

我没有足够的声誉来为pomber的答案添加评论,所以我发布了另一个答案.使用pomber的方法,我一直收到来自我将JSON请求发布到(Visual Studio 2017,.NET 4.6.2)的API的"400 Bad Request"响应.最终问题被追溯到StringContent()生成的"Content-Type"标头不正确(请参阅https://github.com/dotnet/corefx/issues/7864).

TL;博士

使用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;
Run Code Online (Sandbox Code Playgroud)