HTTP 和 Ajax

90 阅读9分钟

初始前后端通信

  • 前后端通信是什么

    • 前端和后端数据交互的过程
    • 浏览器和服务器之间的数据交互的过程
  • 后端向前端发送数据

    • 访问页面
  • 前端向后端发送数据

    • 用户注册

前后端通信的过程与概念解释

  • 前后端通信的国策会给你

    • 前后端的通信是在‘请求’,‘响应’中完成的
  • 概念解释

    • 前端:浏览器端
    • 客户端:只要能和服务器通信的就叫客户端
    • 后端:服务器端

前后端的通信方式

  • 使用浏览器访问页面

    • 在浏览器地址栏中输入网址,按下回车
  • HTML标签

    • 浏览器在解析HTML标签的时候,遇到一些特殊的标签,会再次向服务器发送请求

    • link、img、script、iframe

    • 还有一些标签,浏览器解析的时候,不会向服务器发送请求,但是用户就可以使用他们向服务器发送请求

    • Ajax和fetch

    • HyperText Transfer Protocol

    • 超文本传输协议

    • 超文本:原先一个个单一的文本,通过超链接将其连接起来,由原先的单一的文本变成了可无心啊延伸,扩展的超文本,立体文本

    • HTML,JS,CSS,图片,字体,音频,视频等等文件、都是在通过HTTP(超文本传输协议)在服务器和浏览器之间传输

    • 每一次前后端通信,前端需要主动向后端发送请求,后端接受到前端的请求后,可以给出响应

    • HTTP 是一个请求,响应协议

  • HTTP请求响应的过程

HTTP报文

  • HTTP 报文是什么

    • 浏览器向服务器发送请求时,请求本身就是信息,叫请求报文
    • 服务器向浏览器发送响应时传输的信息,叫响应报文
    • HTTP报文的格式
    • 请求头:起始行+首部
    • get请求,没有请求体,数据通过请求头携带
    • post请求,有请求体,数据通过请求头携带
    • 响应头:起始行+首部

HTTP方法

  • 常用的HTTP方法

    • 浏览器发送请求时采用的方法,和响应无关
    • GET、POST、PUT、DELETE
    • 用来定义对于资源采取什么样的操作,有各自的语义
  • HTTP方法的语义

    • GET获取数据、获取资源(文件)
    • POST创建数据、注册
    • PUT更新数据、修改个人信息,修改密码
    • DELETE删除数据、删除一条评论
    • 这些方法虽然有各自语义,但是并不是强制性的
  • RESTful接口设计、

    • 一种接口设计风格,充分利用HTTP方法的语义
    • 通过用户ID获取个人信息,使用GET方法
    • 注册新用户,使用POST方法
    • 修改一个用户,使用POST方法
    • 删除一个用户,使用POST方法

GET和POST方法的对比

  • 语义

    • GET 获取数据
    • POST 创建数据
  • 发送数据

    • GET通过地址在请求头中携带数据
    • 能携带的数据量和地址的长度有关系,一般最多就几k
    • POST既可以通过地址在请求头中携带数据,也可以通过请求体携带数据
    • 能携带的数据量理论上是无限的
    • 携带少量数据,可以使用GET请求,大量的数据可以使用POST请求
  • 缓存

    • GET可以被缓存,POST不会被缓存
  • 安全性

    • GET和POST都不安全
    • 发送密码或其他敏感信息时不要使用GET,主要是避免直接被他人窥屏或通过历史记录找到你的密码

HTTP状态码

  • HTTP状态是什么

    • 定义服务器对请求的处理结果,是服务器返回的
  • HTTP状态码的语义

    • 100-199消息:代表请求已被接受,需要继续处理

    • 200-299成功

    • 300-399重定向

    • 301 Moved Permanently

    • 302 Move Temporarily

    • 303 Not Modified

    • 400-499请求错误

    • 404Not Found

    • 500-599服务器错误

    • 500 Internal Server Error

初始Cookie

  • Cookie是什么

    • Cookie全称 HTTP COokie,简称Cookie
    • 是浏览器存储数据的一种方式
    • 因为存储在用户本地,而不是存储在服务器上,是本地存储、
    • 一般会自动随着浏览器每次请求发送到服务器端
  • Cookie有什么用

    • 利用Cookie跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个网页的停留时间等
  • 在浏览器中操作Cookie

    • 不要在Cookie中保存密码等敏感信息

Cookie的基本用法

  • 写入Cookie

    • document.cookie = "username=zs";
    • 不能一起设置,只能一个一个设置
  • 读取 Cookie

    • console.log(document.cookie);
  • 读取的是一个由名值对构成的字符串,每个名值对之间由';'(一个分号和一个空格)隔开

Cookie的属性

  • Cookie的名称(name)和值(value)

    • 最终要的两个属性,创建Cookie时必须填写,其他属性可以使用默认值
    • Cookie的名称或值如果包含非英文字母,则写入时需要写入encodeURLComponent()编码,读取时使用decodeURLComponent()解码
    • 一般名称使用英文字母,不要用中文,值可以用中文,但是要编码
  • 失效(到期)时间

    • 对于失效的Cooki,会被浏览器清除
    • 如果没有设置失效(到期 )时间,这样的Cookie,称为会话Cookie
    • 它存在内存当中,党徽还结束,也就是浏览器关闭是,Cookie消失
    • 想长时间存在,设置Expires或Max-Age
    • Expires 值为Date类型
    • document.cookie = `username=zxc;expires=${new Date(2023 - 3 - 21)}`;
    • Max - Age 值为数组,表示当前时间+多少秒后过期,单位是秒
    • 如果max-age的值是0或负数,则Cookie会被删除
    • document.cookie = "username=zxasdc;max-age=5";
  • Domain 域

    • Domain 限定了访问Cookie的范围
    • 使用JS只能读写当前域和父域的Cookie,无法读写其他域的Cookie
  • Path路径

    • Path限定了访问Cookie的范围,(同一个域名下)
    • 使用JS只能读写当前路径和上级路径的Cookie,无法读写下级路径的Cookie
    • 当name,domain,Path这3个属性都相同的时候,才是同一个Cookie
  • HttpOnly

    • 设置了HttpOnly属性的Cookie不能通过js去访问
  • Secure安全标志

    • Secure限定了只能在使用https而不是http的情况下才可以发送给服务端-
  • Domain,path.Secure都要满足条件,还不能过期的Cookie才能随着请求发送到服务器端

Cookie的封装

// 写入Cookie
let set = (name, value, { maxAge, domain, path, secure } = {}) => {
  let cookieText = `${encodeURIComponent(name)}=${decodeURIComponent(value)}`;
  if (typeof maxAge === "number") {
    cookieText += `;max-age=${maxAge}`;
  }
  if (domain) {
    cookieText += `;domain=${domain}`;
  }
  if (path) {
    cookieText += `;path=${path}`;
  }
  if (secure) {
    cookieText += `;secure`;
  }
  document.cookie = cookieText;
};
// 通过name获取Cookie的值
let get = (name) => {
  name = encodeURIComponent(name);
  let cookies = document.cookie.split(";");
  for (let item of cookies) {
    let [cookieName, cookieValue] = item.split("=");
    if (cookieName === name) {
      return decodeURIComponent(cookieValue);
    }
  }
  return;
};

//   根据name,domain和path删除Cookie
let remove = (name, { domain, path } = {}) => {
  set(name, "", { domain, path, maxAge: -1 });
};
export { set, get, remove };

复制代码

Cookie的注意事项

  • 前后端都可以创建Cookie

  • Cookie有数量限制

    • 每个域名下的Cookie数量有限
    • 当超过单个域名限制之后,在设置Cookie,浏览器就会清除一起拿设置的Cookie
  • Cookie有大小限制

    • 每个Cookie的存储容量很小,最多只有4KB左右

初始localStorage

  • loaclStroage是什么

    • localStorage 也是一种浏览器存储数据的方式(本地存储),他只是存储子啊本地,不会发送到服务器端
    • 单个域名下的localStorage总大小有限制
  • 在浏览器中操作localStorage

  • localStorage的基本用法

    • setIte,m 设置

      • localStorage.setItem("username", "zxc");
    • getItem, 获取 ,获取不存在的值返回null

      • console.log(localStorage.getItem("username"));
    • removeItem, 删除, 删除不存在的可以,不报错

      • console.log(localStorage.removeItem("username"));
    • clear(), 清除全部

      • localStorage.clear();

使用localStorage实现自动填充

   <form id="login" action="https://www.baidu.com/" method="post">
      <input type="text" name="username" />
      <input type="password" name="password" />
      <input type="submit" id="btn" value="登录" />
    </form>
复制代码
let login = document.querySelector("#login");
      let btn = document.getElementById("btn");

      let username = localStorage.getItem("username");
      if (username) {
        login.username.value = username;
      }
      login.addEventListener("click", (e) => {
        //   阻止默认事件
        e.preventDefault();
        localStorage.setItem("username", login.username.value);
        // login.submit();
      });
复制代码

localStorage的注意事项

  • localStorage的存储期限

    • localStorage 是持久化的本地存储,除非手动清除(比如通过js删除,或者清除浏览器缓存)否则数据是永远不会过期的
  • sessionStorage

    • 当会话结束(比如关闭浏览器)的时候,sessionStorage中的数据会被清空
  • localStorage 键和值的类型

    • localStorage存储的键和值只能是字符串类型
    • 不是字符串,也会先转化为字符串再存进去
  • 不同域名下能否公用localStorage

    • 不同域名不能共用localStorage
  • localStorage 的兼容性

    • IE7及以下版本不支持localStorage,IE8开始支持

初识Ajax

  • Ajax是什么

    • Ajax是Asynchronous JavaScript and XML(异步 JavaScrip 和XML)的简写
    • Ajax 中的异步:可以异步地想服务器发送请求,在等待响应的过程中,不会阻塞当前页面,浏览器可以做自己的事情,直到成功获取响应后,浏览器次啊开始处理响应数据
    • XML (可扩展标记语言)是前后端数据通信时传输数据的一种格式
    • XML 现在已经不怎么用了,现在比较常用的是JSON
    • Ajax其实就是浏览器与服务器之间的一种异步通信方式
    • 使用Ajax可以在不重新加载整个页面的情况下,对页面的某部分进行更新
    • ①注册检测
    • ②搜索提示
  • 搭建Ajax开发环境

    • Ajax需要服务器环境,非服务器环境下,很多浏览器无法正常使用Ajax
    • live Server 插件

Ajax的基本用法

  • XMLHttResquest

    • Ajax想要实现浏览器与服务器之间的异步通信,余姚依靠XMLhttpRequest,他是一个构造函数
    • 不论是XMLHttpRequest,还是Ajax,都没有和具体的某种数据格式绑定
  • Ajax的使用步骤

    • 创建xhr对象

      • let xhr = new XMLHttpRequest();
    • 监听事件,处理响应

      • 当获取到响应后,会触发xhr对象的readystatechange事件,可以在该事件中对相应进行处理
      if (xhr.readyState !== 4) return;
      
      //   HTTP CODE状态码
      //   获取到响应后,响应的内容会自动填充xhr对象的属性
      //   xhr.status:HTTP 状态码 200 404
      //   xhr.statusText:HTTP 状态说明 OK Not Found
      if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
       //   console.log("正常使用响应数据");
       //   响应数据放到xhr.responseText
       console.log(xhr.responseText);
      } else {
       //   console.log("错误处理");
      }
      };```
      
      复制代码
      
    • 准备发送请求

      • xhr.open("HTTP方法 GET,POST,PUT,DELETE", "地址", true);
      • 调用open并不会真正发送请求,而只是做好发送请求前的准备工作
    • 发送请求

      • 调用send()正式发送请求
      • send()的参数是通过请求体携带数据
      • xhr.send(null);
    • readystatechange事件也可以配合addEventListener使用,不过要注意,IE6-8不支持addEventListener

    • 为了兼容性,readystatechange中不使用this,而直接使用xhr

    • 由于兼容性的原因,最好放在open之前

    • readystatechange事件监听readyState这个状态的变化

  • 他的值从0-4,一共5个状态

    • 0:未初始化,尚未调用open()
    • 1:启动。已经调用open(),但尚未调用send()
    • 2:发送。已经调用send(),但尚未接收到响应
    • 3.接收。已经接收到部分响应数据
    • 4.完成。已经接收到全部响应数据,而且已经可以在浏览器中使用了

使用Ajax完成前后端通信通信

  • 使用Ajax完成前后端通信
      let url = "https://www.imooc.com/api/http/search/suggest?words=js";
      let xhr = new XMLHttpRequest();
      xhr.onreadystatechange = () => {
        if (xhr.readyState !== 4) return;

        if ((xhr.status >= 200 && xhr.status < 300) || xhr === 304) {
          console.log(xhr.responseText);
          console.log(typeof xhr.responseText);
        }
      };
      xhr.open("GET", url, true);
      xhr.send();
复制代码

GET请求

  • 携带数据

    • GET请求不能通过请求体携带数据,但可以通过请求头携带
  • 数据编码

    • 如果携带的数据是非英文字母的话,比如说汉字,就需要编码只收在发送给后端,不然会早成乱码问题
    • 可以使用encideURLComponent()编码
    let url = `https://www.imooc.com/api/http/search/suggest?name=${encodeURIComponent(
        "前端"
      )}}`;
      let xhr = new XMLHttpRequest();
      xhr.onreadystatechange = () => {
        if (xhr.readyState !== 4) return;
        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
          console.log(xhr.statusText);
        }
      };
    
      xhr.open("GET", url);
      xhr.send(null);
      //   不会报错,并不会发送数据
      //   xhr.send("username");
    复制代码
    

POST请求

  • 携带数据

    • POST请求主要通过请求体携带数据,同时也可以通过请求头携带
let url = "https://www.imooc.com/api/http/search/suggest?words=js";

      let xhr = new XMLHttpRequest();
      xhr.onreadystatechange = () => {
        if (xhr.readyState !== 4) return;
        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
          console.log(xhr.responseText);
        }
      };
      xhr.open("POST", url, true);
复制代码
  • 如果想发送数据,直接写在send()的参数位置,一般是字符串

  • xhr.send("username");

  • 不能直接传递对象,需要先将对象转换成字符穿的形式

  • xhr.send("username");

  • 数据编码

    • xhr.send(`username=${encodeURIComponent("张三")}`);

初始JSON

  • JSON是什么

    • Ajax发送和接收数据的一种格式
    • JSON全称是JavaScrip Object Notation
  • 为什么需要JSON

    • JSON有3钟格式,每种形式的写法都和JS中的数据类型很像,可以很轻松的和JS中的数据类型互相转换

JSON的3种形式

  • 简单之形式

    • JSON的简单值形式就对应着JS中的基本数据类型

    • 数字,字符串,布尔值,null

    • 注意事项

      • ①JSON职工没有undefined值
      • ②JSON中的字符串必须使用双引号
      • ③JSON中是不能注释的
  • 对象形式

    • JSON的对象形式就对应着JS中的对象
    • 注意事项JSON中的属性名必须用双引号,属性值如果是字符串也不行用双引号
    • JSON中只要涉及到字符串,就必须使用双引号
  • 数组形式

    • JSON的数组形式就对应着JS职工的数组

JSON的常用方法

  • JSON.parse()

    • JSON.parse()可以将JSON格式的字符串解析成JS中的对应值
    • 一定是合法的JSON字符串,否则会报错
  • JSON.stringify()

    • JSON.stringify()可以将JS的基本数据类型,对象或数组转换成JSON格式的字符串
  • 使用JSON.parse()和JSON.stringify()封装localStorage

//   设置
let set = (key, value) => {
  localStorage.setItem(key, JSON.stringify(value));
};

//   获取
let get = (key) => {
  return JSON.parse(localStorage.getItem(key));
};
//   删除
let remove = (key) => {
  localStorage.removeItem(key);
};
//   清空
let clear = () => {
  localStorage.clear();
};

export { set, get, remove, clear };

初始跨域

  • 跨域是什么

    • 同域,不是跨域
    • 不同于,跨域,会被浏览器阻止
    • 像一个域发送请求,如果请求的域和当前域是不同域,就叫跨域 不同域之间的请求,就是跨域请求
  • 什么是不同域,什么是同域

    • http (协议) ://www.imooc.com (域名) :443 (端口号) /course/list (路径)
    • 协议,域名,端口号,任何一个不一样,就是不同域
    • 与路径无关,路径一不一样无所谓
  • 跨域请求为什么被阻止

    • 阻止跨域请求,其实是浏览器本身的一种安全策略--同源策略
    • 其他客户端或者服务器都不存在跨域被阻止的问题
  • 跨域解决方案

    • ①CORS跨域资源共享
    • ②JSONP script
  • 有限使用CORS跨域资源共享,如果浏览器不支持CORS的话,在使用JSONP

CORS跨域资源共享

  • CORS是什么

    • Access-Control-Allow-Origin:*
    • 表明允许所有的域名来跨域请求他,*是通配符,没有任何限制
    • 只允许指定域名的跨域请求
    • Access-Control-Allow:http://127.0.0.1:5500
  • 使用CORS跨域的过程

    • ①浏览器发送跨域请求
    • ②后端在响应头中添加Access-Control-Allow头信息
    • ③浏览器接受到响应
    • ④如果是同域下的请求,浏览器不会额外做什么,这次前后端通信就圆满完成了
    • ⑤如果是跨域请求,浏览器会从响应头中查找是否允许跨域
    • ⑥如果润鑫跨域,通信圆满完成
    • ⑦如果没找到或不包含想要跨域的域名,就丢弃响应结果
  • CORS的兼容性

    • IE10及以撒花姑娘版本的浏览器可以正常使用CORS

JSONP

  • JSONP的原理

    • script标签跨域不会被阻止
    • JSONP主要就是利用script标签,加载跨域文件
  • 使用JSONP实现跨域

    • 服务器端春被好JSONP接口
      let script = document.createElement("script");
      script.src =
        "https://www.imooc.com/api/http/jsonp?callback=handleResponse";
      document.body.appendChild(script);

      // 声明函数
      let handleResponse = (data) => {
        console.log(data);
      };