首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从HttpURLConnection获取InputStream对象时出现FileNotFoundException

从HttpURLConnection获取InputStream对象时出现FileNotFoundException
EN

Stack Overflow用户
提问于 2011-03-21 22:43:17
回答 8查看 128.8K关注 0票数 116

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

当我从终端执行这段代码时,如预期的那样向数据库添加了一行。但是从连接获取InputStream时会抛出异常,如下所示

代码语言:javascript
运行
复制
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)

以下是代码

代码语言:javascript
运行
复制
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

谢谢。

编辑:它将数据保存在数据库中,同时返回404Response状态代码。

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

有没有关于如何进行调试的想法?服务和客户端都在本地服务器上。

已解决:我可以在引用SO本身的answer后解决问题。

当使用非标准端口连接到url时,HttpURLConnection似乎总是返回404响应。

添加这些代码行就解决了这个问题

代码语言:javascript
运行
复制
con.setRequestProperty("User-Agent","Mozilla/5.0 ( compatible ) ");
con.setRequestProperty("Accept","*/*");
EN

回答 8

Stack Overflow用户

发布于 2011-03-21 22:54:07

我不知道你的Spring/JAXB组合,但是一般的REST webservice不会在POST/PUT上返回响应体,只会返回一个response status。你想确定它而不是身体。

替换

代码语言:javascript
运行
复制
InputStream response = con.getInputStream();

通过

代码语言:javascript
运行
复制
int status = con.getResponseCode();

所有可用的状态代码及其含义都在HTTP规范中提供,如前面所链接的。webservice本身也应该附带一些文档,其中概述了webservice支持的所有状态代码及其特殊含义(如果有)。

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

代码语言:javascript
运行
复制
InputStream error = con.getErrorStream();
票数 136
EN

Stack Overflow用户

发布于 2011-03-21 22:47:01

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

票数 54
EN

Stack Overflow用户

发布于 2014-05-26 01:09:38

对于将来遇到这个问题的任何人来说,原因是因为状态码是404 (或者在我的例子中是500)。当状态码不是200时,InpuStream函数似乎会抛出一个错误。

在我的例子中,我控制了自己的服务器,并返回一个500状态码来表明发生了错误。尽管我也发送了一个带有字符串消息的正文,详细描述了错误,但不管正文是完全可读的,inputstream都抛出了一个错误。

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

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5379247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档