3

我创建了一个 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;
}

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

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

4

3 回答 3

5

如果客户端出错,则使用HTTP 响应代码。如果未找到某个项目,那么您的响应将是404 Not Found. 如果用户没有访问对象的权限,则返回一个403 Forbidden. 目前,您的回应200 OK是,如果不是,一切都很好。

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

于 2013-07-04T12:55:58.213 回答
1

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

  • 301 Moved Permanently- 如果资源已被移动
  • 400 Bad Request- 如果客户端请求不可接受,即客户端在请求中发送无意义参数
  • 401 Unauthorized- 如果客户端没有提供任何有效的凭据
  • 403 Forbidden- 如果客户端被授权但不允许执行请求(在这种情况下您也可以返回 404 以隐藏该资源根本存在)
  • 404 Not Found- 如果找不到请求的资源

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

例如,错误对象可能如下所示:

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注释进行序列化。

于 2013-07-04T13:55:22.940 回答
1

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

于 2013-07-04T12:52:58.223 回答