自定義xhr請求


接上一篇博客,上一篇是之前的jsonp請求方法的封裝,這一篇是xhr請求的簡單封裝。
原理:
1:new一個xhr對象,命名為ajaxRequest,由於瀏覽器兼容性的問題,所以將獲取xhr對象的方式封裝為一個方法,命名為CreateRequestObject;
2:聲明一個用來發送xhr請求的方法,命名為obtainData,可以接收一些參數:url、type、timeout、contentType、data、ready、error等;
3:將傳入的參數進行處理,若某些可選參數沒有傳入,則賦值默認值;
4:發送請求,並根據情況執行回調。

/*
 * xhr 獲取數據 
 * */
var debug = true;   // 是否開啟debug

function CreateRequestObject() {
  var ajaxRequest;
  try {
    ajaxRequest = new XMLHttpRequest();
  } catch (e) {
    try {
      ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try{
        ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        ajaxRequest = false;
      }
    }
  }
  if(!ajaxRequest) {
    console.log('您的瀏覽器版本過低,請更換最新版本的Chrome瀏覽器!');
  }
  return ajaxRequest;
}

/*
 * paramObj {
 *   url: 請求的接口url
 *   type: get/post  請求的方式,可選,默認get
 *   timeout: 設置請求超時時間,可選,默認為0,即不設置超時
 *   contentType:設置header,可選
 *   data: 要發送的數據
 *   ready: 請求結束后執行
 *   error: 請求錯誤
 * */
function obtainData(paramObj) {
  var ajaxRequest = CreateRequestObject();
  if(ajaxRequest === false) {  // 如果獲取ajax對象失敗
    return;
  }

  // 默認數據的處理
  var defaultContentType = 'application/x-www-form-urlencoded; charset=UTF-8';
  // var defaultContentType = 'application/json; charset=UTF-8';
  var defaultType = 'GET';
  var defaultAsync = true;
  paramObj.contentType = paramObj.contentType || defaultContentType;
  paramObj.type = paramObj.type || defaultType;   // 默認是GET
  paramObj.async = (typeof paramObj.async === 'boolean') ? paramObj.async : defaultAsync;   // 默認是異步
  // 設置超時時間
  paramObj.timeout && Number(paramObj.timeout) ? ajaxRequest .timeout = paramObj.timeout : '';

  // 處理要發送的數據
  var senData = paramObj.data ? paramObj.data : "";
  if(paramObj.type === "GET") {
    senData = formatParams(senData);
  } else if(paramObj.contentType.indexOf('application/x-www-form-urlencoded') > -1) {
    senData = formatParams(senData);
  } /*else if(paramObj.contentType.indexOf('application/json') > -1) {  // 發送json格式失敗
   senData = JSON.stringify(senData);
   } */else {
    // 其他請求方式的數據轉換需要自己實現
  }

  // 發送數據
  if(paramObj.type === "GET") {
    ajaxRequest.open(paramObj.type, paramObj.url + '?' + senData, paramObj.async);
    ajaxRequest.send(null);
  } else if(paramObj.type === "POST") {   // POST
    ajaxRequest.open(paramObj.type, paramObj.url, paramObj.async);
    ajaxRequest.setRequestHeader('Content-Type', paramObj.contentType);
    ajaxRequest.send(senData);
  }
  // 監聽超時事件
  ajaxRequest.ontimeout = function () {
      console.error("The request for " + paramObj.url + " timed out.");
  };
  // 處理返回函數
  ajaxRequest.onreadystatechange = function () {
    if(ajaxRequest.readyState === 4) {
      if(ajaxRequest.status === 200 || ajaxRequest.status === 304) {
        var result = ajaxRequest.responseText;
        try {
          var data = result ? JSON.parse(result) : false;  //  將json字符串轉為json對象
          paramObj.ready? paramObj.ready(data): '';
        } catch (e) {
          console.error(e);
        }
      } else {
        console.error("請求錯誤");
        paramObj.error? paramObj.error(): '';
      }
    }
  }; // 回調函數結束
}

本文鏈接:https://www.cnblogs.com/xsilence/p/10795505.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM