繁体   English   中英

ASP.NET Core - 使用 [HttpPost] 发布请求不适用于对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM