FileNotFoundException,同时从 HttpURLConnection 获取 InputStream 对象

我正在尝试使用HttpURLConnection(用于在java中使用cUrl)向URL发送帖子请求。请求的内容是 xml,在端点,应用程序处理 xml 并将记录存储到数据库,然后以 xml 字符串的形式发回响应。该应用程序托管在本地的apache-tomcat上。

当我从终端执行此代码时,一行将按预期添加到数据库中。但是,在从连接获取输入流时,会引发如下异常

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();
        }
    }
  }

它令人困惑,因为异常被跟踪到行,并且似乎没有涉及FileNotFoundException的任何文件。InputStream response = con.getInputStream();

当我尝试直接打开与xml文件的连接时,它不会引发此异常。

服务应用使用 spring 框架和 Jaxb2Marshaller 来创建响应 xml。

类 ReadWriteTextFile 取自此处

谢谢。

编辑:好吧,它将数据保存在数据库中,同时发回404响应状态代码。

我还尝试使用php做一个卷曲,并打印出来结果是200。CURLINFO_HTTP_CODE

关于我如何调试它的任何想法?服务和客户端都在本地服务器上。

解决:在参考SO本身的答案后,我可以解决问题。

似乎HttpURLConnection在连接到具有非标准端口的URL时总是返回404响应。

添加这些行解决了它

con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");

答案 1

我不知道你的Spring/JAXB组合,但平均REST Webservice不会在POST/PUT上返回响应正文,只是一个响应状态。你想确定它而不是身体。

取代

InputStream response = con.getInputStream();

int status = con.getResponseCode();

所有可用的状态代码及其含义都可以在 HTTP 规范中找到,如前所述。Web服务本身还应该附带一些文档,这些文档概述了Web服务支持的所有状态代码及其特殊含义(如果有)。

如果状态以 或 开头,则希望改为使用来读取可能包含错误详细信息的响应正文。4nn5nngetErrorStream()

InputStream error = con.getErrorStream();

答案 2

FileNotFound只是一个不幸的异常,用于指示 Web 服务器返回了 404。


推荐