2015-05-27 55 views
1

我想通過二進制方式將PUT放到可以使用許多可能的mimetypes中的一個的端點上。具體來說,我正在與Apache Tika服務器進行通信,這可能需要採用PDF或Word .docx文件。調用RESTEasy客戶端代理接口時,如何指定端點將使用哪種內容類型?

我已經成立了一個客戶端代理接口,我可以硬編碼,也就是說,.DOCX MIME類型:

public interface TikaClient { 
    @PUT 
    @Path("tika") 
    @Consumes("application/vnd.openxmlformats-officedocument.wordprocessingml.document") 
    Response putBasic(byte[] body); 
} 

,這將工作時,我把它稱爲:

ResteasyClient client = new ResteasyClientBuilder().build(); 
ResteasyWebTarget target = client.target(url); 
TikaClient tikaClient = target.proxy(TikaClient. 
Response response = tikaClient.putBasic(binaryFileData); 

..但是該端點也可以採用「text/plain」或「application/pdf」。

我相信我可以指定多個@Consumes選項:@Consumes({"text/plain", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"})

但它似乎並沒有選擇一個正確的,我不知道該怎麼告訴它哪一個有問題的文件。

回答

2

您可以像上面提到的那樣添加多個MediaType。如果服務器接受多個MediaType,則必須與客戶端協商使用哪一個。客戶應發送Content-Type標題,如Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document

對於添加Content-Type頭與代理框架,你必須選擇:

  • 添加@HeaderParam("Content-Type")作爲參數傳遞給你的putBasic方法。
  • 註冊將設置此標頭的ClientRequestFilter

我不知道爲什麼,但與代理框架這不適合我。如果您使用標準客戶端方式,它正在工作:

client.target(url) 
.request() 
.put(Entity.entity(binaryFileData, 
    MediaType.valueOf("application/vnd.openxmlformats-officedocument.wordprocessingml.document"))); 

服務器現在應該選擇您正在使用的MediaType。

+0

確實!這對我的工作!我對Java有點新鮮感,所以我對兩件事情有些困惑:(1)我們如何/爲什麼要將註釋(@HeaderParam)傳遞到putBasic方法中;(2)當您說註冊「ClientRequestFilter」 ,你的意思是基本上寫一個實現ClientRequestFilter的類,對吧? [一個這個職位](http://stackoverflow.com/questions/21763700/how-to-set-http-header-in-resteasy-3-0-client-framework-with-resteasyclientbuil)?你知道解釋問題(a)期間發生的事情的文件嗎? – Offlein

+1

正確。 'ClientRequestFilter'在鏈接的文章中描述。使用'@ HeaderParam'會改變你的方法簽名,如下所示:'響應putBasic(@HeaderParam(「Content-Type」)字符串contentType,byte [] body)'。 – lefloh

+0

謝謝你的幫助! – Offlein

相關問題