【问题标题】:Getting http 407 error as an IOException获取 http 407 错误作为 IOException
【发布时间】:2013-09-24 20:38:57
【问题描述】:

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

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

【问题讨论】:

  • 你找到解决方案了吗?托尼奥的回答没有帮助。

标签: java android httpurlconnection


【解决方案1】:

尽管这个问题已经很老了,但我没有找到具体的答案,仅供参考:

根据我对 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);

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 为什么投反对票?建议的解决方案不起作用吗?它不再相关(两年前的答案,不会感到惊讶!)?
    • 我没有对你投反对票,但我猜是谁投了反对票,因为 HttpResponseException 是错误的。查看getResponseCode()的源码,它调用了getInputStream(),在Android的HttpConnectionImpl.java中,任何>=400的HTTP响应码都会抛出FileNotFoundException。见来源:android.googlesource.com/platform/libcore/+/…
    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2016-08-16
    • 2014-09-14
    • 2012-03-18
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多