检查“http_status / 100!= 2”比“http_status!= 200”更好

时间:2012-03-18 16:09:26

标签: java

blog上谈论HTTPUrlConnection时,Tim Bray为我们提供了以下用于检查HTTP状态代码的代码段

// better check it first
if (http_status / 100 != 2) {
  // redirects, server errors, lions and tigers and bears! Oh my!
}

http_status / 100!= 2 http_status更好或更快!= 200

7 个答案:

答案 0 :(得分:24)

之所以这样做是因为状态代码是整数,所以这个表达式将是整数除法

整数除法意味着 all successful HTTP status codes (即200-299的那些)会使表达式为false,而不仅仅是200.

不要挑剔Tim Bray,但如果我自己写这篇文章并想清楚表达我的意图,那么为了便于阅读,我可能希望看到更像!statusCode.isSuccessful的内容。如果您不知道HTTP 2xx意味着成功的状态代码,那么整数除法的意图是不明显的。

当然,整数除法可能比制作一堆假设的StatusCode对象然后对它们进行isSuccessful方法调度更有效。性能可能是网络库类的关键目标。


  

http_status / 100!= 2比http_status更好还是更快!= 200?

它不会更快(两个操作与一个操作),但它是否更好"是一个苹果到橙子的比较,因为这两个操作有不同的行为。

答案 1 :(得分:10)

http_status / 100 != 2http_status != 200不同。它基本上等同于(http_status < 200 || http_status > 299)(请记住,该范围内的任何内容都构成"success")。

那就是说,做分歧是可怕的,完全是钝的。我总是会使用显式比较,因为意图很清楚。

答案 2 :(得分:10)

我见过很多带有硬编码验证的代码,并经常遇到这种问题。

当我对这种代码进行重构时,我最常使用的方法是使用javax-ws中的类来实现验证: 的 javax.ws.rs.core.Response.Status.Family

类似的东西:

if(Response.Status.Family.familyOf(responseCode).equals(Response.Status.Family.SUCCESSFUL)){
    //do your thing
}

您还可以检查其他类型的状态:

  • INFORMATIONAL - 1xx
  • 成功 - 2xx
  • REDIRECTION - 3xx
  • CLIENT_ERROR - 4xx
  • SERVER_ERROR - 5xx

JavaDoc:Response.Status.Family

答案 3 :(得分:3)

假设http_status是一个整数(因此除法返回一个整数),它不是更好或更快,而是不同

它将允许任何2nn状态代码触发该条件。 2nn状态代码...

  

...表示已接收,理解客户要求的操作,   成功接受和处理。

Source

答案 4 :(得分:2)

一位支持Tim Bray的分区方法检测非200级消息的专业人士更容易进行单元测试。

以下方法需要进行三次不同的测试; 2xx,1xx和&gt; 299。

(http_status < 200 || http_status > 299)

此方法只需要两个。

http_status / 100 != 2

这并不是说使用除法与比较总是更好,但这是值得做的一点。在我正在研究的项目中,这两种方法之间的速度差异不是问题,我更喜欢Tim Bray的分割方法,因为它导致少一个测试用例需要测试。我们有严格的代码覆盖准则。

答案 5 :(得分:1)

Spring的HttpStatus提供了is2xxSuccessful()is4xxClientError()之类的方法,可用于检查HttpStatus是否属于任何特定的HTTP状态代码家族。因此,如果您想处理状态代码不属于2xx的情况,则可以执行以下操作:

if (!HttpStatus.valueOf(http_status).is2xxSuccessful()) {
   // redirects, server errors, lions and tigers and bears! Oh my!
}

答案 6 :(得分:0)

请注意,RFC 4918引入了状态代码207 Multi Status。这是为WebDAV设计的,但是当请求涉及多个资源(例如:删除一堆订单)时,某些开发人员可能会发现它很方便。

以数字2 a 207 response is expected to provide information about the status of the individual resources(例如订单)开头。这些状态之一可能是错误。

我知道这牵强附会,毫无疑问,最好检查一下您正在使用的API。