是否存在验证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。通过对实体的自动反序列化,正确的数据将映射到它们的属性/类型就好了。我还使输入模型上的所有属性都可以为空,因此我们可以验证缺少的输入。如此糟糕的数据将被视为“缺少必填字段”验证。
回退使所有属性成为字符串,因此我们可以进一步验证输入似乎是向后退一步......
答案 0 :(得分:2)
我不知道最佳做法是什么(REST为解释留下了很多空间,人们选择以不同的方式做到这一点)但是,就个人而言,我会返回400 Bad Request。如果请求无效(例如,十进制或日期时间字段的字符串值无效)或由于某些验证错误而无法以其他方式提供请求,那么从我的观点来看,这是一个错误的请求。
在响应正文中,我将表示包含以下内容的错误:
code
,类似于123
; message
类似于Invalid value for field
,Validation 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"
}
对于任何类型的错误,错误消息的格式保持不变。 可以更改的是错误数组(可能为空)和根消息。