Content-Type与@RequestParam、@RequestBody的对应写法,助你一臂之力

933 阅读3分钟

Content-Type

Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型,通过这个属性来告诉服务器如何处理请求的数据。在进行HTTP传输的区分数据类型,比如发送ajax(不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容),如果这个属性设置得不准确,会导致请求失败,所有我们传什么样的数据就要设置对应的Content-Type。

Content-Type的格式: Content-Type:type/subtype ;parameter

type:主类型,任意的字符串,如text,如果是*号代表所有; subtype:子类型,任意的字符串,如html,如果是**号代表所有,用“/”与主类型隔开; parameter:可选参数,如charset,boundary等。 例如: Content-Type: text/html; Content-Type: application/json;charset:utf-8;application/x-www-form-urlencoded

@RequestParam

1.语法:@RequestParam(value=”参数名”,required=true/false”,defaultValue=”默认值”)

2.@RequestParam:将请求参数绑定到你控制器的方法参数上

注解@RequestParam接收的参数是来自HTTP请求体或请求url的QueryString中QueryString可以理解为是url?后面的name=xxx&age=xx

注意注意注意

Content-Type的类型默认为application/x-www-form-urlencoded,但是axios默认的Content-Type为application/json,会以json字符串({"name":"tina"})的形式发送到后端,所以后台用 @RequestParam肯定是接收不到的

这里以两个登录api为例子 一个为get 另外一个为post,在没有设置请求头前默认的Content-Type为json格式

get与post的区别不理解的可以查资料哈

get请求成功,而post请求400

解决办法:post请求的Content-Type需要设置为application/x-www-form-urlencoded

 const service = axios.create({
        headers: {
            "Content-Type": 'application/x-www-form-urlencoded', 
        },
        baseURL: '/api', //接口访问的地址
        timeout: 10000,//超时
    });

为什么会出现这样呢?

首先我们来看请求参数 ,加了application/x-www-form-urlencoded,被浏览器解析为了QueryString的形式 我们上面说过@RequestParam就是用来接收像这样的字符串的

那么各位看官可以思考一下为啥get可以呢?

get 默认就是传query参数哦

那么如果get请求也要加上application/x-www-form-urlencoded会不会报错呢?

当然不会报错,加上还是query参数的格式啊

这个是json格式,@RequestParam不能映射

@RequestBody

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

例如

    import request from '@/utils/request';
        async function test() {

          //走post请求
          const res = await request({
            url: `/test?pageSize=8`,
            method: 'post',
            data: JSON.stringify({ username: 'tina', password: '123456' })
          });
          console.log(res);
        }
        @PostMapping("/test")
            public BaseResponse login(@RequestBody String jsonString,@RequestParam("pageSize") int pageSize){
                System.out.println(jsonString);
                System.out.println(pageSize);
                HashMap json=new HashMap<>();
                json.put("data","请求成功");
                return RespGenerator.returnOK(json);
            }

参考文章

blog.csdn.net/justry_deng…

juejin.cn/post/703701…