2017-09-15 110 views
4

JSON API指定應該單獨列出屬性/參數上的多個錯誤。處理涉及多個參數的單個錯誤的最佳方法是什麼?例如,假設一個端點接受bidfold參數,但不是兩者(它們是互斥的)。如果提交了兩個參數(GET /endpoint?bid=100.00&fold=muck),應該是什麼錯誤響應?使用JSON API處理具有多個屬性或參數的錯誤

列出錯誤兩次,每次屬性一次?

{ 
    "errors": [ 
    { 
     "status": "400", 
     "source": { "parameter": "bid" }, 
     "detail": "Cannot accept both 'bid' and 'fold' parameters." 
    }, 
    { 
     "status": "400", 
     "source": { "parameter": "fold" }, 
     "detail": "Cannot accept both 'bid' and 'fold' parameters." 
    } 
    ] 
} 

結合屬性?

{ 
    "errors": [ 
    { 
     "status": "400", 
     "source": { "parameter": ["bid", "fold"] }, 
     "detail": "Cannot accept both 'bid' and 'fold' parameters." 
    } 
    ] 
} 

爲整個請求創建一個更高級別的錯誤?

{ 
    "errors": [ 
    { 
     "status": "400", 
     "source": { "pointer": "/data" }, 
     "detail": "Cannot accept both 'bid' and 'fold' parameters." 
    } 
    ] 
} 

一些其他的方式?

回答

3

TL; DR版本:第一個可能是對的。

JSONAPI規範和論壇都沒有詳細說明如何格式化互斥參數/數據上的錯誤。它確實this

服務器可以選擇停止在遇到問題儘快處理,否則可能繼續處理和遇到的多種問題。例如,服務器可能會處理多個屬性,然後在單個響應中返回多個驗證問題。

爲了更正您的問題,您要求的內容如下所示:「如果包含使用第一個參數時被禁止的第二個參數,是單個錯誤還是多個錯誤?

這表明,在一個視圖中,只有一個錯誤 - Cannot accept 'bid' when using 'fold'(或者在相反的方向上,如果您關心排序),並且該錯誤只會指向一個參數,因爲您無法遇到直到您處理了其中一個參數爲止的錯誤。

更實際的情況是,您檢查您是否同時擁有這兩個參數,並且遇到錯誤不是因爲您有一個參數,然後遇到另一個參數,而是因爲您知道您有兩個參數,現在必須處理那個問題。這仍然是一個單一的錯誤,指向兩個參數(這是你的問題的前提)。

JSONAPI spec for Error Objects指示此:

參數:一個字符串指示哪個URI查詢參數引起錯誤。

由於必須使用string(未Array)以指示錯誤的來源,並且誤差是在參數和不請求體,你必須查看此的選擇,因爲我上面佈置將其稱爲由一個參數引起的單個錯誤,或者將這兩個參數同樣歸因於相同的錯誤,就像您在第一個示例中所做的那樣。

個人而言,我更喜歡將此視爲由查詢字符串中最後一個參數引起的單個錯誤,但您的第一個選項可能是最正確的。

+0

FWIW,在我們的實現中,如果兩個參數衝突,我們只返回一個沒有錯誤的空集。我們選擇了一個有爭議的屬性來指向POST/PATCH,而不是在兩者上都做出錯誤。 – jdubjdub

2

計劃A患有這樣的事實,即現在將錯誤的全部上下文重新傳遞給調用者。例如,如果調用者修正了一個錯誤,另一個「神奇地」消失了 - 這可能會讓人感到困惑。

在方案A中,您可以添加meta選項來指出交叉鏈接的一些額外幫助。

B計劃比較感覺是正確的,因爲它捕獲了錯誤情況(多參數)的本質,並加上簡明的引腳。當然,您還需要申請API增強功能,可能需要一個source的數組。例如:

"source" : [ {parameter...}, {parameter...} ] 
+0

通過'計劃B'我假設你的意思是結合這兩個參數:''來源「:{」參數「:[」bid「,」fold「]}'。儘管對我來說聽起來也不錯,但JSON API指定「參數(應該是)指示哪個URI查詢參數導致錯誤的字符串」。我只是不想偏離規範。 –

+0

我的想法實際上是''source':[{parameter ...},{parameter ...}]'但是我明白,改變規格可能是一個漫長的過程 – Dinesh

相關問題