Ajax学习

2021-09-26

AJAX学习

一、HTTP

HTTP(hypertext transport protocol)协议『超文本传输协议』,协议详细规定了浏览器和万维网服务器之间互相通信的规则。 约定, 规则

1. 请求报文

重点是格式与参数

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

2. 响应报文

行      HTTP/1.1  200  OK
头      Content-Type: text/html;charset=utf-8
        Content-length: 2048
        Content-encoding: gzip
空行    
体      <html>
            <head>
            </head>
            <body>
                <h1>尚硅谷</h1>
            </body>
        </html>
404

403

401

500

200

二、express的使用

在nodejs已安装的情况下,进入创建的空文件夹中,

具体官网指南:https://www.expressjs.com.cn/starter/installing.html

npm init //通过 npm init 命令为你的应用创建一个 package.json 文件
npm install express //安装依赖

三、原生AJAX

1. get

//1. 创建对象
const xhr = new XMLHttpRequest();
//设置响应体数据的类型
xhr.responseType = 'json';
//2. 初始化 设置请求方法和 url
xhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200&c=300');
//3. 发送
xhr.send();
//4. 事件绑定 处理服务端返回的结果
// on  when 当....时候
// readystate 是 xhr 对象中的属性, 表示状态 0 1 2 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;
    }else{
​
    }
  }
}

 

2. post

//1. 创建对象
const xhr = new XMLHttpRequest();
//2. 初始化 设置类型与 URL
xhr.open('POST', 'http://127.0.0.1:8000/server');
//设置响应体数据的类型
xhr.responseType = 'json';
//设置请求头
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
// xhr.setRequestHeader('name','atguigu');
//3. 发送
​
xhr.send('a=100&b=200&c=300');
// xhr.send('a:100&b:200&c:300');
// xhr.send('1233211234567');
//4. 事件绑定
xhr.onreadystatechange = function(){
  //判断
  if(xhr.readyState === 4){
    if(xhr.status >= 200 && xhr.status < 300){
      //处理服务端返回的结果
      result.innerHTML = xhr.response;
    }
  }
}

3. 请求中的其他问题

  1. 缓存问题

    通过在请求后面加上当前时间例如http://127.0.0.1:8000/server?t=Date.now() 通过获取当前时间不掉用缓存里的数据。

  2. 超时与网络异常;取消请求

    //超时设置 ms单位
    xhr.timeout = 2000;
    //超时回调
    xhr.ontimeout = function(){
      alert("网络异常, 请稍后重试!!");
    }
    //网络异常回调
    xhr.onerror = function(){
      alert("你的网络似乎出了一些问题!");
    }
    // 取消请求
    xhr.abort();
  3. 重复发送问题

    let isSending = false; // 是否正在发送AJAX请求
    btns[0].onclick = function(){
      //判断标识变量
      if(isSending) x.abort();// 如果正在发送, 则取消该请求, 创建一个新的请求
      x = new XMLHttpRequest();
      //修改 标识变量的值
      isSending = true;
      x.open("GET",'http://127.0.0.1:8000/delay');
      x.send();
      x.onreadystatechange = function(){
        if(x.readyState === 4){
          //修改标识变量
          isSending = false;
        }
      }
    }
    ​
    // abort
    btns[1].onclick = function(){
      x.abort();
    }

四JQuery

1. 通用方法

$.ajax({
  //url
  url: 'http://127.0.0.1:8000/jquery-server',
  //参数
  data: {a:100, b:200},
  //请求类型
  type: 'GET',
  //响应体结果
  dataType: 'json',
  //成功的回调
  success: function(data){
    console.log(data);
  },
  //超时时间
  timeout: 2000,
  //失败的回调
  error: function(){
    console.log('出错啦!!');
  },
  //头信息
  headers: {
    c:300,
    d:400
  }
});

2. get

$.get('http://127.0.0.1:8000/jquery-server', {a:100, b:200}, function(data){
  console.log(data);
},'json');

3. post

$.post('http://127.0.0.1:8000/jquery-server', {a:100, b:200}, function(data){
  console.log(data);
});

五axios

1. 通用方法

axios({
  //请求方法
  method : 'POST',
  //url
  url: '/axios-server',
  //url参数
  params: {
    vip:10,
    level:30
  },
  //头信息
  headers: {
    a:100,
    b:200
  },
  //请求体参数
  data: {
    username: 'admin',
    password: 'admin'
  }
}).then(response=>{
  //响应状态码
  console.log(response.status);
  //响应状态字符串
  console.log(response.statusText);
  //响应头信息
  console.log(response.headers);
  //响应体
  console.log(response.data);
})

2. get

//GET 请求
axios.get('/axios-server', {
  //url 参数
  params: {
    id: 100,
    vip: 7
  },
  //请求头信息
  headers: {
    name: 'atguigu',
    age: 20
  }
}).then(value => {
  console.log(value);
});

3. post

axios.post('/axios-server', {
  username: 'admin',
  password: 'admin'
}, {
  //url 
  params: {
    id: 200,
    vip: 9
  },
  //请求头参数
  headers: {
    height: 180,
    weight: 180,
  }
});

六、fetch

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

七、跨域

1. 同源策略

  • 同源策略:即在协议、域名、端口号完全相同的情况下,是一种浏览器的安全策略。

const x = new XMLHttpRequest();
//这里因为是满足同源策略的, 所以 url 可以简写
x.open("GET",'/data');
//发送
x.send();
//
x.onreadystatechange = function(){
  if(x.readyState === 4){
    if(x.status >= 200 && x.status < 300){
      console.log(x.response);
    }
  }
}

2. jsonp实现跨域

  • jsonp:是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题,实现方式是借助于script实现的,因为一些标签本身具有跨域的功能,比如:img、link、iframe、script。

实际案例进行实现

  • 原生方式

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);
// 可以实现到跨域请求实现

 

  • 通过JQuery实现

$.getJSON('http://127.0.0.1:8000/jquery-jsonp-server?callback=?', function(data){
    $('#result').html(`名称: ${data.name}<br>校区: ${data.city}`)
  });  

 

3. CORS

  • cors:跨域资源共享。CORS是官方的跨域解决方案,ajax正常请求不变,完全由后端解决跨域问题。

  • 后端通过设置响应头实现跨域: response.setHeader("Access-Control-Allow-Origin", "*");

const btn = document.querySelector('button');
btn.onclick = function(){
  //1. 创建对象
  const x = new XMLHttpRequest();
  //2. 初始化设置
  x.open("GET", "http://127.0.0.1:8000/cors-server");
  //3. 发送
  x.send();
  //4. 绑定事件
  x.onreadystatechange = function(){
    if(x.readyState === 4){
      if(x.status >= 200 && x.status < 300){
        //输出响应体
        console.log(x.response);
      }
    }
  }
}