如何创建有意义的REST响应消息?
问题描述:
我已经创建了一个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中的对象以及任何消息。然而,它在客户端有点凌乱,我想知道是否有内置解决方案或“接受”解决方案。
答
如果客户端发生了错误,则使用HTTP Response codes。如果没有找到物品,那么您的回复将是404 Not Found
。如果用户没有访问对象的权限,则返回403 Forbidden
。目前,您正在回应200 OK
,如果没有,则表示一切正常。
如果在服务器端发生错误,您并不想将该信息发送给客户端。在服务器上捕获错误并对其执行一些有意义的操作(如记录它),以便可以更改代码,使其不再发生。
答
您可以在标头中返回HTTP错误状态码,并使用描述异常的对象返回JSON响应正文。
答
如前所述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
注释序列化。
会发生什么样的错误?服务器上的某些内容是否损坏?客户是否提供错误的投入? – 2013-07-04 12:57:39