![](/img/trans.png)
[英]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.