ajax的封装

在前面的文章中介绍了一下ajax的使用方法跟注意事项后,在真实开发环境中,大家总不可能没发一次请求就写一次ajax吧,在后期代码维护中,你会感受到什么是绝望。

因此ajax肯定是需要封装的,下面代码附上,大家自行参考。

function ajax(options) {
  //设置默认参数
  var defaultData = {
    methods: "get",
    url: "",
    header: {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    data: {},
    success: function() {},
    error: function() {}
  };
  //将传递过来的参数进行拷贝,没有则使用默认参数
  Object.assign(defaultData, options);

  var xhr = new XMLHttpRequest();
  xhr.open(defaultData.methods, defaultData.url);
  if (defaultData.methods == "get") {
    //调用参数拼接方法进行参数拼接
    let parms = parmsConcat(defaultData.data);
    xhr.setRequestHeader("Content-Type", defaultData.header["Content-Type"]);
    defaultData.url = defaultData.url + "?" + parms;
  }
  //当请求方式为post 则判断请求头是json还是x-www-form-urlencoded
  if (defaultData.methods == "post") {
    //获取参数中的请求头
    let contentType = defaultData.header["Content-Type"];
    //post请求设置请求头
    xhr.setRequestHeader("Content-Type", contentType);
    //判断是请求头是json格式则将数据转成json字符串进行传递
    if ("application/json" == contentType) {
      xhr.send(JSON.stringify(defaultData.data));
    } else {
      let parms = parmsConcat(defaultData.data);
      xhr.send(parms);
    }
  } else {
    xhr.send();
  }
  xhr.onload = function() {
    //判断http状态码是否是200
    if (200 == xhr.status) {
      var contentType = xhr.getResponseHeader("Content-Type");
      //判断返回的数据类型是否是json格式,是则转成对象形式
      if (contentType.includes("application/json")) {
        defaultData.success(JSON.parse(xhr.responseText), xhr);
      } else {
        defaultData.success(xhr.responseText, xhr);
      }
    } else {
      defaultData.error(xhr.responseText, xhr);
    }
  };
}
//封装参数拼接方法
function parmsConcat(data) {
  //传递的参数
  var parms = "";
  //拼接参数
  for (let attrs in data) {
    parms += `attrs=${data[attrs]}&`;
  }
  //去除参数最后一个&
  parms = parms.slice(0, parms.length - 1);
  return parms;
}

//调用封装好的ajax发个请求玩一玩,效果还不错
ajax({
  methods: "post",
  url: "http://127.0.0.1:3000/get",
  header: {
    "Content-Type": "application/json"
  },
  data: {
    name: "zs",
    age: 23
  },
  success: function(res) {
    console.log(res);
  },
  error(err) {
    console.log(err);
  }
});

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容