• 简单记录下@RequestBody(关于它和@RequestParam接收数据方式的拓展)


    内容参考自博客:https://blog.csdn.net/ff906317011/article/details/78552426

    这个标注是用来注释controller中的请求方法中的参数的,那么什么时候要用这个注解呢?

    主要看请求的方式和请求header的编码方式:

    1.请求方式为get/post时,根据request header Content-Type的值来判断:

      如果Content-Type是application/x-www-form-urlencoded的话,可以选择用这个注解,但这种情况用@ReauestParam也能处理

        (不过似乎如果上传的是Content-Type是application/x-www-form-urlencoded的json数据的话,可以用@RequestParam 的 Map型数据来接~)

      如果是multipart/form-data,这个注解不能处理

      如果是像application/json, application/xml其他格式,则必须使用这个注解来处理!(可以直接把传过来的json数据绑定到对象参数中去)

    2.请求方式为put时,根据request header Content-Type的值来判断:

      如果Content-Type是application/x-www-form-urlencoded的话,必须用这个注解来处理

      如果是multipart/form-data,不能处理

      如果是像application/json, application/xml其他格式,必须用这个注解来处理

    注意!这个RequestBody接收的是json字符串!一般建议如果是表单的提交,后台可以用对象来收,RequestBody会自动转换,并且前端要

    JSON.stringify(from)

    ,然后记得改header为json!

    看个例子。首先是用@requestParam:

    前端:

    $.ajax({
                url: productBase.baseUrl + "/saveProductbaseEdition",
                type: "POST",
                data: {userId:getCookie(appCommon.personid)},
                  //data:'{"userId":"getCookie(appCommon.personid)"}',//传个使用者的id过去
                success: function (data) {
                    console.log(data);
                    if (data.code == '0') {
                        layerTips.msg("归档成功!");
                        productBase.refresh();
                    } else {
                        layerTips.msg("归档失败!")
                    
                    }
                }
      });

    那个getCookie是一个id,然后后端:

    @ApiOperation(value="基地数据信息归档操作", notes="基地数据信息归档操作")
        @PostMapping("/saveProductbaseEdition")
        public R saveEdition(@RequestParam Map<String, Object> map) {
            System.out.println("##########test  "+map.get("userId"));
            //productBaseService.saveEdition();
            return R.ok();
    }

    用一个map来接收,成功收到对象。

    这里这个data不是json的意思,应该是Ajax这个参数的一种形式 ,然后它会自动帮你转换成正确的形式传过去。

    然后是用@RequestBody来接收json,由于这个注解要求传过来的是json字符串,一开始不知道,也是这样写,然后一直报错说什么不能识别,

    后来写了个实验来证明这个确实是要字符串的json:

     前端:

    $.ajax({
                url: productBase.baseUrl + "/saveProductbaseEdition",
                type: "POST",
                //data: {userId:getCookie(appCommon.personid)},
                  data:'{"userId":"getCookie(appCommon.personid)"}',//传个使用者的id过去
                headers : {  
                    'Content-Type' : 'application/json;charset=utf-8'  
                },
                success: function (data) {
                    console.log(data);
                    if (data.code == '0') {
                        layerTips.msg("归档成功!");
                        productBase.refresh();
                    } else {
                        layerTips.msg("归档失败!")
                    
                    }
                }
            });
            layer.close(index);
        });

    后端:

    @ApiOperation(value="基地数据信息归档操作", notes="基地数据信息归档操作")
        @PostMapping("/saveProductbaseEdition")
        public R saveEdition(@RequestBody Map<String, Object> map) {
            System.out.println("##########test  "+map.get("userId"));
            //productBaseService.saveEdition();
            return R.ok();
    }

    可以看到前端加了head的说明,然后这里的json是全字符串,所以拿到的是:

    不过这里也发现,如果直接传一个值过去,好像也可以……

    前端:

    $.ajax({
                url: productBase.baseUrl + "/saveProductbaseEdition",
                type: "POST",
                //data: {userId:getCookie(appCommon.personid)},
                  data: getCookie(appCommon.personid),//传个使用者的id过去
                headers : {  
                    'Content-Type' : 'application/json;charset=utf-8'  
                },
                success: function (data) {
                    console.log(data);
                    if (data.code == '0') {
                        layerTips.msg("归档成功!");
                        productBase.refresh();
                    } else {
                        layerTips.msg("归档失败!")
                    
                    }
                }
     });

    后端:

    @ApiOperation(value="基地数据信息归档操作", notes="基地数据信息归档操作")
        @PostMapping("/saveProductbaseEdition")
        public R saveEdition(@RequestBody String id) {
            System.out.println("##########test  "+id);
            //productBaseService.saveEdition();
            return R.ok();
    }

    然后后面直接用个String类型的值来接,也拿到了数据~

    更多细节到参考博客:https://blog.csdn.net/ff906317011/article/details/78552426上去了解!

  • 相关阅读:
    带宽利用率提升50%,腾讯云联网架构方案解析
    重构实践:基于腾讯云Elasticsearch搭建QQ邮箱全文检索
    存算分离下写性能提升10倍以上,EMR Spark引擎是如何做到的?
    秒级去重:ClickHouse在腾讯海量游戏营销活动分析中的应用
    降本提效,贝壳搜索推荐架构统一之路
    亿级用户,腾讯看点信息流推荐系统的架构挑战
    优秀程序员,如何提高架构能力?
    如何创建体元栅格?
    导出属性表字段结构
    去除镶嵌数据集中影像的黑边或白边
  • 原文地址:https://www.cnblogs.com/wangshen31/p/8672603.html
Copyright © 2020-2023  润新知