2010-07-23 70 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

相关问题