HttpClient PostAsync 发送空内容

6

我有一个API调用另一个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
你确定 model.ToString() 生成的是正确的 JSON 吗?即使是这样,你最好至少使用一个单独的方法,比如 ToJsonString,甚至不要把序列化代码放在那个类里面。 - Eugene Podskal
1
无论如何,如果没有提供 [MCVE],我们就无法提供太多帮助。 - Eugene Podskal
完全正确,@EugenePodskal。model.ToString()并没有做我想要的事情。将其更改为content: JsonConvert.SerializeObject(model)可以解决问题。这是可行的方法吗? - rethabile
假设该端点使用兼容的模型类,那应该可以正常工作。 - Eugene Podskal
1个回答

4

正如评论中所指出的那样,当您调用model.ToString时,model未被转换为JSON。您最终发现可以使用Json.Net将模型序列化为JSON,方法是使用JsonConvert.SerializeObject(model)。这适用于将模型序列化为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方法。 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接