ajax是浏览器提供的用于操作浏览器的sdk,可以让浏览器帮我们发送请求和后台交互。
http协议
请求报文:
请求行 url method
请求头
Content-Type:application/x-www-form-urlencoded
请求体
如果请求方式是get,请求体没有数据
响应报文:
响应行 200 OK
响应头 Content-Type :“application/json”
响应体 “{“status”:“200”,“message”:“登录成功”,data:{}}”
1)实例化xhr对象
var xhr = new XMLHttpRequest();
2)设置请求行
xhr.open(method,url,async)
method请求方法
url请求地址
async是否异步,默认为true
3)设置请求头
xhr.setRequestHeader(k,v)
如果是get方式,无需设置Content-Type,因为Content-Type请求体中数据编码格式
4)设置请求体
data为对象
xhr.send(data)
当method=get,data就不需要了
如果第三步中设置Content-Type="application/json"
xhr.send(JSON.stringify(data))
如果第三步中设置Content-Type="application/x-www-form-urlencoded"
xhr.send(qs.stringify(data))
5)监听请求状态的改变
xhr.onreadystatechange = function(){
if(xhr.readyState === 4){
if(xhr.status === 200){
var resp = JSON.parse(xhr.response)
status:业务状态
message:业务消息
data: 查询的数据
timestamp: 事件戳
}
}
}
xhr.readyState
浏览器的就绪状态
xhr.status
服务器端的响应状态
业务状态(前后台程序员协商的)
xhr.status
响应状态
200 ok
404 not found
500 服务接口出错
401 未授权
403 被拒绝,无权访问
readystate
表示xhr的状态
0 UNSENT 代理被创建,但尚未调用 open() 方法。
1 OPENED open() 方法已经被调用。
2 HEADERS_RECEIVED send() 方法已经被调用,并且头部和状态已经可获得。
3 LOADING 下载中; responseText 属性已经包含部分数据。
4 DONE 下载操作已完成。
在发送posr请求前会先发送一个OPTIONS请求
OPTIONS请求也称为探兵请求,在正式请求发送之前发送的一个检测服务端的请求
并且Content-Type的取值不是以下三种之一:
1. application/x-www-form-urlencoded
查询字符串 默认
忽略空格
2.multipart/form-data
文件流/二进制流
上传文件 图片
3.text/plain
会将空格转换为+,纯文本
我们在做项目的时候一般不用这种原始开发,而是使用一些封装好的异步处理,如ajax和axio。它们其实是将原生的ajax进行封装,进而简化使用。
post方法一般有两种参数,一种为查询字符串,另一种为JSON字符串。
如果为查询字符串,Content-Type=“application/x-www-form-urlencoded”,
JSON字符串:Content-Type=“application/json”。js的原始ajax的post请求默认为JSON,而jquery的ajax默认为查询字符串。