我正在尝试使用HttpURLConnection(用于在java中使用cUrl)向url发送post请求。
请求的内容是xml,在结束时,应用程序处理xml并将记录存储到数据库,然后以xml字符串的形式发回响应。该应用程序在本地托管在ApacheTomcat上
当我从终端执行此代码时,一行按预期添加到db中。但是在从连接获取InputStream时引发了如下异常
java.io.FileNotFoundException:http://localhost:8080/myapp/service/generate
位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1401)
位于org.kodeplay.helloworld.HttpCurl.main(HttpCurl.java:30)
这是密码
公共类HttpCurl{
公共静态void main(字符串[]args){
HttpURLConnection;
试一试{
con=(HttpURLConnection)新URL(“http://localhost:8080/myapp/service/generate”).openConnection();
con.setRequestMethod(“POST”);
con.设置输出(真);
con.setDoInput(真);
File xmlFile=新文件(“test.xml”);
字符串xml=ReadWriteTextFile.getContents(xmlFile);
con.getOutputStream().write(xml.getBytes(“UTF-8”);
InputStream响应=con.getInputStream();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(响应));
for(字符串行;(line=reader.readLine())!=null;){
系统输出打印项次(行);
}
reader.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
因为异常被跟踪到行InputStream response=con.getInputStream()并且FileNotFoundException似乎不涉及任何文件
当我尝试直接打开与xml文件的连接时,它不会引发此异常
jaxb2ler使用xml服务和marshaller响应框架创建应用程序
类ReadWriteTextFile取自此处
谢谢
编辑:
它将数据保存在数据库中,同时返回404响应状态代码
我还试着用php做了一个curl,然后打印出CURLINFO\uhttp\ucode,结果是200
我该如何调试它呢?服务和客户端都在本地服务器上
已解决:
我可以在参考答案后解决这个问题
当使用非标准端口连接到url时,HttpURLConnection似乎总是返回404响应
添加这些行解决了这个问题
con.setRequestProperty(“用户代理”、“Mozilla/5.0(兼容)”);
con.setRequestProperty(“接受”,“*/*”);
我不知道您的Spring/JAXB组合,但一般REST Web服务不会在POST/PUT上返回响应体,只返回响应状态。你想确定它而不是身体
替换
InputStream响应=con.getInputStream();
借
int status=con.getResponseCode();
HTTP规范中提供了所有可用的状态代码及其含义,如前所述。webservice本身还应该附带一些文档,概述webservice支持的所有状态代码及其特殊含义(如果有的话)
如果状态以4nn或5nn开头,您希望使用getErrorStream()来读取可能包含错误详细信息的响应正文
InputStream error=con.getErrorStream();