URL可以通过浏览器访问,但仍然可以通过URLConnection访问FileNotFoundException

时间:2011-11-26 14:49:28

标签: java

我使用HttpURLConnection连接到网站并收到ResponseCode = 404(HTTP_NOT_FOUND)。但是我在浏览器(IE)中打开网站没有问题。

为什么会有差异,我该怎么办呢?

问候,帕万

这是我的程序

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
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://localhost:8080/");

            System.out.println("Url is" + source.toString());

            URLConnection connection = source.openConnection();
            connection.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
            connection.setRequestProperty("Accept","*/*");
            connection.setDoInput(true);
            connection.setDoOutput(true);

            System.out.println(((HttpURLConnection) connection).getResponseCode());
            BufferedReader rdr = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            StringBuffer b = new StringBuffer();
            String line = null;
            while (true) {
                line = rdr.readLine();
                if (line == null)
                    break;
                b.append(line);
            }

        } catch (Exception e) {
            e.printStackTrace();
            System.err.println(e.toString());
        }
    }

}

堆栈跟踪

Url ishttp://localhost:8080/
404
java.io.FileNotFoundException: http://localhost:8080/
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at TestGet.doGet(TestGet.java:28)
    at TestGet.main(TestGet.java:11)
Caused by: java.io.FileNotFoundException: http://localhost:8080/
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at TestGet.doGet(TestGet.java:26)
    ... 1 more
java.io.FileNotFoundException: http://localhost:8080/

6 个答案:

答案 0 :(得分:15)

您收到404错误,表示找不到请求的响应。首先,您需要确保服务器位于http://localhost:8080/并且必须返回一些代码为200的内容。如果没有,那么我们无法帮助您。

测试网址上是否有任何内容的最简单方法是将网址粘贴到网络浏览器地址栏上,然后点击“开始”。但是,这并不能保证Java代码能够访问它。例如,如果服务器设计为在无法找到Web浏览器User-Agent标头时响应404。

由于服务器返回状态代码(200或404),这意味着这不是防火墙问题。

根据您最新版本的问题,您可以使用网络浏览器查看它,但无法使用您的Java代码下载它,并且标题似乎设置正确。我只能看到两个问题:

  1. 您不应将connection.setDoOutput(true);设为true。这将强制连接以执行HTTP POST而不是GET,并且服务器可能不支持POST。

  2. 您的服务器可能总是返回404,即使它应该是200.由于Web浏览器不关心错误状态并尝试呈现所有内容,所以它似乎在Web浏览器中工作。如果是这样,您应该先修复服务器以正确响应,否则请尝试获取错误流HttpURLConnection#getErrorStream()

答案 1 :(得分:2)

我有类似的问题。对我来说,使用RawCap检查数据包是有帮助的。 RawCap是少数可以让你嗅探localhost的Windows数据包嗅探器之一。

在我的情况下,由于身份验证问题,服务器返回了404.

答案 2 :(得分:0)

如果可以在网络浏览器中很好地访问网址http://localhost:8080/,则代码应该可以正常运行。我在我的机器上运行程序,效果很好。因此,您必须检查网络服务器服务是否正常。

答案 3 :(得分:0)

我知道这在游戏中已经很晚了,但我最近才遇到同样的问题,这里没有一个解决方案适合我。在我的情况下,我实际上有另一个进程在同一个端口上运行,正在窃取来自Java应用程序的请求。使用yair的回答here,您可以检查在同一端口上运行的进程,如下所示:在命令提示符下,在Windows上执行netstat -nao | find "8080"或在Linux上执行netstat -nap | grep 8080。它应该显示一条LISTENING和127.0.0.1:8080的行,接下来将是进程ID。只要终止这个过程,你就应该好好去。

答案 4 :(得分:0)

我也遇到了这个问题。在我的情况下,我在url字符串中有一个不可见的unicode字符。所以连接无法打开它(FileNotFound表明)。我删除它并且它有效。

答案 5 :(得分:0)

我有一个类似的情况,即Web服务正确地处理来自浏览器的POST请求(在我的情况下是Postman,一个测试Chrome扩展的API),但是HttpURLConnection一直无法使用404来处理大型有效负载。我错误地认为问题必须在我的HttpURLConnection客户端代码中。

当我后来尝试使用大型有效负载从cUrl复制请求时,我得到了相同的404错误。尽管我使用了Postman生成的cUrl代码,因此它应该与Postman的请求相同,但Web服务对这两个请求的反应却有所不同。 Postman上的一些客户端中间件可能截获并修改了请求。

TL; DR

检查网络服务。这可能是罪魁祸首。尝试使用其他非浏览器准系统Http客户端(如cUrl)来查看Web服务如何对其做出反应。