将HTTP 407错误作为IOException

时间:2013-09-19 16:24:55

标签: java android httpurlconnection

我在我的Android应用程序中使用HttpURLConnection通过需要身份验证的代理。这是我的代码,我会在遇到问题后解释你。

HttpURLConnection connection = null;
int responseCode = -1;
try {
    connection = (HttpURLConnection) myUrl.openConnection();
    connection.setInstanceFollowRedirects(false);
    connection.setConnectTimeout(DEFAULT_TIMEOUT);
    connection.setReadTimeout(DEFAULT_TIMEOUT);

    responseCode = connection.getResponseCode();
    System.out.println("ResponseCode = " + responseCode);
} catch (IOException e) {
    System.out.println("Exception : " + e.getMessage());
}

我的问题是我在getResponseCode()方法上得到一个例外,它有以下消息:Failed to authenticate with proxy。 通常,这个特定的错误有一个http错误代码:407。但是这里我得到了一个异常,但没有一个带有407值的响应代码。

我有解决方案来应用登录名和密码来连接代理,但是我想仅在出现407错误的情况下应用此解决方案(而不是每次我都捕获异常)。

任何想法都将受到赞赏。 感谢。

2 个答案:

答案 0 :(得分:0)

即使问题很老,我也没有找到具体答案,仅供参考:

根据我对Java 8的观察,示例中的getResponseCode是实际请求服务器的第一种方法,这就是为什么在此行上获得IOException的原因。

实际上getInputStream是实际建立连接的触发因素,但是我不建议直接使用它(因为实现可能会改变)。不幸的是,调用connections.connect()不能按预期方式工作,并且不会引发异常。

最后connection.getResponseCode()在抛出异常后 也可以工作,即使发生异常,这也将是获取响应代码的关键:

HttpURLConnection connection = null;
int responseCode = -1;
try {
    connection = (HttpURLConnection) myUrl.openConnection();
    connection.setInstanceFollowRedirects(false);
    connection.setConnectTimeout(DEFAULT_TIMEOUT);
    connection.setReadTimeout(DEFAULT_TIMEOUT);

    responseCode = connection.getResponseCode();
} catch (IOException e) {
    responseCode = connection.getResponseCode();
}
System.out.println("ResponseCode = " + responseCode);

答案 1 :(得分:-1)

尝试捕获HttpResponseException,并检查其状态代码(.getStatusCode()),看它是否为407(或更好,HttpURLConnection.HTTP_PROXY_AUTH,更具可读性。)

HttpResponseExceptionIOException的子类,我认为这是被抛出的实际异常。

http://developer.android.com/reference/org/apache/http/client/HttpResponseException.html了解更多信息。)