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

REST多部分混合请求(文件json)与Spring

章晋鹏
2023-03-14

我需要向我的Spring控制器发送一个带有json的文件。我有以下控制器类:

@Controller
@RequestMapping("/perform")
public class PerformController {

    ...

    @RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/mixed" })
    @ResponseStatus(HttpStatus.CREATED)
    public void handleFileUpload(@RequestPart("file") MultipartFile file, @RequestPart("map") String map,   HttpServletResponse response) throws Exception {
        ...
    }

}

但当我在服务器上使用以下命令时:

 curl -H "Content-Type: multipart/form-data" -F "map=@map.json; type=application/json" -F "content=@SMP.docx" -X POST localhost:9000/perform/gopdf-i -v

我得到415不支持的媒体类型!

有线索吗?

共有3个答案

慕阳伯
2023-03-14

SpringWebFlux的多部分/混合版本(2.1.0)对我不起作用。这里有一个可行的替代方法

  • 工作-spring boot starter web/Multipart[]-上载文件,其中一个是有效负载,另一个是文件本身。在我的例子中,由于有效载荷是恒定的,它工作了
  • 不工作-Spring启动启动器webflux/Flux。流量是空的。我试过这个https://github.com/spring-projects/spring-boot/issues/13268,但它不起作用
应涵容
2023-03-14

我找到了解决方案:我需要使用@RequestParam而不是@RequestPart

@RequestMapping(path = "gopdf", method = RequestMethod.POST, consumes = { "multipart/form-data" })
@ResponseStatus(HttpStatus.OK)
public void handleFileUpload2(@RequestParam("file") MultipartFile file, @RequestParam("map") String jsonMap,
        HttpServletResponse response) throws Exceptio
祁星阑
2023-03-14

其他答案中的“消费”一词对我来说没什么用。关键是将我想要支持的特定multipart/*类型放到RequestMapping中的一些header键上。这真的很难弄清楚,主要是猜测工作和盯着Spring源代码。我对Spring对它的支持有点不满意,但我已经设法在我们的Spring Boot应用程序中实现了它,但只在Tomcat上实现了?!?当您将引导应用程序配置为使用Jetty时,称为MultipartResolver的东西会阻塞。。。这么长的码头。但我离题了。。。

在我的控制器中,我设置了多部分/混合或多部分/表单数据,如...

@RequestMapping(value = "/user/{userId}/scouting_activities", method = RequestMethod.POST,
        headers = {"content-type=multipart/mixed","content-type=multipart/form-data"})
public ResponseEntity<String> POST_v1_scouting_activities(
        @RequestHeader HttpHeaders headers,
        @PathVariable String userId,
        @RequestPart(value = "image", required = false) MultipartFile image,
        @RequestPart(value = "scouting_activity", required = true) String scouting_activity_json) {
  LOG.info("POST_v1_scouting_activities: headers.getContentType(): {}", headers.getContentType());
  LOG.info("POST_v1_scouting_activities: userId: {}", userId);
  LOG.info("POST_v1_scouting_activities: image.originalFilename: {}, image: {}",
          (image!=null) ? image.getOriginalFilename() : null, image);
  LOG.info("POST_v1_scouting_activities: scouting_activity_json.getType().getName(): {}, scouting_activity: {}",
          scouting_activity_json.getClass().getName(), scouting_activity_json);
  return new ResponseEntity<String>("POST_v1_scouting_activities\n", HttpStatus.OK);
}

头文件让它能够唯一地标识它愿意尝试的多部分内容类型。这让卷发像。。。

curl -i -X POST 'http://localhost:8080/robert/v1/140218/scouting_activities' \
-H 'Content-type:multipart/mixed' \
-F 'image=@Smile_128x128.png;type=image/png' \
-F 'scouting_activity={
  "field": 14006513,
  "longitude": -93.2038253,
  "latitude": 38.5203231,
  "note": "This is the center of Dino Head.",
  "scouting_date": "2017-01-19T22:56:04.836Z"
};type=application/json'

...或

curl -i -X POST 'http://localhost:8080/robert/v1/140218/scouting_activities' \
-H 'Content-type:multipart/form-data' \
-F 'image=@Smile_128x128.png;type=image/png' \
-F 'scouting_activity=@scoutingFrackingCurl.json;type=application/json'

工作。

 类似资料:
  • 我正在开发基于Spring 3.2的RESTful服务。我遇到了一个控制器处理混合多部分HTTP请求的问题,第二部分是XML或JSON格式的数据,第二部分是图像文件。 我正在使用@Request estPart注释来接收请求 User.java会这样- 据我所知,使用@RequestPart注释,我希望根据XML多部分部分的内容类型对其进行评估,并最终将其解编组到我的用户类中(我使用的是Jaxb2

  • 我正在传递多部分文件与其他用户信息。无法将类型的属性值转换为属性嵌套异常为 下面的代码我已经试过了 控制器类 @RequestMapping(value=RestMappingURLS.user.saveUser,headers={“Content-Type=Multipart/Mixed”,“Content-Type=Multipart/Form-Data”})public RestRespon

  • 我有一个基于泽西的网络服务,它产生一个“多部分/混合”响应如下:该方法读取一个文件,并应以八位字节格式返回。此外,它读取该文件的元数据,并以json形式返回。 方法: 我的问题是,我得到了以下错误,这对我来说没有意义: 据我所知,是os。toByteArray()正在将我的对象转换为字节数组。 任何想法? 编辑:我正在使用Jersey 1.15

  • 我想写一个REST服务,它用一个zipFile和一些json数据来响应,所有的东西都在一个多部分/混合请求中。 现在我尝试使用多部分/混合响应并返回一个MultiValueMap MyMultiValueMap存在以防止类型擦除(泛型)。 这给出了

  • 问题内容: 我有一个基于Spring MVC和Resteasy的REST服务,我需要通过发送多部分/混合请求来进行测试。 该服务的编码如下: 我正在使用以下文件作为多部分mime内容发送 我正在使用curl客户端通过以下命令发送请求: 该请求确实到达了服务,但是我在JBOSS终端上看到的只是它产生了以下错误,这实际上没有任何意义。没有堆栈跟踪或任何其他错误。 听起来内容有问题,但我不太确定。 编辑

  • 有一个只接受内容类型multipart/mixed的REST API。 正在尝试使用restTemplate并生成内容类型为multipart/mixed的REST请求。如果注释setContentType restTemplate默认为多部分/表单数据。 但运气不好,举个例子,我如何调用API生成多部分/混合请求? 也许这个有帮助