繁体   English   中英

HttpClient PostAsync发布空内容

[英]HttpClient PostAsync posting null content

我有一个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什么问题之后,我才会尝试。 :(

如注释中所述,当您调用model.ToString时,该model未转换为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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM