使用原生 JS 和 jQuery 封装网络请求比较

发布于 2021-12-03 22:00:49 字数 3015 浏览 1349 评论 0

JS 实现

基于普通的 JS 进行封装

export default {
  host: '',
  postJson(url, data, callback) {
    return this.ajax(url, {method: "POST", data}, callback);
  },
  get(url, callback) {
    return this.ajax(url, {method: "GET"}, callback)  
  },
  ajax(url, param, callback) {
    url = this.host + url;
    var xhr = createXHR();
    xhr.onreadystatechange = function() {
      if (xhr.readyState==4)  {
        let resp = JSON.parse(xhr.responseText);
        if(xhr.status==200) {
          if(resp.code == 1) {
            callback(resp);
          } else {
            tip((resp.body && resp.body.msg) || "未知错误")
          }
        } else  {
           // 401 404 500 503 others
          tip("未知错误");
        }
      }
    };
    xhr.open(param.method, url, true);

    if(param.method === 'POST') {
      xhr.setRequestHeader("Content-Type", "application/json");
    }
    xhr.send(JSON.stringify(param.data) || null);
  }
}

response 的一个成功示例

status: 200,
statusText: "OK",
response: "{"code":1,"body":[]}",
responseText: "{"code":1,"body":[]}"

response 的两个失败示例

status: 404,
statusText: "Not Found",
response: "<!DOCTYPE html>",
responseText: "<!DOCTYPE html>",
status: 404,
statusText: "error",
responseText: "{"timestamp":1556440601945,"status":404,"error":"Not Found","message":"No message available","path":"/api/v1/app/login/detail2"}",
responseJson: {"timestamp":1556440601945,"status":404,"error":"Not Found","message":"No message available","path":"/api/v1/app/login/detail2"}

判定成功失败使用主要使用 status,具体的数据来自于 response/responseText/responseJSON/responseHTML。

jQuery 实现


ajax(method, url, data) {
    let token = Utils.getCookie('token');
    let param = { 
      url, 
      type: method, 
      headers: { token }
    };
    if((method == 'post' || method == 'put') && data) {
      param.contentType = 'application/json';
      param.data = JSON.stringify(data);
    } 
    return $.ajax(param).always(function(data, msg, resp){
      if(resp.status == 200) {
        if(data.status == 10101) {
          Tip.message(data.message || '未授权用户,即将跳转到登陆界面');
          setTimeout(() => { window.location.href = '/login.html'; }, 2000);
        } else if(data.status == 404) {
          Tip.message(data.message || '请求找不到');
        } else if(data.status == 500 || data.status == 503) {
          Tip.message(data.message || '服务器错误');
        }
      } 
      else {
        Tip.message(resp.statusText || '系统异常');
      }
    });
  }

在 jQuery 中,类似于 alawys/fail/success 的方法为我们提供了一些快捷入口,即:

  • success 只有 status==200 才会进入
  • fail 只有 status != 200 才会进入
  • always 则无论如何都会进入

在 always 和 success 中(或 then 的第一个函数),通过 data 拿到的其实是用 responseText 转过的对象结构,在 fail 中的 resp 则是原始的 httpResponse 的对象,相当于 jQuery 提供了一些封装,可以更直观地拿到所需要的数据对象或原始对对象。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

够钟

暂无简介

0 文章
0 评论
510 人气
更多

推荐作者

qq_Yqvrrd

文章 0 评论 0

2503248646

文章 0 评论 0

浮生未歇

文章 0 评论 0

养猫人

文章 0 评论 0

第七度阳光i

文章 0 评论 0

新雨望断虹

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文