2013-07-04 21 views
3

我已经创建了一个REST服务,我想知道发送有意义的消息到GET请求的最佳做法是什么。基本上我的GET请求返回一个特定的对象,像这样;如何创建有意义的REST响应消息?

@GET 
@Path("/examsple") 
@Produces(MediaType.APPLICATION_JSON) 
public List<SomeObject> retrieveSomeObjs() { 

    List<SomeObject> result = new ArrayList<>(); 
    try { 
     result = ... Get SomeObjects ...; 
    } catch (Exception e) { 
     ... Deal with exception ... 
    } 
    return result; 
} 

这很好用,除非有错误时响应只是发回一个空的List!更有用的信息是解释问题所在。但是我不能发回String消息,因为返回类型是List!

我目前的解决方案是将返回类型更改为一个Map,然后我可以返回包含在Map中的对象以及任何消息。然而,它在客户端有点凌乱,我想知道是否有内置解决方案或“接受”解决方案。

+0

会发生什么样的错误?服务器上的某些内容是否损坏?客户是否提供错误的投入? – 2013-07-04 12:57:39

回答

5

如果客户端发生了错误,则使用HTTP Response codes。如果没有找到物品,那么您的回复将是404 Not Found。如果用户没有访问对象的权限,则返回403 Forbidden。目前,您正在回应200 OK,如果没有,则表示一切正常。

如果在服务器端发生错误,您并不想将该信息发送给客户端。在服务器上捕获错误并对其执行一些有意义的操作(如记录它),以便可以更改代码,使其不再发生。

+1

+1表示“你的回答是200 OK”,表示一切都没问题。“ – Vilsepi

+0

奇妙的是,我没有意识到Response有能力包装物体。出于某种原因,我认为它只能返回一个状态。 – tarka

1

您可以在标头中返回HTTP错误状态码,并使用描述异常的对象返回JSON响应正文。

1

如前所述GET请求一些常见的错误代码包括:

  • 301 Moved Permanently - 如果资源已被移动
  • 400 Bad Request - 如果客户端请求unaccaptable,即如果客户端在请求中发送无感参数
  • 401 Unauthorized - 如果客户端未提供任何有效凭证
  • 403 Forbidden - 如果客户端授权,但不允许执行请求(你也可以在这种情况下返回404隐瞒该资源在所有存在)
  • 404 Not Found - 如果所请求的资源可能不被发现

我通常创建一个POJO来表示这些错误消息,然后使用Jersey Response对象返回它。

例如错误对象可能看起来像这样:

public class ApiError { 

    private String status; 
    private String code; 
    private String message; 
    private String developerMessage; 

    // Getters and Setters here 

} 

要恢复它,你可以做以下(即在你的catch块或自定义ExceptionMapper):

ApiError error = new ApiError("409", "409-1", message, developerMessage); 
return Response.status(Response.Status.CONFLICT).entity(error).build(); 

这样您可以提供格式良好的JSON/XML错误消息,其中包含开发人员的自定义错误代码和更多信息。错误实体将按照您的@Produces注释序列化。