wai*_*rit 6 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);
Run Code Online (Sandbox Code Playgroud)
看着Post([FromBody]Product product)被称为api的api我只是看到了product=null.
改变Post([FromBody]object product)也显示null.
调用api Postman完美无缺.将我的问题本地化PostAsync.我的情况怎么样PostAsync?
编辑:
我知道人们可能会建议PostAsJsonAsync,但我会在我知道问题出在后才会尝试PostAsync.:(
正如评论中所指出的,model当您调用model.ToString. 您最终发现可以使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以在模型上调用该方法并将其转换为代码中的 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);
Run Code Online (Sandbox Code Playgroud)
经常使用的扩展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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6044 次 |
| 最近记录: |