[英]ASP.NET Core - Post requests using [HttpPost] not working for objects
我正在尝试做一个简单的 POST 请求,但似乎[FromBody]
似乎无法理解超过 2 个参数。
请求:
[HttpPost]
public IEnumerable<EnergyMarket> addEnergy([FromBody] EnergyMarket energyMarket)
{
_energyMarketService.addEnergy(energyMarket.Name, energyMarket.StockIPO, energyMarket.EnergyPrice);
return _energyMarketService.Energies;
}
物体:
public class EnergyMarket
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("stockipo")]
public string StockIPO { get; set; }
[JsonProperty("price")]
public double EnergyPrice { get; set; }
public EnergyMarket() { }
public EnergyMarket(string name, string stockIPO, double val)
{
this.Name = name;
this.StockIPO = stockIPO;
this.EnergyPrice = val;
}
}
请求(内容类型为 application/json)
{
"name": "Air Canada",
"stockipo": "AC.TO",
"price": 13.12
}
当我继续 POSTMAN 并提出以下请求时,它对前两个参数工作正常,但price
始终为 0。当我将价格从双精度更改为字符串时,字符串始终为空。
默认 ASP.NET Core 模型绑定器不使用 Newtonsoft.Json 属性特性。 因此,我们应该自己实现它。
首先,创建IModelBinder
实现,该实现将读取请求正文并使用 Newtonsoft JsonConvert.DeserializeObject
方法对其进行反序列化
public class NewtonsoftModelBinder : IModelBinder
{
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
string valueFromBody = string.Empty;
using (var sr = new StreamReader(bindingContext.HttpContext.Request.Body))
{
valueFromBody = await sr.ReadToEndAsync();
}
if (string.IsNullOrEmpty(valueFromBody))
{
return;
}
try
{
var model = JsonConvert.DeserializeObject(valueFromBody, bindingContext.ModelType);
bindingContext.Result = ModelBindingResult.Success(model);
}
catch
{
bindingContext.ModelState.TryAddModelError(
"", "Model can not be deserialized.");
}
return;
}
}
然后有多种方法可以将其应用于我们的代码,但最简单的一种方法是将其作为属性放在您的EnergyMarket
类中
[ModelBinder(BinderType = typeof(NewtonsoftModelBinder))]
public class EnergyMarket
{
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("stockipo")]
public string StockIPO { get; set; }
[JsonProperty("price")]
public double EnergyPrice { get; set; }
public EnergyMarket() { }
public EnergyMarket(string name, string stockIPO, double val)
{
this.Name = name;
this.StockIPO = stockIPO;
this.EnergyPrice = val;
}
}
最后,我们可以在 Postman 请求后在控制器中看到正确的数据
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.