当前位置: 首页 > 知识库问答 >
问题:

在JAX-RS REST服务中使用多部分POST数据

池赞
2023-03-14

我有一个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 请求,其中至少有 2 个部分具有不同的内容类型(边界分隔符由 RESTClient 工具自动设置)。

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

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

在发布之前,我在Stackoverflow中搜索了很多次,所有的示例/解决方案都与上传文件/图像的用例有关,这不是我正在处理的情况。

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

有什么东西丢失了吗?请帮忙?。是否有其他技术来解析命中REST服务的多部分数据?

请指教。

谢谢J

共有1个答案

茅高卓
2023-03-14

由于@peeskillet中的指针,我使用Jersey multipart API来获取多部分实体的句柄。

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

> < li >为容器中的应用程序启用“多部分”功能。这对于所需的读取器/写入器的可用性是必要的。多部分formdata的Jersey 2进样源中清楚地说明了如何实现这一点 < li>

然后资源方法被定义

@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,因为该工具会自动设置它。

希望这能帮助到一些人。

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

 类似资料:
  • 我用以下注释注册了rest资源: 当我尝试启动服务器时,我得到以下错误: classCastException:无法将org.glassfish.jersey.ext.cdi1x.transaction.internal.transactionalExceptionInterceptorProvider转换为org.glassfish.jersey.server.spi.componentProv

  • 问题内容: 这是我到目前为止所拥有的: 这将初始化我的REST服务 我的服务如下所示: 我尝试将添加到中,但仍然出现异常: 在没有多部分配置的情况下调用Request.getParts。 在servlet中添加@MultipartConfig或在web.xml中添加multipart-config元素 。 谢谢 问题答案: 最终,我在没有Jersey耦合的情况下设法解决了这一问题。问题是注释不能与

  • 我正在构建一个应用程序,需要一个API调用,在其POST body请求中有数组。我正在使用OkHttp 2.6请求API。 Postman中的请求如下所示: 为了实现这一点,我尝试了几种编写的方法,

  • 问题内容: 我有一个表单数据以及要在同一POST中发送的文件。例如,{duration:2000,file:test.wav}。我在这里看到了许多关于使用python请求发布多部分/表单数据的线程。 我的样品要求如下: 但是,当我执行上面的代码时,出现此错误: 5:59:55.338 Dbg 09900 [DEBUG]解决处理程序[null]中的异常:org.springframework.web

  • 我正在使用Multipart执行帖子类型请求。问题是因为我一直收到两个错误 1) 500 2) 422不可处理实体 Api仅接受音乐文件。因此,我添加了一个默认文件,以避免不断选择新文件 和我的界面 如果有任何帮助,我将不胜感激。 我发现它将文件作为对象通过Reform2发送到服务器