首页 文章

从HttpURLConnection获取InputStream对象时出现FileNotFoundException

提问于
浏览
86

我正在尝试使用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 回答

  • 0

    我不会在POST / PUT上返回响应正文,只是response status . 你想确定它而不是身体 .

    更换

    InputStream response = con.getInputStream();
    

    通过

    int status = con.getResponseCode();
    

    所有可用的状态代码及其含义都在HTTP规范中提供,如之前链接的那样 . Web服务本身也应该附带一些文档,这些文档概述了Web服务支持的所有状态代码及其特殊含义(如果有的话) .

    如果状态以 4nn5nn 开头,则您希望使用 getErrorStream() 来读取可能包含错误详细信息的响应正文 .

    InputStream error = con.getErrorStream();
    
  • 24

    FileNotFound 只是一个不幸的例外,用于表示Web服务器返回404 .

  • 115

    对于将来遇到此问题的任何人,原因是因为状态代码是404(或者在我的情况下是500) . 当状态代码不是200时, InpuStream 函数似乎会抛出错误 .

    在我的情况下,我控制自己的服务器,并返回500状态代码,以指示发生错误 . 尽管我还发送了一个带有详细说明错误的字符串消息的正文,但无论正文是否完全可读,_1779290都会抛出错误 .

    如果你控制你的服务器,我想这可以通过发送一个200状态代码然后处理字符串错误响应的任何处理来处理 .

  • 44

    对于任何绊倒这个的人来说,在尝试将SOAP请求头发送到SOAP服务时也发生了同样的事情 . 问题是代码中的错误顺序,我在发送XML主体之前首先请求了输入流 . 在下面剪切的代码中, InputStream in = conn.getInputStream(); 行紧跟在 ByteArrayOutputStream out = new ByteArrayOutputStream(); 之后,这是不正确的顺序 .

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    // send SOAP request as part of HTTP body 
    byte[] data = request.getHttpBody().getBytes("UTF-8");
    conn.getOutputStream().write(data); 
    
    if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
      Log.d(TAG, "http response code is " + conn.getResponseCode());
      return null;
    }
    
    InputStream in = conn.getInputStream();
    

    FileNotFound 在这种情况下是编码HTTP响应代码400的一种不幸的方式 .

  • 5

    在这种情况下,FileNotFound意味着您从服务器获得了404 - 可能是服务器不喜欢“POST”请求吗?

  • 4

    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 相同)

  • -2

    请更换

    con = (HttpURLConnection) new URL("http://localhost:8080/myapp/service/generate").openConnection();
    

    con = (HttpURLConnection) new URL("http://YOUR_IP:8080/myapp/service/generate").openConnection();
    

相关问题