2015-09-26 51 views
1

我有一個JAX-RS REST服務,使用JEE 7(部署GlassFish中),其具有用於處理所述資源的HTTP POST方法:消費在JAX-RS REST服務muiltipart POST數據

@POST 
@Path(value="{dId}") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
@Produces(MediaType.APPLICATION_JSON) 
public Response sendStatus(@Context HttpServletRequest request) 

我嘗試提取多部分數據爲:

Collection<Part> parts = request.getParts(); 
if(parts==null || parts.isEmpty()){ 
     lg.warn("Empty/non-existent parts in request body!"); 
     return sendBadRequestError(sp); 
} 

然後我嘗試模擬客戶端多部分POST請求,使用RESTClient實現(從wiztools.org)中,用至少2個部分中的不同內容類型的(邊界定界符是自動由RESTClient工具設置)。

我在wireshark中驗證它是否從RESTClient發送了正確的請求(沒有格式錯誤的數據包等)。

但是,所有的請求似乎都碰到包含消息中請求主體中空的/不存在的部分的塊,表明請求中沒有找到任何部分。

我在發佈之前多次搜索過Stackoverflow,並且所有示例/解決方案都涉及到用例上傳文件/圖像的情況,這不是我正在處理的情況。

我的rest服務只是消費一個多部分請求,它可以包含一個帶有JSON數據的部分,另一個帶有簡單字符串或其他JSON數據的部分。

有什麼東西丟失 - 請幫忙嗎?。是否有其他技術來分析碰到REST服務的多部分數據?

請指教。

謝謝。 J

+1

JSR-339的第9章規定哪些類型可以與'@ Context'一起使用。如果你使用'@ FormParam'而不是它工作?或者使用Request(http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Request.html)接口而不是HttpServletRequest? –

+1

我想澤西已經讀過輸入流。使用Jersey multipart API而不是直接訪問HttpServletRequest。見[多部分支持](https://jersey.java.net/documentation/latest/media.html#multipart) –

+0

感謝MartijnBurger和peeskillet的建議。讓我嘗試這些選項並回來。 – Javy

回答

1

感謝來自@peeskillet的指針,我使用Jersey multipart API來獲取多部分實體的句柄。

正是如此,它可以幫助別人碰到了同樣的問題,我列出了完整的解決方案:

  1. 啓用容器您的應用程序「多」的能力。這對於所需讀者/作者的可用性是必需的。如何做到這一點的Jersey 2 injection source for multipart formdata
  2. 被明確闡述的資源的方法則定義爲

    @POST 
    @Path(value="{dId}") 
    @Consumes(MediaType.MULTIPART_FORM_DATA) 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response sendStatus(FormDataMultiPart multipart){ 
    .... 
    ... 
        Map<String, List<FormDataBodyPart>> parts = multipart.getFields(); 
        if(parts==null || parts.isEmpty()){ 
         lg.warn("Empty/non-existent parts in request body!"); 
         return sendBadRequestError(sp); 
        } 
    
        for(List<FormDataBodyPart> p: parts.values()){ 
         FormDataBodyPart bp = p.get(0); 
         lg.info("\t body part name {}",bp.getName()); 
         lg.info("\t body part value {}",bp.getValue());    
          ....//do your real stuff here 
        } 
    
    } 
    

和賓果它的作品!另請注意:使用RESTClient GUI工具時,請確保您沒有明確設置「內容類型」和「邊界」,因爲該工具會自動設置其內容類型和邊界。

希望這可以幫助別人。

ps:如何投票peeskillet的答案?

+1

是的。 JAX-RS規範的實現(Jersey,Apache CXF)爲此實現了專有解決方案。然而,問題在於如何使用JAX-RS來實現。正如你在這張票中看到的那樣,這是一個正在等待實現的請求https://java.net/jira/browse/JAX_RS_SPEC-413 –

+1

Ps:在meta.stackoverflow.com上查找並詢問這些問題你需要一個聲望至少15以點贊評論。我提出了你的問題和答案,它應該足以讓你對評論贊不絕口。 –