在java中处理多个http状态错误代码的最佳实践

问题描述 投票:0回答:4

处理多个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程序

java http-status-codes
4个回答
1
投票

这可能不是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!";
}

1
投票

也许是这样的事情:

if (status == 404) {
    // handle 404
} else {
    String sstatus = '' + status;

    switch (sstatus.charAt(0)) {
        case '4':
            // handle 4xx 
            break
        case '5':
            ...

0
投票

对于不同的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
        }
    }
}

0
投票

由于您可以在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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.