[英]DocuSign REST API Creating a Non-Numeric RecipientId Causes Invalid Recipient ID Error When Adding Tabs
[英]REST design - Validating non-numeric input, to a numeric field?
在数据不是正确数据类型的情况下,是否存在验证REST请求的一般做法? (例如:将“差值”提交给int)
例如,如果我们有一个“商店商品”实体,具有混合数据类型:
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。 通过自动反序列化到实体,正确的数据将映射到其属性/类型。 我还使输入模型上的所有属性都可以为空,因此我们可以验证缺少的输入。 因此,不良数据将被视为“缺少必填字段”验证。
回到使所有属性成为字符串,以便我们进一步验证输入似乎倒退了一步……
我不知道最佳实践是什么(REST留下了很多解释的空间,人们选择了不同的方式进行解释),但是我个人会返回400 Bad Request 。 如果请求无效(例如,十进制或日期时间字段的字符串值无效)或由于某些验证错误而无法以其他方式提供服务,那么从我的角度来看,这是一个错误的请求。
在响应体内,我将具有以下错误的表示形式:
code
,如123
; message
,例如Invalid value for field
,“ Validation failed
等(可能会国际化,具体取决于“ Accept-Language
客户端标头)。 如果您要明确指出问题出在哪里,则可能是field
/ message
对象的数组。 另外,我不会将所有实体属性都设置为字符串(这违背了让实体首先绑定到的目的),也不会使它们全部为空以验证缺失值(我会做相反的事情并使用[Required]
)。
我对Microsoft的WebAPI不太熟悉,但是您应该可以介入验证过程。 对于应用程序验证,您依赖ModelState.IsValid
返回HttpStatusCode.BadRequest
而对于普通无效数据,则可以使用某种HTTP消息处理程序自定义参数绑定 。
看看http://soabits.blogspot.dk/2013/05/error-handling-considerations-and-best.html ,其中详细介绍了API中良好的错误处理。 您也可以在StackOverflow上搜索“错误处理[休息]”,这将提供很好的结果。
这就是我们在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"
}
对于任何类型的错误,错误消息的格式均保持不变。 可以更改的是错误Array(它可能为空)和根消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.