IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> fetch API 简单封装 -> 正文阅读

[JavaScript知识库]fetch API 简单封装

简单封装一下fetch

fetch发起请求的方式

fetch("./01-data.json")
  // 这里的 res拿到的结果是一个流 需要转为 我们需要的格式 json,text,formData等
  // 这几个转换格式的方法 返回值都是 promise实例
  .then(res => res.json())
  .then(res => {
    console.log(res)
  })

是否是普通对象 方法

/**
 * 是否是普通对象 (Object的直接实例)
 * @param {*} obj 
 * @returns 
 */
const isPlainObject = (obj) => {
  let proto, Ctor;
  if (!obj ||
    Object.prototype.toString.call(obj) !== "[object Object]")
    return false;
  proto = Object.getPrototypeOf(obj);
  if (!proto) return true;
  Ctor = proto.hasOwnProperty("constructor") && proto.constructor;
  return typeof Ctor === "function" && Ctor === Object;
}

初始化请求配置参数

// baseURL
let baseURL = "";
// 初始化默认配置
let initialConfig = {
  method: "GET",
  params: null,// get系列请求使用
  body: null,// post系列请求使用 get系列请求不可传body,报错
  headers: {
    "content-type": "application/json"
  }, // 请求头信息
  catch: "no-cache",// 请求不缓存
  credentials: "include", // 跨域携带信息 cookie等
  responseType: "json", // 响应的数据格式
};

根据环境变量设置baseurl

// 根据环境变量 设置 baseURL
// let process;
let env = process?.env?.NODE_ENV || "development";
switch (env) {
  case "development":
    baseURL = "http://localhost:5500";
    break;
  case "production":
    baseURL = "http://localhost:5500"
    break;
  default:
    baseURL = "http://localhost:5500";
    break;
}

封装fetch

const request = function request(url, config) {
  // init params
  if (typeof url !== "string")
    throw new TypeError("url must be required and of string type!");
  // 不是纯对象
  if (!isPlainObject(config)) config = {};
  // 合并配置项(这里应该是深合并,不要使用assign方法)
  config = Object.assign({}, initialConfig, config);
  // handle url
  if (/^http(s?):\/\//i.test(url)) url = baseURL + url;
  let { method, params, body, headers, cache, credentials, responseType } = config;
  // handle params 
  if (params != null) {
    if (isPlainObject(params)) {
      // 转为 name=zs&age=12 这种字符串拼接上去(使用qs库最好)
      let p = "";
      for (const key in params) {
        p += (key + "=" + params[key] + "&");
      }
      params = p.slice(0, -1);
    }
    url += `${url.includes("?") ? "&" : "?"}${params}`;
  }
  // handle body
  if (isPlainObject(body)) {
    body = JSON.stringify(body);
  } else if (typeof body === "string") {
    try {
      JSON.parse(body);
      // 是json字符串 默认就是json来处理的
    } catch (error) {
      // 不是JSON字符串
      // 设置请求头
      headers["content-type"] = "application/x-www-form-urlencoded";
    }
  }
  // common info
  // 类似请求拦截器 比如请求前携带token
  let token = "token";
  if (token) {
    headers["Authorization"] = `Bearer ${token}`;
  }
  // 配置config
  config = {
    method: method.toUpperCase(),
    headers,
    credentials,
    cache,
  }
  if (/^POST|PUT|PATCH$/.test(method) && body != null) config.body = body;
  return fetch(url, config).then(response => {
    let { status, statusText } = response;
    // 只有状态码是以 2 或者 3 开始 才表示请求成功
    if (status >= 200 && status < 400) {
      let result;
      switch (responseType.toUpperCase()) {
        case "JSON":
          result = response.json();
          break;
        case "TEXT":
          result = response.text();
          break;
        case "BLOB":
          result = response.blob();
          break;
        case "ARRAYBUFFER":
          result = response.arrayBuffer();
          break;
        default: // 都不匹配 转json
          result = response.json();
          break;
      }
      return result;
    }
    // 请求失败
    return Promise.reject({
      code: "STATUS ERROR",
      status,
      statusText
    });
  }).catch(reason => {
    // 失败情况
    // @1. 状态码错误
    if (reason && reason.code === "STATUS ERROR") {
      switch (reason.status) {
        case 400:
          break;
        case 401:
          break;
        case 402:
          break;
        case 403:
          break;
        case 500:
          break;
        default:
          break;
      }
    }
    // @2. 网络中断 
    else if (!navigator.onLine) { }
    // @3 其他错误 如请求被终止 取消等
    else { }
    return Promise.reject(reason);
  });
};

使用封装的request方法

request("/01-data.json", {
  responseType: "text"
  , params: {
    name: "zs"
  }
})
  .then(res => {
    console.log(res)
  }).catch(reason => {
    console.log(reason)
  })
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 22:04:44  更:2022-03-11 22:07:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:20:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码