使用HttpURLConnection时出现404错误

3
我在Heroku上部署了一个服务,它产生一个pdf文件输出。当我在浏览器中点击URL时,我可以下载pdf文件(根据我的要求,我没有提示保存,它会自动保存到代码中定义的路径)。所以服务已经启动并可用。但是当我使用HttpURLConnection访问它时,我得到404错误。有人能帮我解决这个问题吗?
以下是我正在访问的链接: http://quiet-savannah-7144.herokuapp.com/services/time/temp 以下是在Heroku服务器上部署的服务代码:
@jawax.ws.rs.core.Context
ServletContext context;

@GET
@path("/temp")
@Produces("application/pdf")
public Response getPdf() throws IOException{
  InputStream is = context.getResourceAsStream("/static/temp.pdf");
  ResponseBuilder res = Response.ok(is);
  res.header("Content-Disposition","attachment; filename=temp.pdf");
  return res.build();
}

注意:我的文件位于 webapp/static/temp.pdf 的位置。
客户端代码如下:
 try {
         URL url = new URL("http://quiet-savannah-7144.herokuapp.com/sevices/time/temp");
         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
         conn.setDoOutput(true);
         conn.setRequestMethod("GET");
         conn.setRequestProperty("Content-Type", "application/json");
         int code = conn.getResponseCode();
         System.out.println("code>>"+code+"<<");
         if (conn.getResponseCode() == 200) {
            System.out.println("*************************done****************************");
            InputStream inputStream = conn.getInputStream();
            OutputStream output = new FileOutputStream("D:/copyOfTest.pdf");
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
               output.write(buffer, 0, bytesRead);
            }
            output.close();
         } else {
            Scanner scanner = new Scanner(conn.getErrorStream());
            while(scanner.hasNext())
            System.out.println(scanner.next());
            scanner.close();
         }
         conn.disconnect();
      } catch (MalformedURLException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }

我尝试了以下内容类型:pdf和x-pdf,但都无效。
 conn.setRequestProperty("Content-Type", "application/pdf");
 conn.setRequestProperty("Content-Type", "application/x-pdf");

当我在我的机器上本地部署Tomcat服务器时,一切都非常好。 我已经挣扎了6个小时来解决这个问题,但是没有头绪。 实际上,我必须在android AsyncTask中获取它。 如果我能够在java中做到这一点,那么我就可以在android中实现相同的功能。 有人能帮助我吗?
提前感谢。
3个回答

13

我发现几个问题。

首先,如果您进行GET操作,不应该编写conn.setDoOutput(true);因为您没有从应用程序输出到服务器。

其次,Content-Type标头是您发送到服务器的内容类型,而不是相反的,因此由于您仅执行获取操作而不发送任何内容,因此不应设置它。

相反,如果需要,您可以设置接受标头。


1
我已经注释掉了conn.setDoOutput(true)content-type这两条语句,并添加了con.setProperty("Accept", "*"),但仍然无法正常工作,仍然出现404错误。为什么在本地部署时可以正常运行? - HJK
我在URL中漏掉了'r'。谢谢你的帮助。 - HJK
我认为你应该调用conn.setDoInput(true)。 - Zar E Ahmer

2

Content-Type 是服务器头信息。你应该发送一个 Accept 头信息,可以尝试一些通用的格式,比如 Accept: *


尝试了两种方法,但都没有用。仍然收到404错误。 - HJK
你的代码中URL中的sevices拼写错误,应该是services,缺少一个字母r - MirMasej

0
虽然这个帖子很老了,但仍可能对一些人有用:
我遇到了类似的问题,并通过添加“Accept-Encoding: gzip,deflate,br”标头来解决它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接