Rest WebService错误处理

3

我正在使用 RestWebservice 执行一些基本操作,例如创建/搜索。请求的 XML 大致如下:

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

为了操作成功,我将返回同样的客户XML,并在其中填充额外的字段(例如systemId等,在请求中为空)。 响应状态为2000。

对于操作失败,我会返回类似以下的内容,具有不同的错误代码。 例如,响应状态为422(无法处理的实体) 响应状态为500(内部服务器错误)和其他一些错误代码。

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

我不确定这是否是将错误发送给客户端的正确方式。也许它应该在响应头中存在。

非常感谢任何帮助。 谢谢!


1
请查看这个问题https://dev59.com/_HNA5IYBdhLWcg3wfN2O,它几乎是相同的问题。 - Darrel Miller
2个回答

8
正确的REST错误处理方法是使用HTTP状态码(就像您正在做的那样)。这里有很多状态码(可以在这里看到),你会惊讶地发现有许多状态码适用于大多数常见情况。
至于友好的错误信息,您有两个选择。首先,您可以在HTTP响应中的状态码后提供状态码的文本描述(请参阅HTTP的维基百科文章以获取更多信息)。这个文本是由服务器确定的,而不是HTTP规范,并且允许您在发送特定消息时具有一定的灵活性;大多数服务器端框架都提供了一种编程方式来设置此文本。然而!滥用状态码描述是最佳实践,因为您不能保证用户的Web客户端是否会读取它(而不是只读取状态码并使用标准HTTP描述)。我只建议在状态描述很简单且您控制服务器和客户端时才使用此方法(因此您知道自己得到了什么)。根据我的经验,这种方法对于5xx范围的代码非常有效,但我不会将其用于其他任何事情。
您的第二个选择是您已经在做的:返回错误状态码和错误描述作为消息正文。这是最佳实践;如果它对您有用,则无需更改。这可能有助于将其视为“错误的附加信息”,而不是错误消息本身(这将是HTTP响应中状态码后面的文本)。

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内置的现有错误处理,尽管我个人发现它有些受限制(虽然我没有深入调查)。

@JeeBee:如果我得到了一个格式错误的XML,甚至无法解析,我将无法发送带有错误标签的响应返回。 在这种情况下,我最终将不得不创建一个简单的errors.xml。 - Pratik Garg
哦,你只是在你的REST服务中将XML作为字符串进行操作?为什么呢? - JeeBee
我不只是一个字符串,而是使用xStream(一个序列化/反序列化XML的库)将字符串/XML转换为DTO对象。然后我将其映射到我的领域对象,并对其进行所需的操作。 - Pratik Garg
在这种情况下,您只需使用DTO“CustomerResponse”,其中包含一个Customer条目和一个List<Error>。如果xStream抛出解析异常,则会创建一个带有错误的空CustomerResponse,并将其发送回去。 - JeeBee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接