2009-08-24 88 views
3

我正在使用RestWebservice進行少量基本操作,例如創建/搜索。請求XML看起來是這樣的其他WebService錯誤處理

<customer> 
    <name/> 
    ..... 
</customer> 

對於成功的操作我回到同一客戶XML與人口中有多餘的領域(如的systenId等我們空白的要求)。 與Response.Status = 2000

對於不成功的操作,我用不同的錯誤代碼返回類似的東西。 如Response.Status = 422(無法處理的實體) Response.Status = 500(內部服務器錯誤)和其他幾個..

<errors> 
<error> An exception occurred while creating the customer</error> 
<error> blah argument is not valid.</error> 
</errors> 

現在,我不知道,這是否發送錯誤的正確方法給客戶。也許它應該出現在響應的標題中。

我會很感激任何幫助。 謝謝!

+1

看到這個問題http://stackoverflow.com/questions/942951/rest-api-error-return-good-practices這是幾乎相同的問題。 – 2009-08-24 16:00:28

回答

2

我會將XML包裝在「請求」或「響應」包裝中。

例如,

<customerrequest> 
    <customer> 
    .. 
    </customer> 
</customerrequest> 

,更重要的是:

<customerresponse> 
    <status>success | failure</status> 
    <customer> <!-- If success --> 
    ... 
    </customer> 
    <errors> <!-- If failure --> 
    <!-- never underestimate the value of having a machine-friendly error code 
      for each possible error, or critical/non-critical errors --> 
    <error code="0001">An error occurred</error> 
    </errors> 
</customerresponse> 

這也意味着,作爲服務的成熟,可以作爲請求/響應標籤中需要添加額外的非數據字段。或參考號碼。或認證細節。

如果您使用的是SOAP,您可以使用SOAP內置的現有錯誤處理方式,儘管我個人發現它比較受限制(不是我調查得太深)。

+0

@JeeBee:如果我得到一個畸形的xml。我甚至無法解析,我將無法將響應發回錯誤標籤。 在這種情況下,我最終必須創建一個普通的errors.xml – 2009-08-24 14:40:37

+0

哦,您只是在您的REST服務中將XML作爲字符串操作?爲什麼? – JeeBee 2009-08-24 14:58:16

+0

我不是XML就像一個字符串..我正在使用xStream(庫序列化/反序列化XML)將字符串/ xml轉換爲DTO對象。然後我映射到我的域對象並對其執行所需的操作。 – 2009-08-24 15:03:54

8

錯誤的正確REST方法是使用HTTP狀態碼(因爲它聽起來像你正在做的)。有一組令人眼花繚亂的(as you can see here),你可能會驚訝地發現有多少可能適合最常見的情況。

只要友好的錯誤消息,你有2個選擇。首先,您可以在HTTP響應中的狀態代碼(see the Wikipedia article on HTTP for more info)之後提供狀態代碼的文本說明。這個文本是由服務器決定的 - 而不是HTTP規範 - 並且在你發送的特定消息中給你一些靈活性;大多數服務器端框架爲您提供了一種以編程方式設置此文本的方法。然而!最好不要濫用狀態碼描述,因爲您不能保證用戶的Web客戶端會讀取或不讀取(僅支持讀取狀態碼並使用標準的HTTP描述)。如果你的狀態描述很簡單,並且你控制服務器和客戶端(所以你知道你得到了什麼),我只會推薦使用這種方法。根據我的經驗,這種方法在5xx代碼範圍內工作得很好,但我不會在其他方面使用它。

您的第二個選擇是您已經在做的事情:將錯誤狀態代碼和錯誤描述作爲消息的主體返回。這是最佳做法;如果它爲你工作,不需要改變。將此視爲「附加信息的錯誤」而非錯誤消息本身(這可能是HTTP響應中的狀態碼之後的文本)可能很有幫助。