c# - HttpClient PostAsync 发布空内容

标签 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 有什么问题后,我才会尝试它。 :(

最佳答案

如评论中所述,当您调用 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);
}

关于c# - HttpClient PostAsync 发布空内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660792/

相关文章:

c# - 如何将项目添加到 List<T> 的开头?

c# - 简单登录的 MVC 模式中组件的职责是什么

c# - 如何使用 itextsharp C# 从签名字段中删除有效性未知图标?

c# - 在 Windows Server 2012 R2 上发送 http/2 请求

authentication - Asp.net core 2 - Web Api 中的外部身份验证

javascript - 使用 Blazor 重写 JavaScript 单击和显示 UI

c# - 为什么 RestSharp 请求方法从 POST 更改为 GET?

c# - 正确中止或取消 PostAsync

c# - 从 swagger 响应中排除 ef 虚拟属性

asp.net-core - .NET Core 3.1 WebApi 项目 + NTLM 认证