URL可以通过浏览器访问,但使用URLConnection时仍出现FileNotFoundException错误

10

我使用HttpURLConnection连接到一个网站时,收到了ResponseCode = 404(HTTP_NOT_FOUND)的响应。但是在我的浏览器(IE)中打开该网站没有问题。

为什么会有这样的差异,我该怎么办?

谢谢,Pavan

这是我的程序:

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/

2
你能够访问那个URL吗? - jmj
1
你的服务器返回了404错误吗?请查看此链接:https://dev59.com/mHNA5IYBdhLWcg3wfN6O - Kai Sternad
抱歉回复晚了。这是 stackTrace:java.io.FileNotFoundException: http://localhost:8080/middleware 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 中。java.io.FileNotFoundException: http://localhost:8080/middleware - Pavan Kumar
这个代码 ((HttpURLConnection) urlc).getResponseCode() 给你什么? - gigadot
请注意,我已更新我的问题(包括堆栈跟踪)。 - Pavan Kumar
显示剩余2条评论
6个回答

15

你得到了404错误,这意味着请求的响应未找到。首先,你需要确保有一个在http://localhost:8080/上提供服务的服务器,并且它必须返回代码200的一些内容。如果没有,那么我们无法帮助你。

测试URL是否存在的最简单方法是将URL粘贴到Web浏览器地址栏中并单击“转到”。但是,这并不保证Java代码能够访问它。例如,如果服务器设计为响应404,如果它无法找到Web浏览器User-Agent头,则会出现问题。

由于服务器返回一个状态代码,要么是200要么是404,这意味着这不是防火墙问题。

根据你最新的问题描述,你可以使用Web浏览器查看它,但无法使用Java代码下载它,而且标头似乎已正确设置。我只看到两个问题:

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

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


4
我遇到了相同的问题,原因是设置了connection.setDoOutput(true); - Mridang Agarwalla

2
我曾经遇到过类似的问题。对我有帮助的是使用RawCap来检查数据包。RawCap是为数不多的能够嗅探本地主机的Windows数据包嗅探器之一。
在我的情况下,服务器由于身份验证问题返回了404错误。

0

我知道这已经在游戏中非常晚了,但是最近我遇到了同样的问题,这里的解决方案都不适用于我。在我的情况下,实际上有另一个进程在相同的端口上运行,它从Java应用程序那里窃取了请求。使用yair的答案这里,你可以像这样检查是否有一个在相同端口上运行的进程:在命令提示符中,对于Windows系统,执行netstat -nao | find "8080";对于Linux系统,执行netstat -nap | grep 8080。它应该显示一行带有“LISTENING”和“127.0.0.1:8080”的信息,接下来是进程ID。只需终止该进程,你就可以继续进行了。


0

我曾经遇到过类似的情况,即 Web 服务正确处理来自浏览器(在我的情况下是 Postman,一款 API 测试 Chrome 扩展程序)的 POST 请求,但 HttpURLConnection 在处理大负载时则返回 404。我错误地认为问题必须出在我 HttpURLConnection 客户端代码中。

后来我尝试使用 cUrl 模拟带有大负载的请求,结果也收到了相同的 404 错误。即使我使用了 Postman 生成的 cUrl 代码,因此应该与 Postman 的请求完全相同,但 Web 服务对这两个请求的响应方式却存在差异。某些客户端中间件可能截获并修改了请求。

简而言之

检查 Web 服务是否有问题。尝试使用另一个非浏览器精简 Http 客户端(如 cUrl)来查看 Web 服务的反应情况。


0
我也遇到了这个问题。在我的情况下,URL字符串中有一个不可见的Unicode字符。因此,连接无法打开它(FileNotFound表示)。我将其删除后,问题得到解决。

你是如何移除它的?我也得到了带有 \r 结尾的 JSON 字符串。 - Sachin HR

0
如果在Web浏览器中可以正常访问URL http://localhost:8080/,那么代码应该能够正常工作。我在我的机器上运行程序,它也能够正常工作。因此,您必须检查Web服务器服务是否正常。

谢谢你,安迪。但是我怎么能确保它已经连接到了Web服务器服务? - Pavan Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接