2010-07-23 72 views
5

我正在編寫一個基於REST的Web服務,並且試圖找出處理錯誤情況的最佳方法。在調用REST服務期間傳遞錯誤消息的正確方法?

目前該服務正在返回HTTP錯誤,例如錯誤請求,但是如何返回額外信息以便爲開發人員提供使用Web服務的想法,以瞭解他們做錯了什麼?

例如:使用空用戶名創建用戶會返回錯誤的請求錯誤。我怎樣才能添加錯誤是由空的用戶名參數引起的?

回答

2

在HTTP規範中指出,大多數錯誤代碼應該返回一些基本文本,以說明錯誤返回的原因。基本的Java Servlet規範爲此定義了HttpServletResponse.sendError(int Code, String message)

4

根據HTTP spec,在三位數字響應代碼「Reason-Phrase」之後的文本只能用邏輯對等代碼代替。所以你不能迴應400 null user,並期望發生任何有用的事情。的確,客戶端不需要檢查或顯示原因詞組。

一般來說,HTTP響應實體(通常伴隨響應的頁面)應包含到客戶端的有用信息,引導他們前進,即使當響應是錯誤的。在網絡上,大多數errors都是HTML,並且沒有機器可讀信息,但大多數瀏覽器確實向用戶顯示錯誤(並且SO的錯誤頁面非常好!)。

所以對於一個主要機器可讀的資源,你有兩個選擇:

  1. 傳遞一個人類可讀的消息呢。返回400 Bad Request帶有HTML響應,客戶可能會選擇向用戶顯示該響應。這很容易,但它有點像就像拋出一個未經檢查的異常,它將所有的辛苦工作傳遞給客戶端,或者確實是最終用戶。
  2. 允許客戶恢復。返回400 Bad Request,其機器可讀響應屬於您的API的一部分,因此客戶端可以從已知錯誤狀況中恢復。這很難,就像拋出一個檢查異常,它成爲API的一部分,它允許客戶端如果他們想要優雅地恢復。

你甚至可以通過定義馬希可讀的錯誤恢復文檔介質類型使服務器支持這兩種情況下,並允許客戶端「接受」他們:Accept: application/atom+xml, application/my.proprietary.errors+json

客戶,就是忘記必填字段可以通過選擇錯誤媒體類型來選擇獲取機器可讀錯誤或人類可讀錯誤。

+0

+1,現在做一些REST的工作,這個帖子確實節省了時間,非常感謝! – Anders 2010-07-31 23:34:08

+0

不客氣。但我還沒有實踐我所說的話。我只在文本/純文本類型上傳遞堆棧跟蹤。這沒有錯,但它不是人類可讀的。 – mogsie 2010-07-31 23:40:46

+0

但明顯的原因短語確實可以使寫作測試更容易;) – fumanchu 2012-01-21 18:06:29

0
String desc = "my Description"; 
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(desc).type("text/plain").build()); 
+0

這是哪種語言? – 2012-10-27 17:49:28

相關問題