AJAX

183 阅读4分钟

文中内容来自 B 站教学视频【尚硅谷】3小时Ajax入门到精通

  • AJAX 就是异步的 JS 和 XML
  • AJAX 是一种局部刷新的新方法,不是一种语言
  • AJAX 包含的技术主要有 javascript, dom, css, xml 等,核心是 javascript 和 xml
  • javascript 负责创建异步对象,发送请求,更新页面的 dom 对象
  • ajax 请求需要服务器端的数据
  • xml 是网络中传输的数据格式,现在使用 json 替换了 xml
  • 通过 AJAX 可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据
  • XML 被设计用来传输和存储数据
  • 最初服务器端与客户端通过 AJAX 传输数据的时候用的就是 XML,现在已经被 JSON 代替了
  • AJAX 缺点:
    • 没有浏览历史,不能回退
    • 存在跨域问题
    • SEO 不友好(搜索引擎优化)
  • HTTP 协议叫【超文本传输协议】,协议详细规定了浏览器和万维网服务器之间互相通信的规则
  • HTTP 请求报文格式:行,头,空行,体
POST /mbs/web/insuInfo/receiver/refuseInsuInfo HTTP/1.1
Host: mbs.nmtst.hsip.gov.cn:30000
Connection: keep-alive
Content-Length: 229
Accept: application/json, text/plain, */*
X-XSRF-TOKEN: 47a737a2-93ba-49b9-a5dd-597bd6a0fd80
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36
menuId: mbs-jbylbxzr
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Cookie: XSRF-TOKEN=47a737a2-93ba-49b9-a5dd-597bd6a0fd80; SESSION=YjQ2NDdiNWMtYWQ5OC00Zjk0LThhZDMtOTQzNjQ3OThjYTZi

username=admin&password=admin
  • HTTP 响应报文格式:行,头,空行,体
HTTP/1.1 200 OK
Date: Thu, 02 Dec 2021 09:06:14 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Pinpoint-MonitorG: hsa
Pinpoint-ProjectID: eb60828076964237bdd040620f6e9d82
Pinpoint-TxType: POST_/mbs/web/insuInfo/receiver/refuseInsuInfo
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Pinpoint-SrcResId: hsa-mbs-local-service:8080|33bf5399ae7abd8894c949b30acf6059
Pinpoint-Forced-CallChain: true
Server: elb

<html>
    <head></head>
</html>
  • 浏览器控制台 Network 页签中,XHR 是 XMLHttpRequest 的缩写,是对 AJAX 请求做的筛选
  • 请求头
Content-Type 设置请求体内容的类型
  • 利用浏览器内置的 XMLHttpRequest 对象实现 AJAX 写法
// 获取 button 元素
        const btn = document.getElementsByTagName('button')[0];
        const result = document.getElementById("result");
        // 绑定事件
        btn.onclick = function(){
            // 1. 创建对象
            const xhr = new XMLHttpRequest();
            // 2. 初始化 设置请求方法和 url
            xhr.open('GET', 'http://localhost:3333/mock/22/server?a=100&b=200&c=300');
            // 3. 发送
            xhr.send();
            // 4. 事件绑定 处理服务端返回的结果
            // on when 当……的时候
            // readystate 是 xhr 对象中的属性,表示状态 0,1,2,3,4
            //            0 未初始化;1 表示 open 方法调用完毕;
            //            2 send 方法调用完毕;3 服务端返回部分结果;
            //            4 服务端返回了所有结果
            // change 改变
            xhr.onreadystatechange = function(){
                // 判断(服务端返回了所有的结果)
                if(xhr.readyState === 4){
                    // 判断响应状态码 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); // 响应体

                        // 设置 result 的文本
                        result.innerHTML = xhr.response;
                     }
                }
            }
        }
  • axios 是目前前端最热门的 AJAX 工具库,而且是 Vue 和 React 推荐的 AJAX 工具包
  • Promise 是 ES6 推出的异步变成的新的解决方案
  • BootCDN 网站中可以查到各种 CDN 的资源
  • crossorigin="anonymous" 语句可以去掉发送请求时所携带的 cookies 信息,防止控制台出提示
  • post 请求,url 参数和请求体可以同时设置
  • 同源策略:是浏览器的一种安全策略
  • 同源:协议域名端口号 必须完全相同
  • AJAX 是默认遵循同源策略的
  • 违背同源策略就是跨域
  • JSONP(JSON with Padding),是一个非官方的跨域解决方案。只支持 get 请求
  • 在网页有一些标签天生就具有跨域能力,比如:img, link, iframe, script。JSONP 就是利用 script 标签的跨域能力来发送请求的 image.png
  • 使用 JSONP,服务端返回的得是一段 js 代码才可以
  • CORS 是跨域的另一种解决方案
  • CORS(Cross-Origin Resource Sharing),跨域资源共享
  • CORS 是官方的跨域解决方案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持 get 和 post 请求。跨域资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源
  • CORS 需要服务端返回响应报文时,要设置 header response.setHeader("Access-Control-Allow-Origin", "*")