【问题标题】:Java HttpURLConnection doesn't connect when I call connect()当我调用 connect() 时,Java HttpURLConnection 没有连接
【发布时间】:2011-01-10 05:12:19
【问题描述】:

我正在尝试编写一个程序来对我的 web 应用程序进行自动化测试。为此,我使用 HttpURLConnection 打开了一个连接。

我尝试测试的其中一个页面执行 302 重定向。我的测试代码如下所示:

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
connection.connect();
system.out.println(connection.getURL().toString());

因此,假设 urlToSend 是 http://www.foo.com/bar.jsp,并且此页面会将您重定向到 http://www.foo.com/quux.jsp。我的 println 语句应该打印出http://www.foo.com/quux.jsp,对吧?

错了。

重定向永远不会发生,它会打印出原始 URL。但是,如果我通过调用 connection.getResponseCode() 来切换掉 connection.connect() 行,它会神奇地起作用。

URL currentUrl = new URL(urlToSend);
HttpURLConnection connection = (HttpURLConnection) currentUrl.openConnection();
//connection.connect();
connection.getResponseCode();
system.out.println(connection.getURL().toString());

为什么我会看到这种行为?我做错什么了吗?

感谢您的帮助。

【问题讨论】:

    标签: java url connection http-status-code-302 httpurlconnection


    【解决方案1】:

    在你的 onCreate 中添加以下内容

    StrictMode.ThreadPolicy policy = new StrictMode.
    ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy); 
    

    【讨论】:

      【解决方案2】:

      connect() 方法在 URLConnection 类中实现,不会被HttpURLConnection 类覆盖。

      URLConnection 类不知道 HTTP,因此即使它正在创建真正的连接,也不应遵循 HTTP 重定向。

      如果您想要 HTTP 协议固有的行为,您可能希望坚持使用 HttpURLConnection 类中实现的方法,就像 getResponseCode() 方法一样。

      【讨论】:

        【解决方案3】:

        试试setFollowRedirects,它可能会有所帮助。实际上,首先尝试getFollowRedirects 看看是否是问题所在(不太可能,因为默认情况下是真的)。

        编辑:如果这不是你的问题,我会尝试从连接中读取一些东西(就像你对 getResponseCode 所做的那样,但我也会尝试 getHeaderField 看看是否读取任何东西导致重定向受到尊重)。

        【讨论】:

        • 已经尝试过了,getFollowRedirects 返回 true。另外,我在单独的测试中遇到了 setFollowRedirects 的单独问题。基本上, setInstanceFollowRedirects() 不做任何事情,而 setFollowRedirects() 做它应该做的事情。但是,我认为最好在单独的帖子中询问,因为这是一个单独的问题。
        • @sangfroid 我想你会发现你必须从连接中实际读取一些内容才能读取/尊重重定向。
        【解决方案4】:

        connect() 方法只是创建一个连接。您必须提交请求(通过调用getInputStream()getResponseCode()getResponseMessage())才能返回和处理响应。

        【讨论】:

        • 谢谢,看来确实是这样!
        • 谢谢你!一直试图理解为什么人们在没有调用 connect() 的情况下发出 getInputStream() 等。你刚刚向我澄清了这一点。
        【解决方案5】:

        你为什么不使用 apache 中的HttpClient

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-07
          • 2012-12-04
          • 1970-01-01
          • 2015-07-31
          • 1970-01-01
          • 2011-03-01
          • 2014-01-06
          相关资源
          最近更新 更多