如何创建有意义的REST响应消息?

时间:2013-07-04 12:49:26

标签: rest get jersey

我创建了一个REST服务,我想知道将有意义的消息发送到GET请求的最佳做法是什么。基本上我的GET请求返回一个特定的对象,如下所示;

@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;
}

这很有效,除非出现错误,响应只会发回一个空列表!更有用的是解释问题所在的信息。但是我无法发回String消息,因为返回类型是List!

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

3 个答案:

答案 0 :(得分:5)

如果客户端出错,请使用HTTP Response codes。如果找不到某个项目,那么您的回复将为404 Not Found。如果用户没有访问对象的权限,则返回403 Forbidden。目前您正在回复一个200 OK,说一切都没问题。

如果在服务器端出现错误,您实际上并不想将该信息发送给您的客户。在服务器上捕获错误并使用它做一些有意义的事情(比如记录它),这样你就可以更改代码,使其不再发生。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

  • 301 Moved Permanently - 如果资源已移至
  • 400 Bad Request - 如果客户端请求无法解析,即客户端在请求中发送无感参数
  • 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注释进行序列化。