4

我在我的 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 错误的情况下应用此解决方案(而不是每次我捕捉到异常)。

任何想法将不胜感激。谢谢。

4

2 回答 2

0

即使这个问题已经很老了,我也没有找到具体的答案,所以仅供参考:

根据我对 Java 8 的观察,getResponseCode在您的示例中是实际请求服务器的第一种方法,这就是为什么您会IOException在这条线上得到。

引擎盖下getInputStream是实际建立连接的触发器,但是我不建议直接使用它(因为实现可能会改变)。不幸的是,调用connections.connect()没有按预期工作,也没有抛出异常。

finally在抛出异常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);
于 2020-06-05T06:22:10.120 回答
-1

尝试使用 catchHttpResponseException代替,并检查其状态代码 ( .getStatusCode()) 以查看它是否为 407(或者更好HttpURLConnection.HTTP_PROXY_AUTH,更具可读性)。

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

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

于 2014-08-29T19:55:19.630 回答