js原生ajax以及原生fetch

第一部分

ajax

全称asynchronous JavaScript and xml 异步JavaScript和xml 是js技术和xml技术的组合,并不是新生的东西

AJAX 是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

ajax的核心是XMLHttpRequest对象,目前所有浏览器都支持XMLHttpRequest

XMLHttpRequest 对象

  • readyState属性介绍
  1. readyState当一个XMLHttpRequest创建开始,这个属性就从0开始了
  2. 0表示Uninitialized状态,XMLHttpRequest实例已创建或者实例被abort方法重置
  3. 1表示已经调用了实例的open方法但是send方法未调用,请求还未发送
  4. 2表示已调用send方法,请求已经发送到服务端,但是未收到回应
  5. 3表示Receiving状态,表示已经接收到了所有响应头,但是响应体开始接收但未接收完成
  6. 4表示HTTP响应已完全接收
  7. readyState属性值不会递减,触发在请求过程中实例调用了abort方法或者open方法
  8. readyState每次递增都会触发onreadystatechange事件
  • responseText属性
  1. responseText保存了当前实例接收到的HTTP响应主体(body),不包括响应头
  2. readyState小于3时未接收到任何响应体,此属性为空字符串
  3. readyState等于3时收到,收到部分响应体。等于4时收到了所有响应体
  • responseXML属性
  1. 将响应体解析为xml并作为Document对象返回
  • status属性
  1. 由服务器返回的状态码
  2. 状态码200表示成功"OK"
  3. 状态码404表示"NOT FOUND"
  4. 其他常见状态码301、302、303、401、403、500、503等
  5. 如果在readyState小于3时读取此属性会报错
  • statusText属性
  1. 由服务器返回的status属性的字符串状态
  2. 如果status为200就是OK、404即为NOT FOUND
  • 实例事件onreadystatechange
  1. 在readyState改变时会触发此事件,在readyState等于3时可能会调用多次
  2. vm.onreadystatechange = function () {}
  • 实例方法abort
  1. 取消当前请求,关闭网络请求,并取消所有未决的网络活动
  2. 实际上就是把实例的readyState属性置为0
  3. vm.abort()
  • 实例方法getAllResponseHeaders
  1. 获取响应头,响应头以字符串返回
  2. 在readyState小于3调用此方法返回值为null
  3. vm.getAllResponseHeaders()
  • 实例方法getResponseHeader
  1. 获取指定的key的响应头内容,key的对比是不区分大小写的
  2. 在readyState小于3调用此方法返回值为''
  3. vm.getResponseHeader(key)
  • 实例方法open
  1. 初始化请求参数配置,并未发送请求
  2. vm.open(type,url,是否异步)
  • 实例方法send
  1. 发送请求,还可以传递POST请求参数体
  2. vm.send(body可选)
  • 实例方法setRequestHeader
  1. 向一个已打开但未发送的请求设置一个请求头key和value
  2. vm.setRequestHeader(key, value)

请求封装

// XMLHttpRequest对象
export const ajax = (url, data, type = 'GET') => {
  return new Promise((resolve, reject) => {
    let ajaxVM = new XMLHttpRequest()
    type = type.toUpperCase()
    if (type === 'GET') {
      url = url + getQueryStr(data)
    }
    ajaxVM.open(type, url, true)
    if (type === 'POST') {
      ajaxVM.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
      debugger
      ajaxVM.send(data)
    } else {
      ajaxVM.send()
    }
    ajaxVM.onreadystatechange = function () {
      if (ajaxVM.readyState === 4) {
        if (ajaxVM.status === 200) {
          resolve(JSON.parse(ajaxVM.responseText))
        } else {
          reject(new Error(ajaxVM.responseText))
        }
      }
    }
  })
}

// 获取get请求的参数拼接
const getQueryStr = (data) => {
  let queryStr = '?'
  let queryStrArr = []
  for (let key in data) {
    queryStrArr.push(`${key}=${data[key]}`)
  }
  return queryStr + queryStrArr.join('&')
}

// Fetch对象
export const myFetch = (url, data, type = 'GET') => {
  type = type.toUpperCase()
  if (type === 'GET') {
    url = url + getQueryStr(data)
    return fetch(url, {
      headers: {
        'content-type': 'application/json'
      },
      method: type
    }).then(response => response.json())
  }
  return fetch(url, {
    body: JSON.stringify(data),
    headers: {
      'content-type': 'application/json'
    },
    method: type
  }).then(response => response.json())
}

使用流程:

  1. 创建XMLHttpRequest对象实例 var ajax = new XMLHttpRequest()
  2. 使用open方法设置和浏览器交换信息ajax.open('post方式或者get方式',所请求的url地址,是否异步发送,默认为true)
  3. 发送数据与服务器进行交互ajax.send()
  4. 注册事件ajax.onreadystatechange = function(){}
  5. 更新页面,通过对服务器返回来的数据渲染到页面上,通过innerHTML等方法

详细代码:

get请求

//步骤一:创建异步对象
var ajax = new XMLHttpRequest();
//步骤二:设置请求的url参数,参数一是请求的类型,参数二是请求的url,可以带参数,动态的传递参数starName到服务端
ajax.open('get','getStar.php?starName='+name);
//步骤三:发送请求
ajax.send();
//步骤四:注册事件 onreadystatechange 状态改变就会调用
ajax.onreadystatechange = function () {
   if (ajax.readyState==4 &&ajax.status==200) {
    //步骤五 如果能够进到这个判断 说明 数据 完美的回来了,并且请求的页面是存在的
    console.log(ajax.responseText);//输入相应的内容
    }
}

post请求

//创建异步对象  
var xhr = new XMLHttpRequest();
//设置请求的类型及url
//post请求一定要添加请求头才行不然会报错
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
 xhr.open('post', '02.post.php' );
//发送请求
xhr.send('name=fox&age=18');
xhr.onreadystatechange = function () {
    // 这步为判断服务器是否正确响应
  if (xhr.readyState == 4 && xhr.status == 200) {
    console.log(xhr.responseText);
  } 
};

封装成通用方法

function ajax_method(url,data,method,success) {
    // 异步对象
    var ajax = new XMLHttpRequest();

    // get 跟post  需要分别写不同的代码
    if (method=='get') {
        // get请求
        if (data) {
            // 如果有值
            url+='?';
            url+=data;
        }else{

        }
        // 设置 方法 以及 url
        ajax.open(method,url);

        // send即可
        ajax.send();
    }else{
        // post请求
        // post请求 url 是不需要改变
        ajax.open(method,url);

        // 需要设置请求头报文,服务器端收到请求后先看请求头,看你发过来的数据是什么类型
        // application/x-www-form-urlencoded表示对发过来的数据进行url转码,参数被拼接到了请求URL上
        ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");

        // 判断data send发送数据
        if (data) {
            // 如果有值 从send发送
            ajax.send(data);
        }else{
            // 木有值 直接发送即可
            ajax.send();
        }
    }

    // 注册事件
    ajax.onreadystatechange = function () {
        // 在事件中 获取数据 并修改界面显示
        if (ajax.readyState==4&&ajax.status==200) {
            // console.log(ajax.responseText);

            // 将 数据 让 外面可以使用
            // return ajax.responseText;

            // 当 onreadystatechange 调用时 说明 数据回来了
            // ajax.responseText;

            // 如果说 外面可以传入一个 function 作为参数 success
            success(ajax.responseText);
        }
    }

}

原生ajax对象XMLHttpRequest对象实例中各方法及参数解释

post和get区别:

  1. get常用于客户端向服务器发送请求查询某些信息,请求发送的参数也就是发送给服务器的数据可以拼接到url上,发送的数据大小不能超过2kb例如
    xhr.open( "get", "example.php?name1=value1&name2=value2",true );
  2. post请求常用语客户端向服务器端发送要被保存的数据,还有服务器端向客户端推送的数据也常用post发送,post请求的参数不能拼接到url上,而是作为http请求的消息实体发送给服务器,发送的数据大小理论上是没有限制的,发送数据的大小跟http协议无关,只是根据浏览器的不同导致的数据大小不一,POST请求必须设置Content-Type值为application/x-form-www-urlencoded;如果不设置Content-Type 头部信息,那么发送给服务器的的数据就不会出现在$_POST(PHP语言中的接收从客户端发送过来的变量)超全局变量中。 
  3. get安全性非常低,post安全性较高。使用Get请求时,参数在URL中显示,而使用Post请求,则不会显示出来。GET方式请求的数据会被浏览器缓存起来,因此其他人就可以从浏览器的历史记录中读取到这些数据,例如账号和密码等

第二部分

fetch

fetch是一个浏览器window上一个用于跟后台交互的请求的全局api

fetch是ajax和promise的组合,是一个目前来说较新的api,各个老版本的浏览器基本不支持fetch compatiable

fetch的使用

  • 直接全局调用fetch()方法,第一个参数是请求的url,第二个参数是对象,用于定义请求的各个参数
  • fetch整合了Request、Response、Headers对象
  • fetch的get请求
    fetch('http://localhost:3000/test').then(res => {
      res.json().then(data => {
        console.log(data)
      })
    }).catch(err => {
      console.log(err)
    })
    
    // json方法是对返回的二进制流进行解析成json字符,转换二进制流也是一个异步过程
    // json方法返回的也是一个promise

     

  • fetch的post请求
    fetch('http://localhost:3000/test-post', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        username: 'zhangsan',
        password: '123'
      })
    }).then(res => {
      res.json().then(data => {
        console.log(data)
      })
    }).catch(err => {
      console.log(err)
    })

     

第三部分

http协议补充

HTTP协议简称超文本传输协议,用于万维网中浏览器和服务器的传输协议

HTTP协议是应用层协议,他由一系列协议组合工作,包括网络层的ip协议以及传输层的tcp协议

HTTP协议可以用来传输文本、二进制文件等

  • HTTP协议特点
  1. HTTP协议工作于C/S架构
  2. 浏览器作为HTTP的客户端向服务端也就是WEB服务器发送请求,WEB服务器进行响应
  3. 常见WEB服务器:Apache   IIS   Nginx
  4. 默认端口80
  • HTTP协议三特征
  1. 无状态,HTTP协议是无状态协议,如果想要之前的请求状态就必须重传,不能保存之前的状态
  2. 无连接,一次只能处理一个请求,处理完即断开
  3. 媒体独立,意味着HTTP协议可以传输任何一种文件类型,由content-type指定
  • content-type字段
  1. 存在于请求头和响应头中
  2. 存在于响应头中主要是告诉客户端响应的内容类型,比如一般后端返回的是JSON,content-type就是application/json
  3. 存在于请求头中主要是告诉服务器本次请求发送的内容类型
  4. 常见请求头类型x-www-form-urlencoded,发送给服务端的标准JSON会以key-value的形式编码发送
  5. 常见请求头类型multipart/form-data,一般用于文件上传
  6. 常见请求头类型application/json,支持比JSON更复杂的数据格式,发送的数据不会被处理而是直接放入消息实体中,目前大多流行此种交互类型
  • HTTP请求消息结构
  • HTTP响应消息结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值