HttpClient PostAsync发布空内容

时间:2017-01-15 11:54:19

标签: c# dotnet-httpclient asp.net-core-webapi

我有一个api叫另一个。

这是我的代码,似乎在世界的另一边引起ModelState.IsValid = false

var baseUri = new Uri("http://localhost:5001/"):
_httpClient.BaseAdress = baseUri;
var data = new StringContent(content: model.Tostring(),
             encoding: Encoding.UTF8, 
             mediaType: "application/json");

var response = await _httpClient.PostAsync("api/product", data);

在正在调用的api上观看Post([FromBody]Product product)我只看到product=null

更改为Post([FromBody]object product)也会显示null

Postman调用api非常合适。将我的问题本地化为PostAsync。我的PostAsync发生了什么?

修改

我知道人们可能会建议PostAsJsonAsync,但只有在我知道PostAsync的问题后才会尝试。 :(

1 个答案:

答案 0 :(得分:2)

如评论中所示,当您致电model时,model.ToString未转换为JSON。您最终发现可以使用Json.Net将模型序列化为JsonConvert.SerializeObject(model)的JSON。这适用于将模型序列化为JSON。

您可以更进一步,创建一种扩展方法来为您执行该功能

public class JSONStringExtension {
    public static string ToJsonString(this object model) {
        if(model is string) throw new ArgumentException("mode should not be a string");
        return JsonConvert.SerializeObject(model);
    }
}

现在,您可以在模型中调用方法,并在代码中将其转换为JSON。

var baseUri = new Uri("http://localhost:5001/"):
_httpClient.BaseAdress = baseUri;
var data = new StringContent(content: model.ToJsonString(), //<--Extension method here
             encoding: Encoding.UTF8, 
             mediaType: "application/json");

var response = await _httpClient.PostAsync("api/product", data);

经常使用的PostAsJsonAsync扩展方法基本上通过为您抽象JSON序列化步骤来执行您最终实现的相同操作。在内部它调用相同的PostAsync方法。

看起来有点像这样

public static Task<HttpResponseMessage> PostAsJsonAsync(this HttpClient httpClient, string url, object content) {
    var json = JsonConvert.SerializeObject(content)
    var data = new StringContent(content: json,
                 encoding: Encoding.UTF8, 
                 mediaType: "application/json");
     return httpClient.PostAsync(url, data);
}