在JAX-RS的响应中将自定义错误代码返回给客户端

时间:2014-01-22 07:44:34

标签: java rest jax-rs http-status-codes

我是JAX-RS的新手并且还在学习它,所以我的问题可能有点幼稚,所以请耐心等待:)

我一直在经历各种SO问题“http响应的错误代码”。我发现只要一个人不想迂腐,他就可以在回复中返回4xx状态代码。

我也经历了此RFS 2616 W3

链接

我想知道是否有任何一般做法可以返回标准HTTP响应状态代码以外的自定义错误代码。

例如,如果在post请求中通过userid获取用户信息,则返回错误,如果userid无效/不存在。在这种情况下,HTTP状态422听起来空闲。但是如果需要详细的错误描述,可以自定义错误,如40xx,其中xx是除了http错误之外的值,返回给客户端。

同样可以定义和返回40xx以响应客户端吗? (在请求中使用正确的语法)

4001 - userid无效

4002 - 帖子ID无效

等..

或者我应该返回4xx状态代码并在响应正文中添加自己的代码以获取更多错误详细信息?

3 个答案:

答案 0 :(得分:12)

如果您正在开发不会公开的内部系统,那么您可以使用自定义代码。另一方面,如果您想公开一些API,最好坚持使用标准代码,并在状态原因短语或实体主体中提供更多信息。

在JAX-RS中,您可以创建自己的状态(或覆盖标准状态的原因短语),如:

public static class CustomBadRequestType implements Response.StatusType {

    @Override
    public int getStatusCode() {
        return 400;
    }

    @Override
    public String getReasonPhrase() {
        return "My Reason";
    }

    @Override
    public Response.Status.Family getFamily() {
        return Response.Status.Family.CLIENT_ERROR;
    }
}

然后将状态设置为Response.ResponseBuilder

Response.status(new CustomBadRequestType()).build();

答案 1 :(得分:1)

可以使用更多自定义代码扩展现有界面(并保留现有代码),如下所示:

public enum CustomResponseStatus implements Response.StatusType {
    OK(Response.Status.OK.getStatusCode(), "OK"),
    CREATED(Response.Status.CREATED.getStatusCode(), "Created"),
    INVALID_INPUTS(419, "Invalid inputs");
}

您可以将CustomResponseStatus代码设置为Response对象的一部分,如下所示

ResponseBuilder.status(CustomResponseStatus.INVALID_INPUTS).build();

答案 2 :(得分:1)

如果自定义状态介于整数102和599(含)之间,则还可以选择使用int值设置状态:

ResponseBuilder.status(451).build();

事实上,即使使用自定义状态代码,也强烈建议使用标准分组(1xx,2xx,3xx,4xx,5xx)。 (提供的示例应该是4xx客户端错误。)