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/
如果url http://localhost:8080/可以在网络浏览器访问好,代码应该很好地工作。我在我的机器上运行该程序,它运行良好。所以你必须检查Web服务器服务是否正常。
谢谢安迪,但我怎样才能确保这已经联系了网络服务? –
您正在收到404错误,表示未找到请求的响应。首先,您需要确保服务器的服务号码是,并且必须返回一些带有代码200的内容。否则,我们无法为您提供帮助。
测试url中是否有任何内容的最简单方法是将该URL粘贴到Web浏览器地址栏上,然后单击“去”。但是,这并不能保证Java代码将能够访问它。例如,如果服务器设计为响应404,如果它找不到Web浏览器User-Agent
标头。
由于服务器返回状态码(200或404),这意味着这不是防火墙问题。
根据您的最新版本的问题,您可以使用Web浏览器查看它,但不能用您的java代码下载它,并且头似乎设置正确。我只能看到两个问题:
您不应该将
connection.setDoOutput(true);
设置为true。这将强制连接执行HTTP POST而不是GET,并且服务器可能不支持POST。即使您的服务器应该是200,您的服务器也可能始终返回404。由于Web浏览器不关心错误状态并尝试渲染所有内容,因此它似乎可以从Web浏览器中工作。如果是这样,你应该可以解决服务器REPONSE先正确,否则尝试获得错误流,而不是
HttpURLConnection#getErrorStream()
我有同样的问题,它是由设置'connection.setDoOutput(true);' –
我知道这是在比赛中很迟,但我刚刚具有了相同的问题,并没有这里的解决方案为我工作。在我的情况下,我实际上有另一个进程在同一个端口上运行,这个进程正在窃取来自java应用程序的请求。使用yair的答案here可以检查在同一端口上运行的进程,如下所示:在命令提示符下,在Windows上执行netstat -nao | find "8080"
或在Linux上执行netstat -nap | grep 8080
。它应该显示一行LISTENING和127.0.0.1:8080,接下来是进程ID。只要终止这个过程,你应该很好走。
我有问题了。在我的情况下,我在url字符串中有一个不可见的unicode字符。所以连接无法打开它(FileNotFound表示)。我删除它,它的工作。
我也有类似的情形,其中来自浏览器的Web服务处理POST请求(在我的情况邮差,一个API测试Chrome扩展)正确,但HttpURLConnection的保持了404大的有效载荷失败。我错误地认为问题必须出现在我的HttpURLConnection客户端代码中。
当我后来试图用一个大的有效载荷复制没有卷曲的请求,我得到了同样的404错误。尽管我使用Postman生成的cUrl代码,因此它应该与Postman的请求相同,但是Web服务对这两个请求的反应方式有所不同。 Postman上的某些客户端中间件可能已经拦截并修改了请求。
TL; DR
检查Web服务。这可能是罪魁祸首。尝试另一个非浏览器准系统像cUrl这样的Http客户端来查看Web服务对它的反应。
你能访问该网址是什么? –
你可以发布你的堆栈跟踪吗? – belgther
您的服务器是否正在返回404?检查:http://stackoverflow.com/questions/941628/urlconnection-filenotfoundexception-for-non-standard-http-port-sources –