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 将模型序列化为 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
方法。
看起来有点像这样
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);
}
我有一个 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 将模型序列化为 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
方法。
看起来有点像这样
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);
}