我是JAX-RS的新手并且还在学习它,所以我的问题可能有点幼稚,所以请耐心等待:)
我一直在经历各种SO问题“http响应的错误代码”。我发现只要一个人不想迂腐,他就可以在回复中返回4xx状态代码。
链接我想知道是否有任何一般做法可以返回标准HTTP响应状态代码以外的自定义错误代码。
例如,如果在post请求中通过userid获取用户信息,则返回错误,如果userid无效/不存在。在这种情况下,HTTP状态422听起来空闲。但是如果需要详细的错误描述,可以自定义错误,如40xx,其中xx是除了http错误之外的值,返回给客户端。
同样可以定义和返回40xx以响应客户端吗? (在请求中使用正确的语法)
4001 - userid无效
4002 - 帖子ID无效
等..
或者我应该返回4xx状态代码并在响应正文中添加自己的代码以获取更多错误详细信息?
答案 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客户端错误。)