休息WebService错误处理

时间:2009-08-24 14:23:06

标签: web-services rest

我正在使用RestWebservice进行一些基本操作,比如创建/搜索。请求xml看起来像这样

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

对于成功的操作,我返回相同的客户XML,其中填充了额外的字段(例如,我们在请求中空白的systemId等)。 与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>

现在我不确定,这是否是将错误发送给客户端的正确方法。也许它应该存在于响应的标题中。

我真的很感激任何帮助。 谢谢!

2 个答案:

答案 0 :(得分:8)

错误的正确REST方法是使用HTTP状态代码(因为它听起来像你在做)。有一个令人眼花缭乱的阵列(as you can see here),您可能会惊讶地发现有多少可能适合最常见的情况。

就友好错误消息而言,您有2个选择。首先,您可以在HTTP响应(see the Wikipedia article on HTTP for more info)中的状态代码之后提供状态代码的文本描述。此文本由服务器决定 - 而不是HTTP规范 - 并为您发送的特定消息提供一些灵活性;大多数服务器端框架为您提供了一种以编程方式设置此文本的方法。然而!最好不要滥用状态代码描述,因为您无法保证用户的Web客户端是否会读取它(支持只读取状态代码和使用标准HTTP描述)。我只建议使用这种方法,如果你的状态描述很简单,你控制服务器和客户端(所以你知道你得到了什么)。根据我的经验,这种方法适用于5xx代码范围,但我不会将其用于其他许多代码。

您的第二个选项是您正在做的事情:将错误状态代码和错误描述作为消息正文返回。这是一种最佳做法;如果它适合你,不需要改变。将此视为“错误的附加信息”而不是错误消息本身(可能是HTTP响应中状态代码之后的文本)可能会有所帮助。

答案 1 :(得分:2)

我将XML包装在“Request”或“Response”包装器中。

如,

<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内置的现有错误处理,虽然我个人发现它相当受限制(不是我调查得太深)。