浅学AJAX

106 阅读5分钟

♥️♥️♥️ 李哈哈要奋发啦~冲冲冲!!!相信只要坚持学习会有所回报的!♥️♥️♥️

简单地过一遍Ajax的知识点,留下学习过的痕迹!

一、AJAX简介

AJAX 全称 Asynchronous JavaScript And XML,就是异步的JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据。 AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。

请求报文

重点是格式与参数

POST /s?ie=utf HTTP/1.1Host: baidu.com
   Cookie: name= haha
   Content-type: application/x-www-from-urlencoded
   User-Agent: chrome 83
空行
体 username=admin&password=admin

响应报文

HTTP/1.1 200 OKContent-type: application/x-www-from-urlencoded
   Content-length: 2048
   Content-encoding: gzip
空行
体 <html>
        <head>
        </head>
        <body>
            <h1>AJAX</h1>
        </body>
   </html>

二、XML简介

XML 可扩展标记语言,被设计用来传输和存储数据。 XML 和 HTML类似,不同的是 HTML 中都是预定义标签,而 XML 中没有预定义标签,全都是自定义标签,用来表示一些数据。

比如说我有一个学生数据:
    name = "哈哈"; age = 18; genter = "男";
用 XML 表示:
<student>
    <name>哈哈</name>
    <age>18</age>
    <gender></gender>
</student>

三、AJAX的特点

优点:

  1. 可以无需刷新页面而与服务器进行通信。
  2. 允许你根据用户事件来更新部分页面内容。

缺点:

  1. 没有浏览历史,不能回退
  2. 存在跨域问题(同源)
  3. SEO不友好

四、express基本使用

模拟服务器,安装 npm i express;

  1. 创建 server.js文件;
  2. 启动服务器 node express.js
  3. 浏览器地址栏输入地址 127.0.0.0:8000/server
  4. 安装nodemon自动重启工具
//server.js
//1. 引入express
const express =  require('express');

//2. 创建应用对象
const app = express();

//3. 创建路由规则
//request 是对请求报文的封装
//response 是对响应报文的封装
app.get('/server',(request, response)=>{
    //设置相应头 设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*')
    //设置响应体
    response.send('HELLO EXPRESS');
})
//可以接收任意类型的请求
app.all('/server',(request, response)=>{
    //设置响应头 设置允许跨域
   response.setHeader('Access-Control-Allow-Origin','*');
   //响应头
   response.setHeader('Access-Control-Allow-Origin','*');
   //响应一个数据
   const data = {
       name: ''哈哈
   };
   //对对象进行字符串转换
   let str = JSON.stringify(data)
   //设置响应体
   response.send(str);
})

//4. 监听端口启动服务
app.listen(8000, ()=>{
    console.log("服务器已经启动, 8000端口监听中....")
})

五、AJAX基本使用

1. 操作代码(GET举例)

//获取button元素
const btn = document.getElememtsByTagName('button')[0];
//标志变量
let isSending = false; //是否正在发送AJAX请求
//绑定事件
btn.onclick = function(){
    //=== 1. 创建对象
    const xhr = new XMLHttpRequest();
    
    //判断标志变量
    if(isSending) xhr.abort(); //如果正在发送,则取消该请求,创建一个新的请求。
    isSending = true;
    
    //设置响应体数据的类型
    xhr.responseType = 'json';
    //超时设置:2s没结果就取消请求
    xhr.timeout = 2000;
    //超时回调
    xhr.ontimeout = function(){
        alert('网络异常,请稍后重试!!');
    }
    //网络异常回调
    xhr.onerror = function(){
        alert('你的网络似乎出了一些问题!')
    }
    //=== 2. 初始化 设置请求方法和 url
    xhr.open('GET','http://127.0.0.1:8000/server?a=100&b=200');
    
    //设置请求头
    xhr.setRequestHeader('Content-Type','application/x-www-from-urlencoded');
    //设置自定义请求头,会调用OPTIONS方法
    xhr.setRequestHeader('name','哈哈')
    
    //=== 3. 发送
    xhr.send();
    //=== 4. 事件绑定 处理服务器返回的结果
    xhr.onreadystatechange = function(){
        //判断(服务器返回了所有的结果)
        if(xhr.readyState === 4){
            //修改标志变量
            isSending = false;
        
        
            //判断响应状态码 200 404 403 401 500
            // 2xx 成功
            if(xhr.status>=200 && xhr.status < 300){
                //处理结果 行 头 空行 体
                //响应 
                //console.log(xhr.status); //状态码
                //console.log(xhr.statusText); //状态字符串
                //console.log(xhr.getAllResponseHeaders); //所有响应头
                //console.log(xhr.response); //响应体
                
                //(返回JSON数据处理)方法一:手动对数据转换
                //let data = JSON.parse(xhr.response);
                //let name = data.name; 
                //console.log(data);
                //(返回JSON数据处理)方法二:自动转换
                let name = xhr.response.name;
            }else {
            
            }
        }
    }
}

2. POST请求设置请求体

......
//2. 初始化 设置请求方法和 url
xhr.open('GET','http://127.0.0.1:8000/server');
//3. 发送
xhr.send('a=100&b=100');
......

3. 设置请求头信息

//设置请求头
xhr.setRequestHeader('Content-Type','application/x-www-from-urlencoded');
//设置自定义请求头,会调用OPTIONS方法
xhr.setRequestHeader('name','哈哈')

4. 服务器响应JSON数据

后端返回JSON数据

 //(返回JSON数据处理)方法一:手动对数据转换
 let data = JSON.parse(xhr.response);
 //(返回JSON数据处理)方法二:自动转换==>设置响应体数据的类型
 xhr.responseType = 'json'

5. IE缓存问题解决

添加时间戳

xhr.open('GET','http://127.0.0.1.8000/ie?t='+Date.now());

6. AJAX请求超时与网络异常处理

 //超时设置:2s没结果就取消请求
 xhr.timeout = 2000;
 //超时回调
xhr.ontimeout = function(){
    alert('网络异常,请稍后重试!!');
};
//网络异常回调
xhr.onerror = function(){
    alert('你的网络似乎出了一些问题!')
};

7. AJAX取消请求

xhr.abort();

8. AJAX请求重复发送问题

使用标志变量来判别,例:代码中的isSending

9. jquery发送AJAX请求

9. Axios发送AJAX请求

Axios是基于promise的网络请求库,可以用于浏览器和node.js。

理论上: axios是通过Promise实现对ajax技术的一种封装,就像jquery对ajax的封装一样。ajax技术实现了局部数据的刷新,axios实现了对ajax的封装;

逻辑上: ajax本身是针对MVC的编程;axios符合现在前端MVVM的浪潮。

//配置 baseURL
axips.default.baseURL = 'http://127.0.0.1:8000';
axios.get('/axios-server',{
    //url参数
    params:{},
    headers:{},
    ...
}).then(response=>{
    
})

10. Axio函数发送AJAX请求

axios({
    methods: 'POST',
    url: '/axios-server',
    params:{},
    headers:{},
    //请求体参数
    data:{}
}).then(response=>{
    
})

11. 使用fetch函数发送AJAX请求

fetch('http://127.0.0.1:8000/fetch-server?vip=10',{
    method: 'POST',
    headers: {
        name: '哈哈'
    },
    //请求体
    body: 'username=admin&password=admin'
}).then(response => {
    return response.json();
})

六、跨域

1. 同源策略

同源策略(Same-Origin Policy)最早由 Netscape 公司提出,是浏览器的一种安全策略。

同源:协议、域名、端口号 必须完全相同。

违背同源策略就是跨域。

2.如何解决跨域

1. JSONP

1)JSONP是什么

JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明才智开发出来的,只支持get请求。

2)JSONP怎么工作的?

在网页有一些标签天生具有跨域能力,比如:img link iframe script。

JSONP就是利用script标签的跨域能力来发送请求的。

3)JSONP的使用

    用户名:<input type="text" id="username">
const input = document.querySelector('input');
//声明 handle 函数
function handle() {
    input.style.border = "solid 1px #f00";
    p.innerHTML = data.msg;
}
input.onblur = function(){
    let username = this.value;
    //向服务器发送请求,检测用户名是否存在
    //1. 创建 script 标签
    const script = document.createElement('script');
    //2. 设置标签的src属性
    script.src = 'http://127.0.0.1:8000/check-username';
    //3. 将 script 插入到文档中
    document.body.appendChild(script);
}
app.all('/check-username',(request, response)=>{
   const data = {
       exist: 1,
       msg: '用户名已经存在'
   };
   //对对象进行字符串转换
   let str = JSON.stringify(data)
   //返回结果
   response.end(`handle(${str})`);
})

2. CORS

  1. CORS 是什么?

CROS(Cross-Origin Resource Sharing),跨域资源共享。CORS 是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持 get 和 post 等请求。跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。

2)CORS 怎么工作的?

CORS是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应以后就会响应放行。