用XHR简单封装一个axios

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>XHR</title>
  </head>
  <body>
    <div>
      <button onclick="testGet()">GET请求</button>
      <button onclick="testPost()">POST请求</button>
      <button onclick="testPut()">PUT请求</button>
      <button onclick="testDelete()">DELETE请求</button>
    </div>

    <script>
      function testGet() {
        axios({
          url: "http://localhost:3000/posts",
          params: {
            id: 1
          }
        }).then(
          response => {
            console.log(response);
          },
          error => {
            console.log(error.message);
          }
        );
      }

      function testPost() {
        axios({
          url: "http://localhost:3000/posts",
          method: "POST",
          data: {
            title: "--POST添加上去的",
            author: "--POST添加---",
            id: 4
          }
        }).then(
          response => {
            console.log(response);
          },
          error => {
            console.log(error.message);
          }
        );
      }

      // axios 简单封装
      function axios({ url, method = "GET", params = {}, data = {} }) {
        // 返回一个promise对象
        return new Promise((resolve, reject) => {

          // 处理metho(转大写)
          method = method.toUpperCase()
          // 处理query参数(拼接到url上) id=1&aaa=ccc
          /*{
              id: 1,
              aaa: ccc
            }*/
          let queryString = "";
          Object.keys(params).forEach(key => {
            queryString += `${key}=${params[key]}&`;
          });
          // 判断queryString有没有值
          if (queryString) {
            // 去除最后的&
            queryString = queryString.substring(0, queryString.length - 1);
            // 接到url上
            url += "?" + queryString;
          }
          console.log(queryString);
          // 1.执行异步ajax请求
          // 创建xhr对象
          const request = new XMLHttpRequest();

          // 打开链接(初始化请求,没有请求)
          request.open(method, url, true);
          // 发送请求
          if (method === "GET") {
            request.send();
          } else if (method === "POST") {
            request.setRequestHeader(
              "Content-Type",
              "application/json;charset=utf-8"
            ); // 告诉服务器请求体的格式是JSON格式
            request.send(JSON.stringify(data)); // 发送JSON格式的请求体参数
          }

          //绑定状态改变的监听
          request.onreadystatechange = function() {
            // 如果请求没有完成,直接结束
            if (request.readyState !== 4) {
              return;
            }
            // 如果响应状态码在[200,300)之间表示请求成功,否则失败
            const { status, statusText } = request;
            if (status >= 200 && status < 300) {
              // 准备结果数据对象response
              const response = {
                data: JSON.parse(request.response),
                status,
                statusText
              };
              // 2.1如果请求成功了,调用resolve()
              resolve(response);
            } else {
              // 2.2如果请求失败,调用reject()
              reject(new Error("request error status is " + status));
            }
          };
        });
      }
    </script>
  </body>
</html>

原文地址:https://www.cnblogs.com/PasserByOne/p/12044256.html

时间: 2024-10-09 16:47:03

用XHR简单封装一个axios的相关文章

Swift:简单封装一个工具类模板

创建模板类(封装一个类)新建一个名字叫做 Product 的类 Product.swift File 的内容 class Product { var name: String var description: String var price: Double var stock: Int init(name: String, description: String, price: Double, stock: Int) { self.name = name self.description =

Android 简单封装一个精美、好用的菜单型PopupWindow

先上效果图: 就是这样一个菜单型的PopupWindow,现在说下是怎么弄的, 先看一个布局文件,这个布局文件 package cn.edu.jxufe.popupwindowdemo; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.view.LayoutInflater; import android.view.View; import androi

简单封装一个ajax插件

function ajax(options) { options = options || {}; options.type = options.type || 'get'; options.type = options.data || {}; options.dataType = options.dataType || 'text'; //IE6以下无法使用 let xhr = new XMLHttpRequest(); // 数据修改 let arr = []; for (let name

封装一个axios请求后台的通用方法

import axios from 'axios'; import constant from '@/js/const'; import alert from '@/js/alertView'; let env = process.env.NODE_ENV; var needLogin = ""; let root = ''; let yxHeader; if (env === 'development') { console.log("api"); } else

axios简单封装

写在最前面 新手前端刚刚接触vue,感觉真的好用.项目中需要使用axios,然后学习了一下.借鉴网上一些大佬的经验,现在分享一下axios的简单封装,如果有什么错误的地方,请大家指出. axios安装 npm install axios --save 最最简单的使用 首先在src目录下创建axios文件夹,然后创建index.js和fetch.js两个文件. fetch.js文件代码如下: import axios from 'axios' //定义fetch函数,config为配置 expor

Directx11学习笔记【四】 封装一个简单的Dx11DemoBase

根据前面两个笔记的内容,我们来封装一个简单的基类,方便以后的使用. 代码和前面类似,没有什么新的内容,直接看代码吧(由于代码上次都注释了,这次代码就没怎么写注释o(╯□╰)o) Dx11DemoBase.h Dx11DemoBase.h #pragma once #include <d3d11.h> #include <D3DX11.h> #include <DxErr.h> class Dx11DemoBase { public: Dx11DemoBase(); vi

C 封装一个通用链表 和 一个简单字符串开发库

引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是C++写,界面是C#写.那时候刚进去评级我是中级,因为他问我关于系统锁和信号量都答出来.开发一段 时间,写C#也写的很溜.后面招我那个人让我转行就写C++和php,那时候就开始学习C++有关知识. 后面去四川工作了,开发安卓,用eclipse + java语法 + android jdk,开发前端,

C 封装一个简单二叉树基库

引文 今天分享一个喜欢佩服的伟人,应该算人类文明极大突破者.收藏过一张纸币类型如下 那我们继续科普一段关于他的简介 '高斯有些孤傲,但令人惊奇的是,他春风得意地度过了中产阶级的一生,而  没有遭受到冷酷现实的打击:这种打击常无情地加诸于每个脱离现实环境生活的  人.或许高斯讲求实效和追求完美的性格,有助于让他抓住生活中的简单现实.  高斯22岁获博士学位,25岁当选圣彼德堡科学院外籍院士,30岁任哥廷根大学数  学教授兼天文台台长.虽说高斯不喜欢浮华荣耀,但在他成名后的五十年间,这  些东西就像

封装一个简单的solrserver组件

一个简单的solrserver组件 实现索引更新的异步处理,以及查询接口,日志/线程池/队列监控没有加上. SolrDocment封装 接口: public interface ISolrDocument { public SolrInputDocument convertToInputDocument() throws Exception; public void buildSolrDocument(SolrDocument document) throws Exception; } 实现: