最近搜索

加不加@RequestBody有什么区别

浏览:145
管理员 2025-03-30 13:49



vue3项目用的都是 RequestBody

@RequestMapping("/list")
public R list(@RequestBody PageBean pageBean) {
    Map<String, Object> map = new HashMap<String, Object>();

    if(StringUtil.isNotEmpty(pageBean.getQuery())){
        map.put("q",pageBean.getQuery());
    }
    if(StringUtil.isNotEmpty(pageBean.getCode())){
        map.put("code",pageBean.getCode());
    }


    Page<BigType> lite_temp =  bigTypeService.list(map,  pageBean.getPageNum(),pageBean.getPageSize());
    Map<String, Object> resultMap = new HashMap<>();
    resultMap.put("bigTypeList", lite_temp.getRecords());
    resultMap.put("total", lite_temp.getTotal());
    return R.ok(resultMap);
}


或者这样接受 。 使用map

@CrossOrigin
@ResponseBody
@RequestMapping("/save")
public String save(@RequestBody Map<String, String> params ) throws Exception {
    JSONObject result = new JSONObject();
    String excelData = params.get("excelData");
    String fileName = params.get("fileName");

    System.out.println(excelData);
    System.out.println(fileName);
    return "[{},{},{}]";
}


RequestBody 这种数据一般是这样传递。


image.png




不加@requestBody 数据一般是这样。


image.png

@CrossOrigin
@ResponseBody
@RequestMapping("/load")
public String load(String gridKey) throws Exception {
    JSONObject result = new JSONObject();
    System.out.println(gridKey);
    return "[{},{},{}]";
}

我们thmeleaf用的就是这种。








在Spring MVC中,加不加@RequestBody注解对参数绑定的处理方式有本质区别,具体差异如下:


数据来源不同‌


加@RequestBody‌:从请求体(如JSON、XML等)中获取数据,并自动反序列化为BigType对象。适用于POST/PUT请求中传输结构化数据的情况‌。

不加@RequestBody‌:从URL参数或表单数据中获取键值对,通过@ModelAttribute默认绑定到XiaoshouHead对象。适用于传统表单提交或GET请求‌。


Content-Type要求不同‌

加@RequestBody‌:要求请求头Content-Type为application/json或application/xml等非表单格式,否则会抛出415错误‌。

不加@RequestBody‌:默认处理application/x-www-form-urlencoded或multipart/form-data格式,参数通过URL或表单字段传递‌。


数据解析机制不同‌

加@RequestBody‌:依赖HttpMessageConverter(如MappingJackson2HttpMessageConverter)完成数据到对象的转换,支持复杂嵌套结构‌。

不加@RequestBody‌:通过DataBinder按字段名匹配绑定,无法直接处理多层嵌套的JSON数据‌。


适用场景对比‌

加@RequestBody的save方法‌:适合RESTful API中接收前端传递的JSON对象,如通过Ajax或Postman发送的请求‌。

不加@RequestBody的add方法‌:适合传统表单提交或简单参数传递,例如HTML表单或URL拼接参数‌。


示例说明‌

当请求为POST /save且携带JSON:{"name":"类型1","createTime":"2025-03-30"}时,@RequestBody能正确映射到BigType对象。

若请求为POST /add?name=测试&amount=100,则XiaoshouHead会通过表单参数完成属性填充‌。



案例如下


这种方式不加@RequestBody

$.post("/admin/xiaoshou/head/add", 

    {remark: remark, client: client, phone: phone, address: address}, 

    function(result) {}, 

    "json"

);


这种方式加@RequestBody

$.ajax({

    url: "/admin/xiaoshou/head/add",

    type: "POST",

    contentType: "application/json", // 明确声明JSON格式‌:ml-citation{ref="1,8" data="citationList"}

    data: JSON.stringify({           // 序列化为JSON字符串‌:ml-citation{ref="1,8" data="citationList"}

        remark: remark,

        client: client,

        phone: phone,

        address: address

    }),

    dataType: "json",

    success: function(result) {}

});


 ‌关键调整点

  • contentType参数‌:必须设置为application/json,否则后端无法通过@RequestBody解析‌18

  • JSON.stringify()‌:将对象序列化为JSON字符串,避免传输格式错误‌18




java代码发送post请求 如何模仿 从URL参数或表单数据中获取键值对   请求体(如JSON、XML等)中获取数据





联系站长

站长微信:xiaomao0055

站长QQ:14496453