簡體   English   中英

REST設計-驗證非數字輸入到數字字段?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM