代码之家  ›  专栏  ›  技术社区  ›  jeffl8n

URLConnection文件未找到非标准HTTP端口源的异常

  •  23
  • jeffl8n  · 技术社区  · 17 年前

    我想用阿帕奇蚂蚁 Get task 获取由我们公司的另一个团队生成的wsdl列表。他们将它们托管在上的WebLogic9.x服务器上 http://....com:7925/services/ .我可以通过浏览器访问页面,但是当我试图将页面复制到要分析的本地文件时,get任务会给我一个fileNotFoundException。我仍然能够(使用Ant任务)得到一个没有用于HTTP的非标准端口80的URL。

    我查看了Ant源代码,并将错误缩小到URLConnection。似乎URLConnection无法识别数据是HTTP流量,因为它不在标准端口上,即使协议被指定为HTTP。我使用wireshark嗅探流量,页面在整个网络中正确加载,但仍然得到filenotfoundexception。

    下面是一个示例,您将看到错误(更改了URL以保护无辜者)。引发错误 connection.getinputstream();

    import java.io.File;
    import java.io.InputStream;
    import java.net.URL;
    import java.net.URLConnection;
    
        public class TestGet {
        private static URL source; 
        public static void main(String[] args) {
            doGet();
        }
        public static void doGet() {
                try {
                source = new URL("http", "test.com", 7925,
                        "/services/index.html");
                URLConnection connection = source.openConnection();
                connection.connect();
                InputStream is = connection.getInputStream();
            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
    
    }
    
    8 回复  |  直到 8 年前
        1
  •  7
  •   objects    17 年前

    检查服务器返回的响应代码

        2
  •  46
  •   bcody    10 年前

    对HTTP请求的响应返回了状态代码404,当我调用GetInputStream()时,这导致了FileNotFoundException。我仍然想阅读回复正文,所以我必须使用不同的方法: httpurlConnection获取错误流() .

    下面是getErrorStream()的javadoc片段:

    返回错误流,如果 连接失败,但服务器已发送 但是,有用的数据。典型 例如,当一个HTTP服务器 以404响应,这将导致 要引发的FileNotFoundException 在Connect中,但服务器发送了 HTML帮助页,提供有关的建议 该怎么办。

    使用实例:

    public static String httpGet(String url) {
        HttpURLConnection con = null;
        InputStream is = null;
        try {
            con = (HttpURLConnection) new URL(url).openConnection();
            con.connect();
    
            //4xx: client error, 5xx: server error. See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.
            boolean isError = con.getResponseCode() >= 400;
            //In HTTP error cases, HttpURLConnection only gives you the input stream via #getErrorStream().
            is = isError ? con.getErrorStream() : con.getInputStream();
    
            String contentEncoding = con.getContentEncoding() != null ? con.getContentEncoding() : "UTF-8";
            return IOUtils.toString(is, contentEncoding); //Apache Commons IO
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            //Note: Closing the InputStream manually may be unnecessary, depending on the implementation of HttpURLConnection#disconnect(). Sun/Oracle's implementation does close it for you in said method.
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    throw new IllegalStateException(e);
                }
            }
            if (con != null) {
                con.disconnect();
            }
        }
    }
    
        3
  •  19
  •   Stephan    12 年前

    这是一个旧线程,但我遇到了类似的问题,并找到了一个未在此处列出的解决方案。

    我在浏览器中收到了页面,但是当我试图通过httpurlconnection访问它时得到了404。我试图访问的URL包含一个端口号。当我在没有端口号的情况下尝试时,我成功地通过httpurlConnection获得了一个虚拟页面。因此,非标准端口似乎是问题所在。

    我开始认为访问是受限的,从某种意义上说是受限的。我的解决方案是,我需要告诉服务器用户代理,并指定我期望的文件类型。我正试图读取一个.json文件,所以我认为文件类型可能也是一个必要的规范。

    我添加了这些行,最终成功了:

    httpConnection.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
    httpConnection.setRequestProperty("Accept","*/*");
    
        4
  •  2
  •   NullPointer    13 年前

    我知道这是一个旧的线索,但我发现了一个解决方案没有在这里列出。

    我试图从端口8080上的J2EE servlet中提取JSON格式的数据,但是收到了文件“找不到”错误。我能够从运行在端口80上的PHP服务器中提取相同的JSON数据。

    结果在servlet中,我需要将doget改为dopost。

    希望这能帮助别人。

        5
  •  0
  •   Daniel Martin    17 年前

    我在本地尝试过-使用提供的代码-但我没有得到 FileNotFoundException 除非服务器返回状态404响应。

    您确定要连接到的Web服务器吗?您是否有机会连接到其他Web服务器?(我注意到代码中的端口号与链接中的端口号不匹配)

        6
  •  0
  •   Steve Owens    13 年前

    我遇到了类似的问题,但原因似乎不同,这里是异常跟踪:

    java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1
        at sun.reflect.GeneratedConstructorAccessor2.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139)
        at com.doitnext.loadmonger.HttpExecution.getBody(HttpExecution.java:85)
        at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:214)
        at com.doitnext.loadmonger.ClientWorker.run(ClientWorker.java:126)
        at java.lang.Thread.run(Thread.java:680)
    Caused by: java.io.FileNotFoundException: http://myhost1:8081/test/api?wait=1
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1434)
        at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
        at com.doitnext.loadmonger.HttpExecution.execute(HttpExecution.java:166)
        ... 2 more
    

    因此,获取响应代码似乎会导致URL连接调用GetInputStream。

        7
  •  0
  •   Zyga    12 年前

    我知道这是一条旧线,但刚注意到这条线上有什么东西,所以我想我会把它放在外面。

    就像杰西卡提到的,当使用非标准端口时会抛出这个异常。

    不过,似乎只有在使用DNS时才会发生这种情况。如果我使用IP号码,我可以指定端口号,一切正常。

        8
  •  0
  •   serv-inc    8 年前

    你可以使用 OkHttp :

    OkHttpClient client = new OkHttpClient();
    
    String run(String url) throws IOException {
      Request request = new Request.Builder()
          .url(url)
          .build();
    
      Response response = client.newCall(request).execute();
      return response.body().string();
    }
    
    推荐文章