【问题标题】:URL is accessable with browser but still FileNotFoundException with URLConnectionURL 可通过浏览器访问,但仍使用 URLConnection 访问 FileNotFoundException
【发布时间】:2011-11-26 14:49:28
【问题描述】:

我使用 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/

【问题讨论】:

  • 你能访问那个网址吗?
  • 您也可以发布您的堆栈跟踪吗?
  • 您的服务器是否返回 404 ?检查这个:stackoverflow.com/questions/941628/…
  • 抱歉,回复晚了。这是 stackTrace java.io.FileNotFoundException: localhost:8080/middleware at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) java.io.FileNotFoundException: localhost:8080/middleware
  • 这对你有什么好处((HttpURLConnection) urlc).getResponseCode()

标签: java


【解决方案1】:

您收到 404 错误,表示未找到请求的响应。首先,您需要确保有一个服务器在http://localhost:8080/ 提供服务,并且它必须返回一些代码为 200 的内容。如果没有,那么我们无能为力。

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

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

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

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

  2. 1234563 .如果是这样,您应该首先修复服务器以正确响应,否则尝试获取错误流而不是HttpURLConnection#getErrorStream()

【讨论】:

  • 我遇到了同样的问题,这是由设置connection.setDoOutput(true);引起的
【解决方案2】:

我遇到了类似的问题。对我来说,它有助于使用RawCap 检查数据包。 RawCap 是少数可让您嗅探 localhost 的 Windows 数据包嗅探器之一。

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

【讨论】:

    【解决方案3】:

    如果网址http://localhost:8080/ 可以在网络浏览器中正常访问,则代码应该可以正常工作。我在我的机器上运行程序,它运行良好。所以你必须检查webserver服务是否正常。

    【讨论】:

    • 谢谢你,安迪,但我怎样才能确保这已经联系了网络服务器服务??
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我也有这个问题。就我而言,我在 url 字符串中有一个不可见的 unicode 字符。所以连接无法打开它(FileNotFound 表示)。我删除了它,它起作用了。

      【讨论】:

      • 你是如何删除它的?我也得到了带有 \r 的 json 字符串结束
      【解决方案6】:

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

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

      TL;DR

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-24
        • 1970-01-01
        • 2020-07-18
        • 2012-08-22
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        相关资源
        最近更新 更多