在调用REST服务期间传递错误消息的正确方法?

时间:2010-07-23 05:41:09

标签: rest

我正在编写基于REST的Web服务,我正在尝试找出处理错误情况的最佳方法。

目前该服务正在返回HTTP错误,例如错误请求,但是如何返回额外信息以便让使用Web服务的开发人员明白他们做错了什么?

例如:使用null用户名创建用户会返回错误请求错误。如何添加错误是由null用户名参数引起的?

3 个答案:

答案 0 :(得分:4)

根据HTTP spec,三位数响应代码“Reason-Phrase”之后的文本只能替换为逻辑等效。因此,您无法回复400 null user并期望发生任何有用的事情。实际上,客户端不需要检查或显示Reason-Phrase。

通常,HTTP响应实体(通常是响应附带的页面)应该包含对客户端有用的信息,以指导它们前进,即使响应是错误的。在网络上,大多数此类errors都是HTML,并且没有机器可读信息,但大多数浏览器确实向用户显示错误(而且SO的错误页面非常好!)。

因此,对于主要是机器可读的资源,您有两个选择:

  1. 无论如何都要传递人类可读的消息。使用HTML响应返回400 Bad Request,客户可以选择向用户显示该响应。这很容易,但它有点就像抛出未经检查的异常,它将所有艰苦的工作传递给客户端,或者最终用户。
  2. 允许客户恢复。使用机器可读响应返回400 Bad Request,该响应是API的一部分,因此客户端可以从已知错误条件中恢复。这更难,例如抛出一个已检查的异常,它成为API的一部分,并且它允许客户端在需要时优雅地恢复。
  3. 您甚至可以通过为 machie可读错误恢复文档定义媒体类型来使服务器支持这两种方案,并允许客户“接受”它们:Accept: application/atom+xml, application/my.proprietary.errors+json

    忘记必填字段的客户可以通过选择Accept错误媒体类型来选择获取机器可读错误或人为可读错误。

答案 1 :(得分:2)

答案 2 :(得分:0)

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