@RequestPart-Java接口,同时传参JSON对象数据和文件---详解

目录

一、简单介绍

二、详细例子

1.传很多个参数

2.传一个文件参数+一个JSON对象


一、简单介绍

1.前端传递文件参数的时候,通常会使用POST方式传参,将请求header的content-type设置为:multipart/form-data(因为 GET 请求只能传递文本类型的参数,而文件属于二进制数据,无法直接通过 GET 方式传递。)

2.前端通过POST传参时,header的content-type设置为"application/json"

3.前端通过GET方法传递参数时,一般不会使用 Content-Type 请求头,因为 GET 请求的参数是通过 URL 中的查询字符串参数来传递的,不需要使用 Content-Type 请求头来表示参数的类型

4.后端POST请求请求:参数为JSON对象时,使用@RequestBody 注解标识

5.后端POST请求:参数为文件时,使用(@RequestParam("file") MultipartFile file),(@RequestPart(value = "file", required = true) MultipartFile file) 两种方式的注解都行

6.后端接受POST请求:参数为JSON对象+文件时:这时候可以使用@RequestPart参数来接收实体对象,@RequestParam来单个接收参数

@RequestPart这个注解用在multipart/form-data表单提交请求的方法上。

@RequestParam也同样支持multipart/form-data请求。

@RequestParam和@RequestPart的区别是:@RequestParam适用于name-valueString类型的请求域,@RequestPart适用于复杂的请求域(像JSON,XML)

二、详细例子

后端接受POST请求:参数为JSON对象+文件时  ---前端有两种传参方式方式

1.传很多个参数

将传参header的content-type设置为:multipart/form-data ,将每个参数都当做文件进行传参(字段类型不同,文件为MultipartFile类型 ,文件数组为MultipartFile[]类型,其他为String类型) (前端很容易设置)

Postman测试接口工具

Java后端代码:注解全用@RequestParam ,全部用这一个注解接收参数(可行)

    @PostMapping("/addDirectlySellGoods")
    public Resource<String> addDirectlySellGoods(@RequestParam("goodsPicture") MultipartFile[] goodsFile, @RequestParam("certPicture") MultipartFile[] certFile,
                                                  @RequestParam("goodsName") String goodsName, @RequestParam("goodsType") String goodsType, 
                                                  @RequestParam("goodsFee") String goodsFee, @RequestParam("sellerPosition") String sellerPosition, 
                                                  @RequestParam("wechatAcct") String wechatAcct, @RequestParam("goodsDesc") String goodsDesc) {
        InDirectlySellDto in = new InDirectlySellDto();
        in.setGoodsName(goodsName);
        in.setGoodsType(goodsType);
        in.setGoodsFee(goodsFee);
        in.setSellerPosition(sellerPosition);
        in.setWechatAcct(wechatAcct);
        in.setGoodsDesc(goodsDesc);
        System.out.println("直接卖前端传递的参数:" + in);
        String data = consignmentService.addDirectlySellGoods(goodsFile,certFile,in);
        //String data = "COMMON_SUCCESS";
        return new Resource<>(props.getProcessStatus(data));
    }

2.传一个文件参数+一个JSON对象

前端需将传参header的content-type , 通过判断设置为两种multipart/form-data + application/json(需百度自行查询,前端可能不容易设置)

Postman测试接口工具

Java后端代码:注解全用@RequestPart ,全部用这一个注解接收参数(可行)

@Validated 注解:用于验证 Java 对象中的属性是否符合验证规则(未仔细研究,不加一般也不会报错),可以提高代码的可读性和可维护性,同时也可以避免一些常见的错误,如空指针异常等

   /**
     * 数据上报接⼝
     */
    @PostMapping("/dataReport")
    public Resource<String> dataReport(@RequestPart(value = "file", required = true) MultipartFile file ,@RequestPart @Validated DataReportInDto dto){
        String code = dataReportService.dataReport(file,dto);
        return new Resource<>(props.getProcessStatus(code));
    }

要使Java接口同时支持application/json和application/x-www-form-urlencoded,可以通过以下步骤实现。 首先,将ajax发送请求的Content-Type从application/json改为application/x-www-form-urlencoded。这样浏览器会将form数据转换成一个字串,并将其附加到URL后面(对于GET请求),或者封装到HTTP body中(对于POST请求)\[1\]。 其次,在Java的Controller中的接口方法上,使用@RequestBody注解来接收application/json格式的数据\[2\]。这样,当请求的Content-Type为application/json时,后端可以正确地接收前端提交的JSON格式的数据。 另外,对于application/x-www-form-urlencoded格式的数据Java的Controller方法可以直接接收表单数据,无需使用@RequestBody注解\[1\]。 通过以上步骤,Java接口就可以同时支持application/json和application/x-www-form-urlencoded两种数据格式了。这样,前端可以根据需要选择合适的数据格式进行请求。 #### 引用[.reference_title] - *1* [application/json与application/x-www-form-urlencoded详解](https://blog.csdn.net/weixin_42039228/article/details/124830035)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [application/x-www-form-urlencoded与application/json](https://blog.csdn.net/weixin_43543882/article/details/117248532)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值