【问题标题】:Best practice of handling multiple http status error code in javajava中处理多个http状态错误码的最佳实践
【发布时间】:2016-02-01 20:53:53
【问题描述】:

处理多个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”;

}

我知道这是非常丑陋的代码,任何人都可以建议使用 java 程序处理 4xx 和 5xx 之间的错误代码的最佳方法,除了 404

【问题讨论】:

  • 使用 switch 语句。但是您不应该通过将多个错误合并为一个而丢失信息。使代码成为状态的一部分。

标签: java http-status-codes


【解决方案1】:

这对于 HTTP 状态码可能不是一个好的解决方案,但是关于匹配许多可能的值,您可以使用不带 break 的 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!";
}

【讨论】:

    【解决方案2】:

    由于您可以在 Java 中打开 Enum,请为可能的代码范围定义一个 Enum,例如

    public enum HttpStatusCodeRange {
    SUCCESS_RANGE, CLIENT_ERROR_RANGE, SERVER_ERROR_RANGE, UNKNOWN; }
    

    然后创建一个实用程序来计算您获得的特定代码的枚举,例如

    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;
        }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我认为这是一个很好的例子,说明 OOP 有点过头了。
      【解决方案4】:

      大概是这样的:

      if (status == 404) {
          // handle 404
      } else {
          String sstatus = '' + status;
      
          switch (sstatus.charAt(0)) {
              case '4':
                  // handle 4xx 
                  break
              case '5':
                  ...
      

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 2014-09-04
        • 2018-09-12
        • 2017-11-26
        • 1970-01-01
        相关资源
        最近更新 更多