HttpClient PostAsync发布空内容
我有一个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
的问题后PostAsync
。 🙁
如注释中所示,当您调用model.ToString
时, model
未转换为JSON。 您最终发现可以使用Json.Net使用JsonConvert.SerializeObject(model)
将模型序列化为JSON。 这将用于将模型序列化为JSON。
您可以更进一步,创建一个扩展方法来为您执行该function
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 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); }