【问题标题】:How to use @RequestBody and @RequestParam together如何一起使用@RequestBody 和@RequestParam
【发布时间】:2018-08-19 11:20:32
【问题描述】:

我正在尝试同时使用 @RequestBody 和 @RequestParam 通过 Postman 发送 JSON 和多个文件,但它不起作用。是否可以在 API 中同时使用这两个注解?

@RequestMapping(value = "/save/product/test", method = RequestMethod.POST)
public ResponseEntity<?> save(@Valid @RequestBody ProductVo productVo, @RequestParam("files") @NotNull @NotBlank MultipartFile[] uploadfiles) {

    System.out.println("body " + productVo.toString());
    for (MultipartFile file :  uploadfiles) {
        System.out.println(file.getOriginalFilename());
        System.out.println(file.getContentType());
        System.out.println(file.getName());
        System.out.println(file.getSize());

    }
    return new ResponseEntity<APIResponse>(this.apiResponse, HttpStatus.NO_CONTENT);
}

【问题讨论】:

  • RequestParam 用于查询参数在 URL 中,我怀疑这是您传递文件的方式。
  • @jonrsharpe 我现在也可以通过 Url 附上点文件
  • 目前我必须解决 2 个问题,我正在尝试解决 1)我们如何在 POJO 类下发送文件 2)我们如何使用上述案例

标签: java spring spring-mvc spring-boot


【解决方案1】:

@RequestParam 从 uri 获取参数,您实际上是在尝试实现其他目标。

这是一个示例控制器,带有 json 正文和多部分文件:

@RestController
@RequestMapping("/users")
public class UserController {

    UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @PostMapping({"/", ""})
    public ResponseEntity<User> post(@RequestPart("request") UserCreateRequest request, @RequestPart("file") MultipartFile file) throws IOException {

        String photoPath = UUID.randomUUID() + file.getOriginalFilename().replaceAll(" ", "").trim();

        // other logic

        return ResponseEntity.ok(userService.create(request));
    }
}

【讨论】:

  • 嗨@Emre,当我使用 curl curl -i -X POST 'localhost:9191/save/product/test' -H "Content-Type: multipart/form-data" -F "request={ "productName" : "nabeel", "price" : 2500.0, "status": 0, "catList" : [1,2,3] }" -F "files=@C:/Users/AdMaxim/Desktop/check this.png" 发送请求时,我会在更新后使用您的代码,它会显示此消息 {"timestamp":"2018-08-19T12:44: 36.626+0000","status":415,"error":"Unsupported Media Type","message":"Content type 'application/octet-stream' not supported","path":"/save/product/test "}
  • 嗨 @user2738014 我正在使用 macOs,我通过 curl 使用命令成功发送请求:curl -i -X POST \ -H 'Content-Type: multipart/mixed' \ -F 'request={ "name" : "nabeel" };type=application/json' \ -F 'file=@/Users/emre/Desktop/creativity.jpg' \ http://localhost:8080/users
【解决方案2】:

您可以通过将 multipart 与其他字段一起包装来轻松生活:

  class UploadContext {

    private MultipartFile file;
    private UserCreateRequest request;
    // other fields
 }

并在控制器中使用这个对象:

    @PostMapping(value = "/upload")
    public void upload(UploadContext context) {
        // controller logic here
    }

文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-multipart-forms

在您的客户端代码中,您必须从标头中清除内容类型:

     headers: {'Content-Type': undefined}

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    可以通过MultipartHttpServletRequest 和RequestParam 上传任意数量的文件和字符串参数。

    需要注意的一点:MultipartHttpServletRequest 也将保存所有请求参数,因此从技术上讲,您甚至可以只拥有 MultipartHttpServletRequest 并解析它

    控制器的签名是:

    public ResponseEntity<BulkUploadResponsePayload> filesAndJson(
                @ApiParam(hidden = true) MultipartHttpServletRequest multipartRequest,
                @RequestParam(value = "json-param",name = "json-param") String documentType) {
         // multipartRequest will have all the files
         // you can use json-param for any string
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多