在JAX-RS REST服务中使用muiltipart POST数据

时间:2015-09-26 19:44:05

标签: rest glassfish jax-rs multipart java-ee-7

我有一个jax-rs REST服务,使用JEE 7(部署在glassfish中),它有一个方法来处理资源上的HTTP 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);
}

然后我尝试使用RestClient(来自wiztools.org)模拟客户端多部分POST请求,至少有两部分不同的内容类型(边界分隔符由RESTClient工具自动设置)。

我在wireshark中验证它是从RESTClient发送的正确请求(没有格式错误的数据包等)。

但是,所有请求似乎都在包含请求正文消息中的空/不存在部分的块中,表示请求中找不到任何部分。

我在发布之前多次在Stackoverflow中搜索过,并且所有示例/解决方案都与用于上传文件/图像的用例相关,而事实并非如此。

我的休息服务只使用一个多部分请求,它可以包含一部分带有JSON数据,另一部分带有简单字符串或其他JSON数据。

是否有遗漏的东西 - 请帮助?。还有其他技术来解析点击REST服务的多部分数据吗?

请建议。

感谢。 Ĵ

1 个答案:

答案 0 :(得分:1)

感谢来自@peeskillet的指针,我使用了Jersey multipart API来获取多部分实体的句柄。

这样可以帮助其他人遇到同样的问题,我列出了完整的解决方案:

  1. 启用&#34; MultiPart&#34;容器中应用程序的功能。这对于所需读者/作者的可用性是必要的。 Jersey 2 injection source for multipart formdata
  2. 清楚地阐明了如何做到这一点
  3. 然后将资源方法定义为

    @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
        }
    
     }
    
  4. 宾果游戏有效!。

    另外还有一个注意事项:使用RESTClient GUI工具时,请确保您没有明确设置Content-Type和Boundary,因为该工具会自动设置它。

    希望这有助于某人。

    ps:我如何投票支持peeskillet的答案?