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

REST设计-验证数字字段的非数字输入?,rest,asp.net-web-api,json.net,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" }

如果数据不是正确的数据类型,是否有验证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:在幕后,我碰巧在使用微软的WebAPI/JSON.NET。通过对实体的自动反序列化,正确的数据将映射到它们的属性/类型。我还将输入模型上的所有属性都设置为可空,以便验证是否缺少输入。因此,坏数据将被视为“缺少必填字段”验证


退回到将所有属性设置为字符串,以便进一步验证输入似乎是一种倒退…

我不知道最佳做法是什么(REST留下了大量解释空间,人们选择了不同的方式),但就个人而言,我会返回一个。如果请求无效(例如,十进制或日期时间字段的字符串值无效),或者由于某些验证错误而无法提供服务,那么从我的角度来看,这是一个错误的请求

在响应主体内,我将有一个错误表示,其中包含:

  • 错误
    code
    ,类似于
    123
  • 错误
    消息
    类似于
    字段的无效值
    验证失败
    等(可能会根据
    接受语言
    客户端标题进行国际化)。如果您想明确指出问题所在,这可能是
    字段
    /
    消息
    对象的数组
此外,我不会将所有的实体属性都设置为字符串(它首先会破坏绑定实体的目的),也不会将它们设置为空以验证缺少的值(我会做相反的操作,然后)


我对Microsoft的WebAPI不是很熟悉,但您应该能够干预验证过程。对于应用程序验证,您依赖于
ModelState.IsValid
来返回
HttpStatusCode.BadRequest
,而对于纯无效数据,您可以通过某种方式自定义数据。

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

在响应主体内,我将有一个错误表示,其中包含:

  • 错误
    code
    ,类似于
    123
  • 错误
    消息
    类似于
    字段的无效值
    验证失败
    等(可能会根据
    接受语言
    客户端标题进行国际化)。如果您想明确指出问题所在,这可能是
    字段
    /
    消息
    对象的数组
此外,我不会将所有的实体属性都设置为字符串(它首先会破坏绑定实体的目的),也不会将它们设置为空以验证缺少的值(我会做相反的操作,然后)


我对Microsoft的WebAPI不是很熟悉,但您应该能够干预验证过程。对于应用程序验证,您依赖于
ModelState.IsValid
返回
HttpStatusCode.BadRequest
,而对于纯无效数据,您可以使用某种类型的数据来自定义。请看一看API中良好错误处理的详细信息。您还可以在StackOverflow中搜索“error handling[rest]”,它提供了一组很好的结果。

请看一看哪些内容详细介绍了API中良好的错误处理。您还可以在StackOverflow中搜索“error handling[rest]”,它提供了一组很好的结果。

这是我们在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"
}
对于任何类型的错误,错误消息的格式都保持不变。
可以更改的是错误数组(可能为空)和根消息。

这是我们在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"
}
对于任何类型的错误,错误消息的格式都保持不变。 可以更改的是错误数组(可能为空)和根消息