2014-11-04 122 views
0

我目前使用的是Jersey 2.13。我希望客戶端從服務器下載zip文件,並且我希望服務器在下載完成後刪除文件。因此,我嘗試了AsyncResponse,所以我可以註冊一個CompletionCallback來知道下載完成。對於我當前的代碼,客戶端得到:「失敗:HTTP錯誤代碼:415」。Jersey壓縮文件的異步下載

服務器代碼:

@GET 
@Path("/{id}") 
@Produces({"application/zip"}) 
public void getResourceTree(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) throws IOException{ 
    asyncResponse.register(new CompletionCallback() { 
     @Override 
     public void onComplete(Throwable throwable) { 

      if (throwable == null) { 
       // no throwable - the processing ended successfully 
       // (response already written to the client) 
       // Delete temporary zip file... 
      } else { 
       throw new UnexpectedException("The user did not receive the zip file in path:"+ getResourceTreeZipName(id) +" successfully"); 
      } 
     } 
    }); 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 
       File file = createZipFile(id); 
       asyncResponse.resume(Response.ok((Object) file).build()); 
     } 
    }).start(); 
} 

的客戶端代碼:

private File downloadZipFile(String resourceId){ 
    Client client = Client.create(); 
    WebResource serverWebResource = client.resource(serverURI+"/"+resourceId); 
    ClientResponse response = serverWebResource.accept("application/zip").get(ClientResponse.class); 
    InputStream in = response.getEntityInputStream(); 
    //Create and return the zip file from the input stream... 
} 

我在做什麼錯?

+0

它是如何使用異步與[澤西島1.9](https://jersey.java.net/nonav/documentation/1.9/user-guide.html) – 2014-11-04 13:43:06

+0

你是對的,顯然我使用澤西島2.13 – 2014-11-04 13:54:58

+0

但是您使用的舊版客戶端API在2.13中不可用。這怎麼可能?他們是兩個不同的應用程序無論如何,我無法重現這個問題,儘管我使用的是新的客戶端API。不知道這是否有所作爲。 – 2014-11-04 14:00:55

回答

1

您是否嘗試過使用其他REST工具,例如郵遞員,並檢查服務器是否正在返回正確的對象,何時通過GET調用接受頭?我要做的第二件事是調試客戶端,並檢查是否在創建對象後立即設置頭部接受。