我有一个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服务的多部分数据吗?
请建议。
感谢。 Ĵ
答案 0 :(得分:1)
感谢来自@peeskillet的指针,我使用了Jersey multipart API来获取多部分实体的句柄。
这样可以帮助其他人遇到同样的问题,我列出了完整的解决方案:
然后将资源方法定义为
@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工具时,请确保您没有明确设置Content-Type和Boundary,因为该工具会自动设置它。
希望这有助于某人。
ps:我如何投票支持peeskillet的答案?