这周在做一个小型的前后端分离的会议系统,前端使用的是Vue3
,后端使用的是Springboot
。原本以为前后端交互很简单,直接发送数据就可以了,没想到遇到了很多问题,具体说来就是:1、get和post请求应该如何向后端传递参数
;2、前端请求体中参数的存储
有哪几种格式,对于不同的存储方式后端应该如何去接收;3、http报文头的content-type
到底有什么作用;4、字符集的编码
应该如何指定;
接下来就让我们逐个来解决这些问题吧!
注意:axios所有请求中不用自己指定content-type了,也就是下面的代码中不需要传入headers对象了,人家好像会根据你传入的参数自动推断。
前后端交互中肯定需要传递参数,在发送请求时我们需要在报文的头部headers
指定content-type
属性。参数有三种常见存储格式,接下来一一分析。
参数以json对象
的格式发送,此时前端发送的对象可以直接是javascript语言的对象,后端需要使用@RequestBody
注解接收参数,不能使用@RequestParam
来接收。
优点
缺点
postJson() {
let config = {
headers: {'Content-Type': "multipart/json, charset=UTF-8"}
};
let data = {
fileName: '我爱你中国'
};
this.$axios
.post('/api/file/testconttype', data, config);
}
form-data是浏览器中一种特殊的数据格式,当前端发送的数据为form-data格式时,参数的存储格式为参数名=参数值&参数名=参数值
,可以通过RequestParam
注解接收参数。
优点
缺点
FormData
类型,属性需要逐个append
进去postFormdata() {
let config = {
headers: {'Content-Type': "multipart/form-data, charset=UTF-8"}
};
// formdata对象
let data = new FormData();
data.append('fileName', '我爱你中国')
this.$axios
.post('/api/file/testconttype', data)
}
axios默认使用的是json格式,如果需要使用x-www-form-urlencoded
格式,则需要使用QS
库,想要了解的同学自己搜一下吧,个人觉得上面两种方式已经够用了,既可以传送单个参数
,也可以传送整体的json对象
。
在vue3中我使用了axios
模块进行请求,该模块提供了两种请求方式,即我们熟知的get
请求和post
请求。这里我们简单说一下两种请求方式的区别:get请求的参数会绑定到url后面,而post请求的参数会放入请求体中。
因为get请求没有消息体,所有的参数都在Url中。所以使用axios发送get请求时如果需要传递参数就用params
属性指定,值可以是一个js对象;后端接收时可以使用@RequestParam
注解接收。
get() {
let data = {
fileName: '我爱你中国'
};
this.$axios
.get('/api/file/testconttype', {
params: data
})
.then(response => {
alert(response.data.data);
})
}
后端使用@RequestParam
注解接收。
@RequestMapping("/testconttype")
public String test(@RequestParam String fileName) {
logger.info(fileName);
String s = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
logger.info(s);
return s;
}
想要让后端支持接收单个字段,前端就必须是FormData
格式或x-www-form-urlencoded
格式,所以参数对象就不能是简单的js对象了,具体代码如下:
postFormdata() {
let config = {
headers: {'Content-Type': "multipart/form-data, charset=UTF-8"}
};
// formdata对象
let data = new FormData();
data.append('fileName', '我爱你中国')
this.$axios
.post('/api/file/testconttype', data)
}
后端使用@RequestParam
注解接收。
@RequestMapping("/testconttype")
public String test(@RequestParam String fileName) {
logger.info(fileName);
String s = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
logger.info(s);
return s;
}
前端可以发送简单的js对象给后端,后端使用@ResponseBody
注解接收即可。
postJson() {
let config = {
headers: {'Content-Type': "multipart/json, charset=UTF-8"}
};
let data = {
fileName: '我爱你中国'
};
this.$axios
.post('/api/file/testconttype', data, config);
}
后端使用@RequestBody
注解接收。
get
请求,直接传入普通的js对象
即可,axios会自动处理使得后端可以通过@RequestParam
注解接收参数。单个参数
,则需要传入FormData
类型的参数,此时后端仍可以通过@RequestParam
注解接收参数。整体接收参数
,那么前端直接传入简单的js对象
即可,后端使用@RequestBody
注解接收。axios编码格式
@RequestBody注解的使用
Content-type详解,包括文件下载时应该使用的content-type
axios官网