如何解决ASP.NET Core-使用[HttpPost]的发布请求不适用于对象
我正在尝试执行一个简单的POST请求,但是[FromBody]
似乎不能理解两个以上的参数。
请求:
[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。当我将价格从双精度更改为字符串时,字符串始终为null
解决方法
默认的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请求后在控制器中看到正确的数据
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。