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

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

问题描述:

我使用HttpURLConnection连接到网站并接收ResponseCode = 404(HTTP_NOT_FOUND)。不过,我在浏览器(IE)中打开网站没有问题。URL可通过浏览器访问,但仍然FileNotFoundException与URLConnection

为什么不同,我能做些什么呢?

问候,帕

这是我的计划

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

你能访问该网址是什么? –

+0

你可以发布你的堆栈跟踪吗? – belgther

+1

您的服务器是否正在返回404?检查:http://stackoverflow.com/questions/941628/urlconnection-filenotfoundexception-for-non-standard-http-port-sources –

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

+0

谢谢安迪,但我怎样才能确保这已经联系了网络服务? –

您正在收到404错误,表示未找到请求的响应。首先,您需要确保服务器的服务号码是​​,并且必须返回一些带有代码200的内容。否则,我们无法为您提供帮助。

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

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

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

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

  2. 即使您的服务器应该是200,您的服务器也可能始终返回404。由于Web浏览器不关心错误状态并尝试渲染所有内容,因此它似乎可以从Web浏览器中工作。如果是这样,你应该可以解决服务器REPONSE先正确,否则尝试获得错误流,而不是HttpURLConnection#getErrorStream()

+3

我有同样的问题,它是由设置'connection.setDoOutput(true);' –

我知道这是在比赛中很迟,但我刚刚具有了相同的问题,并没有这里的解决方案为我工作。在我的情况下,我实际上有另一个进程在同一个端口上运行,这个进程正在窃取来自java应用程序的请求。使用yair的答案here可以检查在同一端口上运行的进程,如下所示:在命令提示符下,在Windows上执行netstat -nao | find "8080"或在Linux上执行netstat -nap | grep 8080。它应该显示一行LISTENING和127.0.0.1:8080,接下来是进程ID。只要终止这个过程,你应该很好走。

我有类似的问题。对我来说,它帮助检查使用RawCap数据包。 RawCap是少数几个允许你嗅探本地主机的Windows数据包嗅探器之一。

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

我有问题了。在我的情况下,我在url字符串中有一个不可见的unicode字符。所以连接无法打开它(FileNotFound表示)。我删除它,它的工作。

我也有类似的情形,其中来自浏览器的Web服务处理POST请求(在我的情况邮差,一个API测试Chrome扩展)正确,但HttpURLConnection的保持了404大的有效载荷失败。我错误地认为问题必须出现在我的HttpURLConnection客户端代码中。

当我后来试图用一个大的有效载荷复制没有卷曲的请求,我得到了同样的404错误。尽管我使用Postman生成的cUrl代码,因此它应该与Postman的请求相同,但是Web服务对这两个请求的反应方式有所不同。 Postman上的某些客户端中间件可能已经拦截并修改了请求。

TL; DR

检查Web服务。这可能是罪魁祸首。尝试另一个非浏览器准系统像cUrl这样的Http客户端来查看Web服务对它的反应。