【问题标题】:Does java.net.HttpUrlConnection always throw IOException if there is an error status return by Server?如果Server返回错误状态,java.net.HttpUrlConnection是否总是抛出IOException?
【发布时间】:2016-04-03 03:37:17
【问题描述】:

我正在使用 java.net.HttpUrlConnection 向我的服务器发出 Http 请求。我意识到如果服务器返回错误状态(例如 400)。 HttpUrlConnection 会抛出对应错误状态的 IOException。

我的问题是:如果服务器返回错误状态(4xx、5xx),HttpUrlConnection 是否总是抛出 IOException?

我查看了HttpUrlConnection API 描述,但无法回答我的问题。

更新:请看我的测试:

public static void main(String[] args) {
    try {
        
        String url = "https://www.googleapis.com/oauth2/v3/userinfo?access_token=___fake_token";
        HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection();
        
        conn.getResponseCode();
        conn.getInputStream();
        
    } catch (Exception ex) {
        ex.printStackTrace();
        // Print IOException: java.io.IOException: Server returned HTTP response code: 401 for URL: https://www.googleapis.com/oauth2/v3/userinfo?access_token=abc

        // If I commented conn.getResponseCode() -> The same IOException
    }
}

谢谢!

【问题讨论】:

  • HTTP 错误 401 - 未经授权:由于凭据无效,访问被拒绝。如果满足下列条件,则会出现此行为: 您尝试查看的网站使用集成 Windows 身份验证。网站的应用程序池在身份验证过程中循环使用。

标签: java exception httpurlconnection http-status-codes


【解决方案1】:

如果您在 getInputStream() 之前检查 getResponseCode() 并且问题是 HTTP 返回代码而不是连接错误,则不会。

【讨论】:

  • 我包含了一个测试。我在 getInputStream 之前调用了 getResponseCode,我得到了 IOException。请看我的例子!
  • @Loc 在这两种情况下,getInputStream() 都会抛出异常。您的新示例是徒劳的,因为您忽略了getResponseCode() 的结果。如果您按照我的假设正确编程,您会看到该值为 401,并且根本没有尝试调用 getInputStream()
  • 我现在明白了。谢谢!
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多