处理多个http状态错误代码的最佳做法是什么,例如,我想处理除404之外的所有4xx和5xx状态代码。
我的当前实现如下:(我只放置示例代码)
if ( HTTP.STATUS == 500 || HTTP.STATUS == 502 || HTTP.STATUS == 503 || HTTP.STATUS == 400
|| HTTP.STATUS == 401 || HTTP.STATUS == 402 || HTTP.STATUS == 403) {
String status = “Failed to send”;
}
我知道这是非常难看的代码,任何人都可以建议处理4xx和5xx之间的错误代码的最佳方法,除了404使用java程序
这可能不是HTTP状态代码的好解决方案,但是在匹配许多可能的值方面,您可以使用不带中断的switch语句将它们全部堆叠:
String status = null;
switch (HTTP.STATUS) {
case 400:
case 401:
case 402:
case 403:
case 500:
case 502:
case 503:
status = “Failed to send”;
break;
default:
status = "All ok!";
}
也许是这样的事情:
if (status == 404) {
// handle 404
} else {
String sstatus = '' + status;
switch (sstatus.charAt(0)) {
case '4':
// handle 4xx
break
case '5':
...
对于不同的HTTP状态响应,最好发送特定消息。看这里:http://racksburg.com/choosing-an-http-status-code/
你也可以制作一些像这样的通用方法:
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable ex) {
ErrorMessage errorMessage = new ErrorMessage();
setHttpStatus(ex, errorMessage);
errorMessage.setCode(AppConstants.GENERIC_APP_ERROR_CODE);
errorMessage.setMessage(ex.getMessage());
StringWriter errorStackTrace = new StringWriter();
ex.printStackTrace(new PrintWriter(errorStackTrace));
errorMessage.setDeveloperMessage(errorStackTrace.toString());
errorMessage.setLink(AppConstants.BLOG_POST_URL);
return Response.status(errorMessage.getStatus())
.entity(errorMessage)
.type(MediaType.APPLICATION_JSON)
.build();
}
private void setHttpStatus(Throwable ex, ErrorMessage errorMessage) {
if(ex instanceof WebApplicationException ) {
errorMessage.setStatus(((WebApplicationException)ex).getResponse().getStatus());
} else {
errorMessage.setStatus(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); //defaults to internal server error 500
}
}
}
由于您可以在Java中打开Enums,因此可以为可能的代码范围定义Enum,例如:
public enum HttpStatusCodeRange {
SUCCESS_RANGE, CLIENT_ERROR_RANGE, SERVER_ERROR_RANGE, UNKNOWN; }
然后创建一个实用程序来计算您获得的特定代码的Enum,例如
public static HttpStatusCodeRange getRange(int code) {
if (code >= 200 && code < 300) {
return HttpStatusCodeRange.SUCCESS_RANGE;
}
if (code >= 400 && code < 500) {
return HttpStatusCodeRange.CLIENT_ERROR_RANGE;
}
if (code >= 500 && code < 600) {
return HttpStatusCodeRange.SERVER_ERROR_RANGE;
}
return HttpStatusCodeRange.UNKNOWN;
}
然后你可以编写相当简洁的代码来处理你的HTTP响应代码,例如
HttpStatusCodeRange range = HttpStatusCodeRangeUtil.getRange(response.getStatus());
switch (range) {
case SUCCESS_RANGE :
handleSuccess();
break;
case CLIENT_ERROR_RANGE :
handleClientError();
break;
case SERVER_ERROR_RANGE :
handleServerError();
break;
case UNKNOWN :
handleUnexpectedError();
break;
default :
handleUnknownError();
break;
}