我正在尝试使用HttpURLConnection向网址发送帖子请求(在java中使用cUrl) . 请求的内容是xml,在结束时,应用程序处理xml并将记录存储到数据库,然后以xml字符串的形式发回响应 . 该应用程序在本地托管在apache-tomcat上 .
当我从终端执行此代码时,会按预期将一行添加到数据库中 . 但是从连接获取InputStream时会抛出异常,如下所示
java.io.FileNotFoundException: http://localhost:8080/myapp/service/generate
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401)
at org.kodeplay.helloworld.HttpCurl.main(HttpCurl.java:30)
这是代码
public class HttpCurl {
public static void main(String [] args) {
HttpURLConnection con;
try {
con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setDoInput(true);
File xmlFile = new File("test.xml");
String xml = ReadWriteTextFile.getContents(xmlFile);
con.getOutputStream().write(xml.getBytes("UTF-8"));
InputStream response = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(response));
for (String line ; (line = reader.readLine()) != null;) {
System.out.println(line);
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
它令人困惑,因为异常被追溯到 InputStream response = con.getInputStream();
行,并且似乎没有涉及FileNotFoundException的任何文件 .
当我尝试直接打开与xml文件的连接时,它不会抛出此异常 .
服务应用程序使用spring框架和Jaxb2Marshaller来创建响应xml .
ReadWriteTextFile类取自here
谢谢 .
Edit: 它将数据保存在数据库中,并同时发回404响应状态代码 .
我也尝试使用php进行卷曲并打印出 CURLINFO_HTTP_CODE
,结果是200 .
关于如何进行调试的任何想法?服务和客户端都在本地服务器上 .
Resolved: 我可以在SO本身引用answer后解决问题 .
当连接到具有非标准端口的URL时,似乎HttpURLConnection始终返回404响应 .
添加这些线解决了它
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");
7 回答
我不会在POST / PUT上返回响应正文,只是response status . 你想确定它而不是身体 .
更换
通过
所有可用的状态代码及其含义都在HTTP规范中提供,如之前链接的那样 . Web服务本身也应该附带一些文档,这些文档概述了Web服务支持的所有状态代码及其特殊含义(如果有的话) .
如果状态以
4nn
或5nn
开头,则您希望使用getErrorStream()
来读取可能包含错误详细信息的响应正文 .FileNotFound
只是一个不幸的例外,用于表示Web服务器返回404 .对于将来遇到此问题的任何人,原因是因为状态代码是404(或者在我的情况下是500) . 当状态代码不是200时,
InpuStream
函数似乎会抛出错误 .在我的情况下,我控制自己的服务器,并返回500状态代码,以指示发生错误 . 尽管我还发送了一个带有详细说明错误的字符串消息的正文,但无论正文是否完全可读,_1779290都会抛出错误 .
如果你控制你的服务器,我想这可以通过发送一个200状态代码然后处理字符串错误响应的任何处理来处理 .
对于任何绊倒这个的人来说,在尝试将SOAP请求头发送到SOAP服务时也发生了同样的事情 . 问题是代码中的错误顺序,我在发送XML主体之前首先请求了输入流 . 在下面剪切的代码中,
InputStream in = conn.getInputStream();
行紧跟在ByteArrayOutputStream out = new ByteArrayOutputStream();
之后,这是不正确的顺序 .FileNotFound
在这种情况下是编码HTTP响应代码400的一种不幸的方式 .在这种情况下,FileNotFound意味着您从服务器获得了404 - 可能是服务器不喜欢“POST”请求吗?
The solution:
只需更改 localhost 即可获得PC的 IP
如果你想知道这个: Windows+r > cmd > ipconfig
示例:http:// 192.168.0.107 /directory/service/program.php?action=sendSomething
只需将 192.168.0.107 替换为您自己的IP(不要尝试 127.0.0.1 ,因为它与 localhost 相同)
请更换
至