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);
}
参考文章