js XMLHttpRequest自定义ajax请求配置

注意:未经允许不可私自转载,违者必究

项目GitHub地址:https://github.com/zhouwei1994/nativeCase.git

HTTP请求配置代码

在项目src/config目录下创建 response.js,代码如下:

本封装方法适合所有js语言的项目,本方法只封装了get、post,其他请求请自行封装

export default class request {
  constructor(options) {
    //请求公共地址
    this.baseUrl = options.baseUrl || "";
    //最大请求时间 0 是不限制时间
    this.timeout = options.timeout || 0;
    //默认请求头
    this.headers = options.headers || {};
    //默认配置
    //是否提示--默认提示
    this.isPrompt = true;
    //是否显示请求动画
    this.load = true;
    //是否使用处理数据模板
    this.isFactory = true;
  }
  //post请求
  post(url = '', data = {}, options = {}) {
    let requestInfo = this.getDefault(url, options);
    let requestData = JSON.stringify(data);
    return new Promise((resolve, reject) => {
      this.getRequest("POST", requestInfo, requestData, (state, response) => {
        //是否用外部的数据处理方法
        if (state && requestInfo.isFactory && this.dataFactory) {
          //数据处理
          var factoryInfo = this.dataFactory(requestInfo, response);
          factoryInfo.success ? resolve(factoryInfo.result) : reject(factoryInfo.result);
        } else {
          state ? resolve(response) : reject(response);
        }
      });
    });
  }
  //get请求
  get(url = '', data = {}, options = {}) {
    let requestInfo = this.getDefault(url, options);
    let dataStr = '';
    Object.keys(data).forEach(key => {
      dataStr += key + '=' + data[key] + '&';
    });
    //匹配最后一个&并去除
    if (dataStr !== '') {
      dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
    }
    requestInfo.httpUrl = requestInfo.httpUrl + '?' + dataStr;
    return new Promise((resolve, reject) => {
      this.getRequest("GET", requestInfo, '', (state, response) => {
        //是否用外部的数据处理方法
        if (state && requestInfo.isFactory && this.dataFactory) {
          //数据处理
          var factoryInfo = this.dataFactory(requestInfo, response);
          factoryInfo.success ? resolve(factoryInfo.result) : reject(factoryInfo.result);
        } else {
          state ? resolve(response) : reject(response);
        }
      });
    });
  }

  // 获取默认信息
  getDefault(url, options) {
    //判断url是不是链接
    var urlType = /^([hH][tT]{2}[pP]:\/\/|[hH][tT]{2}[pP][sS]:\/\/)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$/.test(url);
    let config = Object.assign({
      isPrompt: this.isPrompt,
      load: this.load,
      isFactory: this.isFactory
    }, options);
    //请求地址
    config.httpUrl = urlType ? url : this.baseUrl + url;
    //请求头
    config.headers = Object.assign(this.headers, options.headers);
    return config;
  }
  //请求方法
  getRequest(ajaxType, options, data, callback) {
    let requestObj;
    if (window.XMLHttpRequest) {
      requestObj = new XMLHttpRequest();
    }
    //请求前回调
    if (this.requestStart) {
      options.method = ajaxType;
      options.data = data;
      var requestStart = this.requestStart(options);
      if (typeof requestStart == "object") {
        options.data = requestStart.data;
        options.headers = requestStart.headers;
        options.isPrompt = requestStart.isPrompt;
        options.load = requestStart.load;
        options.isFactory = requestStart.isFactory;
      }
    }
    //设置请求时间,最低5秒
    if (options.timeout > 2000) {
      //设置xhr请求的超时时间
      requestObj.timeout = options.timeout;
    }
    requestObj.open(ajaxType, options.httpUrl, true);
    //加入请求头
    Object.keys(options.headers).forEach(key => {
      if (options.headers[key]) {
        requestObj.setRequestHeader(key, options.headers[key]);
      }
    });
    requestObj.send(options.data);
    requestObj.onreadystatechange = () => {
      if (requestObj.readyState == 4) {
        //请求完成回调
        this.requestEnd && this.requestEnd(options, requestObj);
        if (requestObj.status === 200) {
          let result = requestObj.response;
          if (typeof result !== 'object') {
            result = JSON.parse(result);
          }
          callback(true, result);
        } else {
          console.error(requestObj.response);
          callback(false, requestObj.response);
        }
      }
    }
  }
}

创建response对象和请求动画配置

在项目src/config目录下创建 fetch.js,代码如下:

import store from '@/config/store';
import router from '@/router/index';
import { prompt, $alert, getBrowser } from '@/utils/utils';
//引入请求方法
import request from "@/utils/request";
//创建request对象
var http = new request({
  //定义请求地址公共部分(必填)
  baseUrl: config.baseUrl,
  //设置请求头(默认为{})
  headers: {
    'Content-Type': 'application/json',
    'project_token': config.projectToken
  }
});
//请求开始回调
http.requestStart = function (options) {
  //判断当前接口是否需要加载动画
  if (options.load) {
    //打开加载动画
    store.commit('setLoading', true);
  }
  if (store.state.userInfo.token) {
    options.headers["user_token"] = store.state.userInfo.token;
  }
  console.log("请求开始", options);
  return options;
};
//请求结束
http.requestEnd = function (options, resolve) {
  console.log("请求结束", '\n', JSON.parse(resolve.response));
  //判断当前接口是否需要加载动画
  if (options.load) {
    store.commit('setLoading', false);
  }
}
//所有接口数据处理(这里是我们公司的java后台的数据结构,使用的小伙伴各自按照实际情况处理)
http.dataFactory = function (options, resolve) {
  console.log("所有接口数据处理");
  //设置回调默认值
  var callback = {
    success: false,
    result: "未定义返回值"
  };
  //判断数据是否请求成功
  if (resolve.success) {
    callback.success = true;
    callback.result = resolve.data;
  } else if (parseInt(resolve.code) == 1000) { //code == 1000 是用户未登录
    $alert("您还未登录,请先登录", {
      type: 1,
      confirmText: "去登录",
      cancelText: "再等等"
    }, res => {
      if (res.confirm) {
        router.push("/");
      }
    });
  } else { //其他错误提示
    if (options.isPrompt) {
      prompt(resolve.info);
    }
    callback.result = resolve.info;
  }
  return callback;
}
//返回请求对象
export default http;

数据请求

import $http from './../../config/fetch';

$http.get('aid/region',{pid:0})
    .then(function (response) {
        //请求成功
        console.log(response);
    }).catch(function (error) {
        //请求失败
        console.log(error);
    });

$http.post('aid/region',{pid:0})
    .then(function (response) {
        //请求成功
        console.log(response);
    }).catch(function (error) {
        //请求失败
        console.log(error);
    });
/* 
* url 类型:字符串
* 例如:“aid/region” 会把在公共设置的baseUrl加入在此url前面
* 例如:“http://www.xxxxx.com/aid/region” 公共设置的baseUrl不会加入在此url前面
* 
* data 类型:json
* 例如:{
*   pid:0
* }
*/
$http.post(url, data, {
    isPrompt: true,//(默认 true 说明:本接口抛出的错误是否提示)
    load: true,//(默认 true 说明:本接口是否提示加载动画)
    headers: { //默认 无 说明:请求头
        'Content-Type': 'application/json'
    },
    isFactory: true //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数奖失去作用)
}).then(function (response) {
    //请求成功
    console.log(response);
}).catch(function (error) {
    //请求失败
    console.log(error);
});

Loading、Toast组件请查看下面教程

教程:https://blog.csdn.net/weixin_40614372/article/details/86506678

项目GitHub地址:https://github.com/zhouwei1994/nativeCase.git

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值