2014-09-06 67 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