2017-01-11 52 views
3

如果已經有答案,我表示歉意。我發現了相關的問題(例如HTTP status code for a partial successful request),但不完全一樣。只有部分數據可用時檢索資源的HTTP響應

我正在構建一個API,該API返回來自多個來源的聚合數據。有時,某些關鍵部分數據不可用,客戶端必須知曉,並且錯誤數據包含在響應中。

除了缺失字段的嚴重性以外,其餘資源是有效且有用的,可被視爲部分更新(例如,如果您只有權限查看部分資源)。

到目前爲止,該選項

  1. 回200,認爲這是一個局部的資源,在應用程序處理錯誤數據字段,你會與任何其他數據
  2. 回報207來強調它不是完全成功,但207並不嚴格HTTP。
  3. 返回500,你會在200

我偏愛選項1,但我不完全相信在應用程序中處理成功返回的數據。有沒有一種清晰的方式來處理這個問題?也許定義一個特定的content-type

+0

它的主觀性,我個人認爲500是合適的,因爲數據是錯誤的,因爲它不符合相應的請求的期望。您可以添加您喜歡的任何自定義響應標題,例如'X-Response-Type:partial'並指示您的客戶在處理響應數據前參考該值,前提是他們收到代碼500 –

+0

Hi @AlexK。我可以看到500的情況,但由於我們專門以有用的方式處理數據缺失,並且資源可以(並且)以一致的方式返回,所以200會更合適。如果你想繪製一個平行線,我會說它類似於處理的異常,代碼中,而500將類似於未處理的異常。也許這不是一個好的平行?我們正在返回一個內容類型,突出顯示這些信息只是爲了提醒客戶。這是否從你的POV有意義? – guioconnor

+0

個人而言,我會返回'200'並指出響應正文(您的選項#1)中缺少哪些數據。據我所知,REST非常以資源爲中心,因爲在你的情況下,資源是**有效和有用的**(換句話說,「它存在」),'200'似乎是最好的選擇。 這也可能不是一個好主意,用'content-type'來欺騙,因爲這可能會讓一些客戶感到困惑。只要用簡單的'application/json'(或XML)即可。 我還注意到很多API往往會向'200'方向「錯誤」,並將豐富狀態作爲數據返回。似乎更多的「慣用」這種方式。 – sigriston

回答

2

由於500表示系統或通信鏈路故障,並且由於數據已返回,因此必須假定資源已存在並且已找到,因此您在這裏忽略了一點。 OP表示的是部分結果,意味着與資源有關的複合數據。這在http的範圍之外是必須的,它通過成功的200完成了它的工作,除非你選擇了一個部分數據是錯誤的,因此是40x的合同。

+0

但是我的想法正確(我想我可以在我的問題上更清楚)系統依賴於來自多個來源的彙總數據,並且由於隨機原因導致無法使用源,因此各個字段可能會丟失。換句話說,就是溝通鏈上的失敗。問題是,在一個複雜的彙總系統中,這些故障可能是常見的,那麼正確的狀態代碼將返回什麼。 – guioconnor