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

Java URL可以通过浏览器访问,但仍然可以通过URLConnection访问FileNotFoundException,java,Java,我使用HttpURLConnection连接到一个网站并接收一个ResponseCode=404(HTTP\u NOT\u FOUND)。但是,我在浏览器(IE)中打开网站没有问题 为什么会有不同,我能做些什么 你好,帕万 这是我的节目 import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import jav

我使用HttpURLConnection连接到一个网站并接收一个ResponseCode=404(HTTP\u NOT\u 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/

如果可以在web浏览器中很好地访问url,那么代码应该可以很好地工作。我在我的机器上运行这个程序,它运行得很好。因此,您必须检查Web服务器服务是否正常。

您收到404错误,这意味着找不到请求的响应。首先,您需要确保在
http://localhost:8080/
并且它必须返回一些代码为200的内容。如果没有,那我们就帮不了你

测试url上是否有任何内容的最简单方法是将url粘贴到web浏览器地址栏上,然后单击go。但是,这并不保证Java代码能够访问它。例如,如果服务器设计为在找不到web浏览器
用户代理
标题时响应404

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

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

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

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


  • 我知道这已经很晚了,但我最近遇到了同样的问题,这里没有一个解决方案对我有效。在我的例子中,我实际上在同一个端口上运行了另一个进程,该进程从java应用程序窃取请求。使用yair的回答,您可以检查在同一端口上运行的进程,如下所示:在命令提示符下,在Windows上执行
    netstat-nao |查找“8080”
    ,或在Linux上执行
    netstat-nap | grep8080
    。它应该显示一行带有侦听和127.0.0.1:8080的代码,下一行是进程ID。只要终止进程,您就可以开始了。

    我也遇到了类似的问题。对我来说,它有助于检查包使用。RawCap是为数不多的允许您嗅探本地主机的Windows数据包嗅探器之一


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

    我也有这个问题。在我的例子中,url字符串中有一个不可见的unicode字符。因此,连接无法打开它(FileNotFound表示)。我删除了它,它就工作了。

    我有一个类似的场景,web服务正确地处理了来自浏览器的POST请求(在我的例子中是Postman,一个测试Chrome扩展的API),但HttpURLConnection一直失败,因为有一个404用于大有效负载。我错误地认为问题一定出在我的HttpURLConnection客户端代码中

    当我后来试图用一个大负载复制来自cUrl的请求时,我得到了相同的404错误。尽管我使用了由Postman生成的cUrl代码(因此应该与Postman的请求相同),但web服务对这两个请求的响应方式存在差异。Postman上的一些客户端中间件可能拦截并修改了请求

    TL;博士


    检查web服务。这可能是罪魁祸首。请尝试另一个非浏览器的裸体Http客户端,如cUrl,以查看web服务对它的反应。

    您是否能够访问该url?是否也可以发布堆栈跟踪?您的服务器是否返回404?请勾选:抱歉,回复太晚。这是stackTrace java.io.FileNotFoundException:位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知源代码)java.io.FileNotFoundException:这给了您什么
    ((HttpURLConnection)urlc).getResponseCode()
    ?谢谢Andy,但我如何才能确保这已联系到Web服务器服务?我遇到了相同的问题,这是由设置
    connection.setDoOutput(true)引起的您是如何删除它的?我还得到了结尾带有\r的json字符串