【问题标题】:Establishing the URLConnection to another web application does not work with URLConnection .connect()?建立与另一个 Web 应用程序的 URLConnection 不适用于 URLConnection .connect()?
【发布时间】:2012-07-26 06:05:03
【问题描述】:

这是我使用打开 URLConnection 到另一个 webapllication 的代码

try {   
 URL   url = new URL("https://mySecondWebApp/Cart");
 HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();//line1
 conn1 .connect();//line 2 does not establishes the connection
 conn1.getInputStream();// line 3 works which means that i get control to my app2 in debugger.But this also passes the control to IOException stating error java.io.FileNotFoundException: https://mySecondWebApp/Cart

 }
  catch (MalformedURLException e) {
    log.error("MalformedURLException" + e);

  }
  catch (IOException e) {

  log.info("getting IO error");
  }

我不明白为什么第 2 行没有与 app2 建立连接,而第 3 行却建立了连接? 第二件事是为什么我在第 3 行之后得到文件 notfound 异常,即使它成功连接到我想避免的 app2。我的意图 只是为了建立与 app2 的连接,以便我在 app2 的 java 代码中获得控制权

【问题讨论】:

  • 试试看HttpsURLConnection的代码,或者通过API doc,你会得到答案
  • 根据 docs.oracle.com/javase/tutorial/networking/urls/connecting.html,看起来 connect 和 get inputstream 都应该连接到 app2 。请参阅您并不总是需要的行明确地...在链接中。但在我的情况下,只有 getinputstream 这样做?不知道为什么?当我执行 conn1.getInputStream() 时,也没有得到为什么我得到 filenotfound 异常

标签: java jakarta-ee urlconnection httpsurlconnection


【解决方案1】:

方法名称可能是您混淆的根源。 openConnection() 方法不建立连接,它只是准备连接对象。这是该方法的 API 链接:

URL.openConnection()

下面是这样写的:“应该注意的是,URLConnection 实例在创建时并没有建立实际的网络连接。这只会在调用 URLConnection.connect() 时发生。”

编辑: 我混淆了这些线条(感谢 Ankit),因此上述内容不相关。 Connecet 确实建立了连接,但实际上这里不需要它,因为如果尚未建立连接,getInputStream 方法将建立连接。

【讨论】:

  • 但是 URLConnection.connect() 也没有建立 conn1.getInputStream() 确实建立了连接但问题是我也得到错误,即 java.io.FileNotFoundException: mySecondWebApp/Cart 在 conn1.getInputStream( ) 被执行
  • @A.J.:我不明白为什么第 2 行没有建立与 app2 的连接,而第 3 行却建立了连接。第 2 行是 conn1 .connect();
  • 好的,我终于找到了 :) 请查看来自@BalusC 的以下帖子:stackoverflow.com/questions/2793150/… 我所写的只是我所记得的部分内容。所以请忽略我的回答(请不要接受)并阅读此内容,因为它很可能会解释您在此阶段可能想知道的所有内容。
  • @A.J. conn1.getInputStream() 确实成功建立了连接并在 app2 上执行了代码,但问题是我也得到了错误,即 conn1.getInputStream() 执行后的 java.io.FileNotFoundException: mySecondWebApp/Cart 。我不知道如何摆脱这个以及为什么我会得到这个
  • 似乎服务器返回了一个错误,因此当您调用 getInputStream 时,您将找不到文件。尝试以下操作:用 getInputStream 注释掉该行。用connect()保留一个。在它后面添加以下内容以查看服务器返回的状态: int status = conn1.getResponseCode();你得到什么代码?
【解决方案2】:

connect() 方法不应执行此任务,来自 javadoc:

public abstract void connect()
                      throws IOException

如果此连接尚未建立,则打开指向此 URL 引用的资源的通信链接。 如果在连接已经打开时调用 connect 方法(由值为 true 的 connected 字段指示),则忽略该调用。 URLConnection 对象经历两个阶段:首先它们被创建,然后它们被连接。在创建之后和连接之前,可以指定各种选项(例如,doInput 和 UseCaches)。连接后,尝试设置它们是错误的。依赖于连接的操作,如 getContentLength,将在必要时隐式执行连接。

【讨论】:

  • 来自粗体线:“首先创建它们”,即使用 openConnection。 “那么它们就连接了”,即使用 connect() 或其他隐式连接的方法,例如 getInputStream 或 getContentLength。
  • Ankit 根据docs.oracle.com/javase/tutorial/networking/urls/connecting.html,看起来 connect 和 get inputstream 都应该连接到 app2 。请参阅您并不总是需要在链接中明确...但在我的情况下只有 getinputstream 这样做?不知道为什么?您可以通过任何方式提供您对 A.J. 的最后评论。如果我没有得到 filenotfound 异常,那么我的生活就会变得轻松
  • 尝试从您试图调用的 app2 URL 返回一些内容,返回 response.getWriter.write("write something");。另一种(不好的)方法是为您的特定异常设置 catch 块,然后在该块中不执行任何操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 2015-01-19
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多