因为之前一直在学后端方面的内容,对于前端这块的知识一直半懂半不懂。昨天学了ajax,一些知识点记录下。
前端知识
最重要的两种请求方式:GET、POST。
GET : 有请求参数,无请求体
POST : 有请求体,但也可以有请求参数
通过英语单词的命名,我们其实可以推测这两个方法适用于什么场景。
‘get’:获取。查询数据库的内容,前端获取数据
‘post’:提交。前端提交数据,对数据库里的数据进行增删改
拿出我最近一直在看的开源项目renren-security,从swagger中可以更明显的对比GET和POST方法
无论是请求还是响应都具备四部分内容:请求行(响应行),请求头(响应头),空行,请求体(响应体)
抓包百度
请求头/响应头中有个重要header:content-type:它的作用是告诉接收方用什么方式来解析对应的body数据。
常见的有:application/x-wwwform-urlencoded(表单提交),text/plain(文本),application/json
前后端数据交互
前后端的数据交互是通过json实现的。
json的两种形式:json字符串,json对象
后端中controller层在接收请求时,通常会用到两个注解@RequestParam和@RequestBody,用中文解释就是请求参数,请求体。
@RequestParam用于get方法,
@RequestBody用于post方法。
1)当然你不使用注解也可以接收请求参数或请求体的数据
<script>
$('button').click(function () {
$.ajax({
url:"http://localhost:8080/ajax",
//post方法
method:"post",
//传过去的数据
data:{
name:'leib',
age:'23'
},
success:function (response) {
console.log(response);
}
})
})
</script>
在Person类中有对应的name属性和age属性,springmvc会自动映射
@RequestMapping("/ajax")
//不用任何注解接收请求体数据
public Person ajax(Person p){
return p;
}
通过抓包发现,请求方式为POST,请求体的数据格式为表单数据。
但从后端响应的数据为json对象。
controller层在返回对象时,会自动将java对象转为json对象。但是不是说json有两种格式嘛…一个json对象,一个json字符串。你怎么证明你获得的就是json对象而不是json字符串呢。
在前端代码中只需修改一处即可证明
如果是对象,那么就有属性,我就来打印这个属性,有数据就可以说明是json对象
在前端页面添加contentType:‘application/json’,表明前端在告诉服务器我的数据已经转为json格式,请你也用json格式解析。
对于JSON格式,springmvc无法解析,需要添加@RequestBody。
2)注解@RequestBody
注解@RequestBody常用来处理cnotallow='application/json’的内容,当形参为javabean时,spring就会将request body中的json对象解析成该参数类型的Javabean对象。
使用JQuery框架,前端传进的json数据必须是json字符串,后端接收时会将json字符串转成json对象
如果你前端的数据直接是json对象,则会报如下错误
因为jQuery默认的conten-type为表单提交,因此如果使用@RequestBody,在后台会报如下错误。
Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]
**注意:如果使用@RequestBody String str,你仍然可以成功的解析该表单格式的数据并进行使用。**上述报错是因为服务器的@RequestBody在将数据用表单提交的方式解析后,无法与person对象的属性相映射。
3)axios框架
使用axios框架来帮助开发者传递json,因为axios默认的content-type为application/json,所以无需设置contentType。
同时使用post方法,可以实现传递json对象,而无需在前端将json对象转成json字符串
get请求方式 传递给后台的参数都是字符串形式,无法传递json对象 或数组对象等
post请求方式则可以实现,但若后台接口要求必须用get方式传递对象给后台,需要装插件
axios.post("/axios",
{name:"admin",age:"23"},
{
//url请求参数
params: {
id:200,
vip:9
},
//请求头
headers:{
name:'123456'
}
}).then(function(data){
console.log(data)
})
@RequestBody接收请求体中的表单数据。
1、application/x-www-form-urlencoded
@requestbody能解析,但springmvc会进行解析,所以通常不用@requestbody。
2、multipart/form-data
@requestbody不能解析
3、application/json,application/xml等
@requestbody能解析,springmvc不会进行解析,所以必须要加@requestbody注解