【发布时间】:2016-03-24 10:26:23
【问题描述】:
当我看到 SO 时,我的问题的典型答案是这样的:
HttpURLConnection httpConn = (HttpURLConnection)_urlConnection;
InputStream _is;
if (httpConn.getResponseCode() == 200) {
_is = httpConn.getInputStream();
} else {
/* error from server */
_is = httpConn.getErrorStream();
}
来自Read error response body in Java
这似乎很合理,但是当我查看HttpURLConnection.getResponseCode() 的实现时,它所做的第一件事就是调用getInputStream()。根据文档getInputStream() 应该在出现错误时抛出 IOException,因此如果响应代码不在 200 范围内,上述解决方案将始终抛出异常!
我在这里错过了什么吗?如果出现错误,如果给我响应代码的函数会在这种情况下抛出,我应该如何获取响应代码?
这对我来说是 java.net.HttpURLConnection.java 中的 getResponseCode() 的样子:
public int getResponseCode() throws IOException {
// Call getInputStream() first since getHeaderField() doesn't return
// exceptions
getInputStream();
String response = getHeaderField(0);
if (response == null) {
return -1;
}
response = response.trim();
int mark = response.indexOf(" ") + 1;
if (mark == 0) {
return -1;
}
int last = mark + 3;
if (last > response.length()) {
last = response.length();
}
responseCode = Integer.parseInt(response.substring(mark, last));
if (last + 1 <= response.length()) {
responseMessage = response.substring(last + 1);
}
return responseCode;
}
【问题讨论】:
-
很好奇。当我查看它时,它所做的第一件事就是查看
responseCode是否已设置,如果已设置,则返回它。它所做的下一步 是调用getInputStream(),在try块中。我建议你再看看。 -
android 的实现有没有可能和一般的java 不一样?
-
@Pragnani 是的,它确实发生了变化。目前他们正在使用自己的实现。
-
包全名为 java.net.HttpURLConnection (android-21)
-
@DaedalusAlpha - 我给了你解释