在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
答案 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 != 2
与http_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
}
您还可以检查其他类型的状态:
JavaDoc:Response.Status.Family
答案 3 :(得分:3)
假设http_status
是一个整数(因此除法返回一个整数),它不是更好或更快,而是不同。
它将允许任何2nn
状态代码触发该条件。 2nn
状态代码...
...表示已接收,理解客户要求的操作, 成功接受和处理。
答案 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。