2014-09-06 66 views
2

我有一个服务部署在Heroku中,产生一个PDF文件输出。当我点击浏览器中的URL时,我可以下载pdf文件(我不提示保存(按照我的要求),它会自动保存到代码中的定义路径中)。因此服务已经启动并可用。但是当我使用HttpURLConnection访问它时,我得到了404错误。 。任何人都可以帮我解决这个问题吗?获取404 HttpURLConnection

以下是我访问的链接: 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的文件/静态/ 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中实现相同的功能。有人可以帮我解决这个问题。

预先感谢

回答

9

我看到一些问题。首先,如果你做了一个GET,你不应该写conn.setDoOutput(true);因为你没有从应用程序输出到服务器。其次,Content-Type头是你发送给服务器的内容类型,而不是相反,所以既然你不发送任何东西,只是做一个get,你不应该设置它。

也许,如果你愿意,你可以设置Accept头。

+1

我评论conn.setDoOutput(true)和内容类型,这两个语句,并添加con.setProperty(“接受”,“*”),但没有任何工作。仍然得到404.当我在本地部署相同的时候,同样的工作情况会如何? – HJK 2014-09-06 15:25:52

+0

我错过了URL中的'r'。感谢您的帮助。 – HJK 2014-09-09 02:32:03

+0

,我想你应该调用conn.setDoInput(true) – Nepster 2015-08-05 07:53:34

2

Content-Type是服务器报头。你应该发送一个Accept标题,也许你可以尝试一些通用的东西,如Accept: *

+0

试过了,但没用。仍然得到404 – HJK 2014-09-06 15:26:08

+0

您在代码中的URL中的'sevices'中缺少'r'。 – MirMasej 2014-09-06 15:53:03

+0

是的,我刚刚看到,谢谢你注意到我。 – HJK 2014-09-06 15:54:25