在他的博客上谈论HTTPUrlConnection时,Tim Bray为我们提供了以下用于检查HTTP状态代码的代码段
// better check it first
if (http_status / 100 != 2) {
// redirects, server errors, lions and tigers and bears! Oh my!
}
Run Code Online (Sandbox Code Playgroud)
是HTTP_STATUS/100!= 2或好或快于HTTP_STATUS!= 200
Joh*_*lla 24
之所以这样做是因为状态代码是整数,所以这个表达式将是一个整数除法.
整数除法意味着所有成功的HTTP状态代码(即200-299的那些代码)将使表达式为假,而不仅仅是200.
不要挑剔Tim Bray,但如果我自己写这篇文章并且想清楚表达我的意图,那么为了便于阅读,我可能希望看到更像的东西!statusCode.isSuccessful.如果您不知道HTTP 2xx意味着成功的状态代码,那么整数除法的意图就不明显了.
当然,整数除法可能比制作一堆假设的StatusCode对象然后isSuccessful对它们进行方法调度更有效.性能可能是网络库类的关键目标.
http_status/100!= 2比http_status更好还是更快!= 200?
它不会更快(两个操作与一个操作),但它是否"更好"是苹果与橙子的比较,因为这两个操作具有不同的行为.
小智 12
我见过许多带有硬编码验证的代码,并经常遇到这种问题.
当我对这种代码进行重构时,我最常用的方法是使用javax-ws中的类实现验证: javax.ws.rs.core.Response.Status.Family
这样的事情:
if(Response.Status.Family.familyOf(responseCode).equals(Response.Status.Family.SUCCESSFUL)){
//do your thing
}
Run Code Online (Sandbox Code Playgroud)
您还可以检查其他类型的状态:
JavaDoc:Response.Status.Family
Mad*_*hat 10
Spring 的HttpStatus提供了诸如等方法is2xxSuccessful(),is4xxClientError()可用于检查 是否HttpStatus属于任何特定的 HTTP 状态代码系列。
因此,如果您想处理状态代码不属于 2xx 的情况,您可以执行以下操作:
if (!HttpStatus.valueOf(http_status).is2xxSuccessful()) {
// redirects, server errors, lions and tigers and bears! Oh my!
}
Run Code Online (Sandbox Code Playgroud)
赞成 Tim Bray 检测非 200 级消息的除法方法的一位专家是,它更容易进行单元测试。
下面的这个方法需要测试三个不同的时间;2xx、1xx 和 > 299。
(http_status < 200 || http_status > 299)
Run Code Online (Sandbox Code Playgroud)
这种方法只需要两个。
http_status / 100 != 2
Run Code Online (Sandbox Code Playgroud)
这并不是说使用除法比使用比较总是更好,但这是值得提出的一点。在我正在进行的一个项目中,这两种方法之间的速度差异不是问题,我更喜欢 Tim Bray 的除法方法,因为它可以减少一个需要测试的测试用例。我们对代码覆盖率有严格的指导方针。
| 归档时间: |
|
| 查看次数: |
15021 次 |
| 最近记录: |