REST设计 - 验证非数字输入到数字字段?

时间:2014-06-07 04:21:20

标签: rest asp.net-web-api json.net

是否存在验证REST请求的一般做法,其中数据不是正确的数据类型? (例如:将“坏值”提交给int)

例如,如果我们有一个“Shop item”实体,具有混合数据类型:

id: int
title: string
price: decimal
expiry: datetime

我们使用错误数据的响应测试REST端点上的“添加”操作:

{
    "title": "New item"
    "price": "bad value"
    "expiry": "Not a date"
}

问题:回复包含错误数据的请求是否有一般做法?

具体 - 我是否需要错误代码/描述来告诉他们字段数据无效?是否适合回到“必填字段”消息? (这两种情况都可以作为HTTP 400返回)

此外,WebAPI / JSON.NET:在幕后,我碰巧使用的是Microsoft的WebAPI / JSON.Net。通过对实体的自动反序列化,正确的数据将映射到它们的属性/类型就好了。我还使输入模型上的所有属性都可以为空,因此我们可以验证缺少的输入。如此糟糕的数据将被视为“缺少必填字段”验证。

回退使所有属性成为字符串,因此我们可以进一步验证输入似乎是向后退一步......

3 个答案:

答案 0 :(得分:2)

我不知道最佳做法是什么(REST为解释留下了很多空间,人们选择以不同的方式做到这一点)但是,就个人而言,我会返回400 Bad Request。如果请求无效(例如,十进制或日期时间字段的字符串值无效)或由于某些验证错误而无法以其他方式提供请求,那么从我的观点来看,这是一个错误的请求。

在响应正文中,我将表示包含以下内容的错误:

  • 错误code,类似于123;
  • 错误message类似于Invalid value for fieldValidation failed等(可能是国际化的,具体取决于Accept-Language客户端标头)。如果您想明确说明问题所在,可能是field / message个对象的数组。

另外,我不会将所有实体属性都设置为字符串(它首先使实体无法绑定到目的)并且不会使它们全部为空以验证缺失值(我会做相反的事情)和use [Required])。

我对Microsoft的WebAPI不太熟悉,但您应该能够干预验证过程。对于应用验证,您依靠ModelState.IsValid返回HttpStatusCode.BadRequest,而对于普通无效数据,您可以使用某种parameter binding自定义HTTP message handler

答案 1 :(得分:1)

查看http://soabits.blogspot.dk/2013/05/error-handling-considerations-and-best.html,其中详细介绍了API中的错误处理。您还可以搜索StackOverflow以进行"错误处理[rest]"这给出了一组很好的结果。

答案 2 :(得分:1)

这是我们在API中处理它的方式:

{
  "code": 422,
  "errors": [
    {
      "field": "title",
      "message": "can't be blank"
    },
    {
      "field": "price",
      "message": "must be greater than 0"
    },
    {
      "field": "expiry",
      "message": "wrong date format"
    }
  ],
  "message": "Validation failed"
}

对于任何类型的错误,错误消息的格式保持不变。 可以更改的是错误数组(可能为空)和根消息。