区别一般 http 请求与 ajax 请求
1. ajax 请求是一种特别的 http 请求
2. 对服务器端来说, 没有任何区别, 区别在浏览器端
3. 浏览器端发请求: 只有 XHR 或 fetch 发出的才是 ajax 请求, 其它所有的都是 非 ajax 请求
4. 浏览器端接收到响应
(1) 一般请求: 浏览器一般会直接显示响应体数据, 也就是我们常说的刷新 / 跳转页面
(2) ajax 请求: 浏览器不会对界面进行任何更新操作, 只是调用监视的回调函数并传入响应相关数据
1. XMLHttpRequest(): 创建 XHR 对象的构造函数 2. status: 响应状态码值, 比如 200,404 3. statusText: 响应状态文本 4. readyState: 标识请求状态的只读属性 0: 初始 1: open()之后 2: send()之后 3: 请求中 4: 请求完成 5. onreadystatechange: 绑定 readyState 改变的监听 6. responseType: 指定响应数据类型, 如果是'json', 得到响应后自动解析响应体数据 7. response: 响应体数据, 类型取决于 responseType 的指定 8. timeout: 指定请求超时时间, 默认为 0 代表没有限制 9. ontimeout: 绑定超时的监听 10. onerror: 绑定请求网络错误的监听 11. open(): 初始化一个请求, 参数为:(method,url[,async]) 12. send(data): 发送请求 13. abort(): 中断请求 14. getResponseHeader(name): 获取指定名称的响应头值 15. getAllResponseHeaders(): 获取所有响应头组成的字符串 16. setRequestHeader(name,value): 设置请求头
封装Ajax
function myAjax(opt) {
//默认参数
opt = opt || {};
opt.method = opt.method || 'GET';
opt.url = opt.url || '';
opt.async = opt.async || true;
opt.data = opt.data || null;
opt.dataType = opt.dataType || 'JSON';
opt.success = opt.success || function () { };
var xmlHttp = null;
if (XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
} else {
xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}
var params = [];
for (var key in opt.data){
params.push(key + '=' + opt.data[key]);
}
var postData = params.join('&');
if (opt.dataType === 'JSONP') {
creatScript(opt.url, postData);
} else {
if (opt.method.toUpperCase() === 'POST') {
xmlHttp.open(opt.method, opt.url, opt.async);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
xmlHttp.send(postData);
} else if (opt.method.toUpperCase() === 'GET') {
xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
xmlHttp.send(null);
}
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
if (opt.dataType === 'JSON') {
opt.success(xmlHttp.response);
}
}
}
}
}
ajax封装
function obj2str(data) { /* { "userName":"lnj", "userPwd":"123456", "t":"3712i9471329876498132" } */ data = data || {}; // 如果没有传参, 为了添加随机因子,必须自己创建一个对象 data.t = new Date().getTime(); var res = []; for(var key in data){ // 在URL中是不可以出现中文的, 如果出现了中文需要转码 // 可以调用encodeURIComponent方法 // URL中只可以出现字母/数字/下划线/ASCII码 res.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key])); // [userName=lnj, userPwd=123456]; } return res.join("&"); // userName=lnj&userPwd=123456 } function ajax(option) { // 0.将对象转换为字符串 var str = obj2str(option.data); // key=value&key=value; // 1.创建一个异步对象 var xmlhttp, timer; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } // 2.设置请求方式和请求地址 /* method:请求的类型;GET 或 POST url:文件在服务器上的位置 async:true(异步)或 false(同步) */ if(option.type.toLowerCase() === "get"){ xmlhttp.open(option.type, option.url+"?"+str, true); // 3.发送请求 xmlhttp.send(); }else{ xmlhttp.open(option.type, option.url,true); // 注意点: 以下代码必须放到open和send之间 xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xmlhttp.send(str); } // 4.监听状态的变化 xmlhttp.onreadystatechange = function (ev2) { /* 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4: 请求已完成,且响应已就绪 */ if(xmlhttp.readyState === 4){ clearInterval(timer); // 判断是否请求成功 if(xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status === 304){ // 5.处理返回的结果 // console.log("接收到服务器返回的数据"); option.success(xmlhttp); }else{ // console.log("没有接收到服务器返回的数据"); option.error(xmlhttp); } } } // 判断外界是否传入了超时时间 if(option.timeout){ timer = setInterval(function () { console.log("中断请求"); xmlhttp.abort(); clearInterval(timer); }, option.timeout); } }