【问题标题】:Validate input to a POST request?验证 POST 请求的输入?
【发布时间】:2020-03-07 09:04:24
【问题描述】:

我已经为 REST POST api 端点做了一个控制器,如下

public IActionResult POST([FromBody]Person person) 
{ 
    ....
} 

其中 Person 被定义为

public class Person 
{
   public string Name {get; set;}
   public int Age {get; set;}
}

意味着发布请求能够反序列化这样的输入

{
  "Name": "Peter", 
  "Age": 2
}

没有任何问题...

当我传递类似

的东西时会出现问题
{
  "Name": "Peter", 
  "Age": 2, 
  "Error": 123123123
}

它仍然会创建一个Person,其中前两个已填写..

我想在这里触发一个错误,指出输入格式错误。

我正在存储第一个输入 - 然后使用它根据第一个输入比较下一个输入。 如果它们相同 - 什么都不应该发生。

但是由于最后一个输入包含一个无效字段,但输入创建的实际实例与第一个完全相似 - 我收到一个错误,它们不相等?

我假设 JSON 中的 error 语句以某种方式存储在新实例中? 但是我如何确保在控制器根据 JSON 输入创建实例之前验证输入?

【问题讨论】:

  • 你使用核心还是标准mvc项目?
  • @IvanSmyrnov 我正在使用 Core

标签: c# json asp.net-core controller json-schema-validator


【解决方案1】:

1) 要验证您的 Person 模型,您可以使用类似

using System.ComponentModel.DataAnnotations;
public class Person
{
    [Required]
    [StringLength(250, MinimumLength = 2)]
    public string Name { get; set; }

    [Required]
    [Range(1, 121)]
    public int Age { get; set; }
}

在控制器的 POST 操作中,您可以使用 if(!ModelState.IsValid){.....}

2) 要比较两个 Person 实例是否相等,您可以覆盖 Equals():

public class Person
{
    ...
    ...
    public override bool Equals(object obj) =>
        (obj is Person otherPerson) ? (Name,Age) == (otherPerson.Name,otherPerson.Age): false;
}

这里将当前实例的名称和年龄与其他实例的名称和年龄进行比较。它将允许使用if ( person.Equals ( someOtherPErsonInstance ) ){....}

3) 如果您需要确保 POST 请求中不存在额外字段,您可以添加自定义实现 IModelBinder,或在 POST 操作中接受原始数据,然后解析和检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2012-02-15
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多