HttpClient PostAsync 发布空内容

Posted

技术标签:

【中文标题】HttpClient PostAsync 发布空内容【英文标题】:HttpClient PostAsync posting null content 【发布时间】:2017-01-15 11:54:18 【问题描述】:

我有一个 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() 会生成正确的 JSON 吗?即使是这样,你最好至少使用一个单独的方法,比如ToJsonString,或者根本不把序列化代码放在那个类中。 无论如何,如果没有minimal reproducible example,我们也帮不了你。 出现在@EugenePodskal 上。 model.ToString() 没有做我认为它正在做的事情。更改为content: JsonConvert.SerializeObject(model) 有效。这是一条路吗? 假设端点使用兼容的模型类应该可以工作。 【参考方案1】:

如 cmets 所示,当您调用 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);

【讨论】:

以上是关于HttpClient PostAsync 发布空内容的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient PostAsync 发布空内容

HttpClient.PostAsync 崩溃应用。如何捕捉异常?

异步等待 HttpClient.PostAsync 调用

查看 HttpClient.PostAsync 的响应正文

await HttpClient.PostAsync 方法编译错误[重复]

如何使用 HttpClient.PostAsync 发送 XML 内容?