ajax: 浏览器和服务器数据交互的网页技术 异步的xml和javascript
下文中会用到qs这个序列化工具,将js对象转换成所需的查询字符串或表单格式
一、发送请求四个步骤
var xhr=new XMLHttpRequest();
xhr.open('请求方法','请求 url地址');
xhr.setRequestHeader('Content-Type','application/json');
xhr.send();
xhr.onreadystatechange=function(){
if(xhr.readyState===4&&xhr.status===200){
console.log(JSON.stringify(xhr.responseText))
}
}
注意: 服务器返回给客户端的数据都是json格式,如果最后,接收到的不是json格式,则是使用的第三方库帮忙转化的。
上述代码,相关说明
1.open(method,url)
参数: mthod: 取值可以为GET/POST/HEAD/DELETE/OPTIONS/PUT url: 请求的主体,发送请求的接口地址
2.requestHeader(属性名称, 属性值)
在AJAX中,如果要post特定格式的数据,需要使用 setRequestHeader() 方法来添加 HTTP 头 ,否则,后台可能接收不到需要的数据。数据通过send()方法发送 ,setRequestHeader()方法需要在open()和send()方法之间调用 。
-
常用的数据格式(编码可带可不带)
xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded; charset=utf-8');
- 发送纯文本(不指定Content-type时,此是默认值)
xhr.setRequestHeader('Content-type', 'text/plain; charset=utf-8');
xhr.setRequestHeader('Content-type', 'text/html; charset=utf-8');
3.send()设置发送的数据,开始和服务器端交互
参数: 请求主体内容,如果没有,为null,或者省略。post携带的参数才会在send中发送。
注意: 如果发送的请求携带参数
get: 请求参数以查询字符串的方式拼接在url后方
xhr.open('get','http:127.0.0.1:8080?a=1&b=2');
let obj={
a:1
b:2
}
xhr.open('get',url路径+Qs.stringify(obj));
post: 请求参数需要传入send()中发送,并且需要根据设置的请求头,发送对应格式的数据
let obj={
a:1
b:2
}
xhr.setRequestHeader('Content-type', 'application/json');
xhr.send(JSON.stringify(obj));
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send(Qs.stringify(obj));
xhr.send('a=1&b=2');
4.接收响应,获取数据
发送请求后,会收到响应,收到响应后,XHR对象的以下属性会被填充上数据。
-
responseText: 作为响应体返回的文本。 -
responseXML: 如果响应的内容类型是"text/xml"或"application/xml",那就是包含响应数据的 XML DOM 文档。 -
status: 响应的 HTTP 状态。 -
statusText: 响应的 HTTP 状态描述。 -
readyState: 返回HTTP请求状态 0 open()尚未调用 UNSENT 1 open()已调用 OPENED 2 接收到头信息 HEADERS_RECEIVED 3 接收到响应主体 LOADING 4 响应完成 DONE -
readystatechange: 请求状态改变事件 当readyState值改变为4或服务器的响应完成时,所有的浏览器都触发该事件
二、原生get请求
var xhr=new XMLHttpRequest();
xhr.open('get','http://127.0.0.1:8000?a=1&b=2');
xhr.send();
xhr.onreadystatechange=function(){
if(xhr.readystate===4&&xhr.status===200){
console.log(JSON.stringify(xhr.responseText))
}
}
三、原生post请求
var xhr=new XMLHttpRequest();
xhr.open('post','http://127.0.0.1:8000');
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send('a=1&b=2');
xhr.onreadystatechange=function(){
if(xhr.readyState===4&&xhr.status===200){
console.log(JSON.stringify(xhr.responseText))
}
}
四、JQuery-$.ajax
1 ajax请求(通用请求)
$.ajax({
url: 'http://127.0.0.1:8000/jquery-server',
data: {a:100, b:200},
type: 'GET',
dataType: 'json',
headers: {
Content-Type:'application/json',
Authrization:token,
},
timeout: 2000,
success: function(data){
console.log(data);
},
error: function(){
console.log('出错啦!!');
},
});
2 get 请求
$.get(url, [data], [callback], [type]) url: 请求的 URL 地址。 data: 请求携带的参数。 callback: 载入成功时回调函数。 type: 设置返回内容格式,xml, html, script, json, text, _default。
var obj = {
page: 1,
pageSize: 10
}
url='http://127.0.0.1:8080'
$.get(url, obj, function(res) {
console.log(res)
})
2 post 请求
同get一样使用 $.post(url, [data], [callback], [type]) url: 请求的 URL 地址。 data: 请求携带的参数。 callback: 载入成功时回调函数。 type: 设置返回内容格式,xml, html, script, json, text, _default。
五、自定义$.ajax
该自定义ajax默认发送表单格式的数据 _ajax.js
function resloveData(data) {
let arr = []
for (let i in data) {
var str = i + '=' + data[i]
arr.push(str)
}
return arr.join('&')
}
function _ajax(data) {
var xhr = new XMLHttpRequest()
var qs = resloveData(data.data)
if (data.method.toUpperCase() === 'GET') {
xhr.open(data.method, data.url + qs);
xhr.send()
} else if (data.method.toUpperCase() === 'POST') {
xhr.open(data.method, data.url);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(qs);
}
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 && xhr.status === 200) {
var res = JSON.parse(xhr.responseText);
data.success(res);
}
}
}
test.html
<script src="./_ajax.js"></script>
<script>
_ajax({
method: '请求类型',
url: '请求地址',
data: { },
success: function(res) {
console.log(res)
}
})
</script>
|