接上一篇博客,上一篇是之前的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

自定义xhr请求的更多相关文章

  1. LoadRunner之自定义HTTP请求

    LoadRunner之自定义HTTP请求 性能测试开发脚本时使用的都是同样的模式.对在性能测试规划时指定的典型业务逻辑场景进行录制,形成基本的脚本骨架. 录制脚本后需要对脚本进行编辑,以满足性能测试需 ...

  2. 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求

    初学性能测试时候,第一步必学脚本录制,但一路下来各种录制失败.回放脚本失败的问题层出不穷,究其原因一是LR本身存在对测试环境的兼容性问题导致录制失败,更深层次的原因是录制者不清楚LR录制脚本的原理,或 ...

  3. 使用Typescript重构axios(二十八)——自定义序列化请求参数

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  4. 自定义Http请求头并且获取

    在一些开发需求中.我们需要把一些信息放到Http请求头中.比如我需要把签名信息 signature 放到Http请求头 所以就需要自定义请求头 signature ,用webClient发起请求 我这 ...

  5. Jmeter自定义Java请求开发

    一.本次实验目的 IDEA新建maven项目,使用java开发自定义jmeter的请求. 本次开发使用的代码,会百度云分享给大家. 二.本次实验环境 Idea 2017.02 Jmeter 5.1.1 ...

  6. jQuery—自定义HTTP请求

    Ajax设置自定义请求头的两种方法 $.ajax({ url: 'http://www.baidu.com', type: 'get', data: JSON.stringify({"nam ...

  7. 仅仅知道如何终止XHR请求,或许对你来说是不够的!

    TLDR: 当我们需要的时候,我们可以通过AbortController接口来终止一个或者多个请求. 前言 到目前为止,我们有两个常用的基本的手段去发送请求进而局部刷新页面内容,其一是XMR(XMLH ...

  8. JMETER并发压测-自定义不同请求参数

    背景 虽然可以请求相同的接口做测试,但是请求参数每次都是相同的.为了模拟不同的用户,请求不同的参数,所以要自定义参数来做多线程并发压力测试. 点赞再看,关注公众号:[地藏思维]给大家分享互联网场景设计 ...

  9. Jmeter扩展组件开发(7) - 自定义java请求的开发

    CODE package com.demo;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.ja ...

随机推荐

  1. HTML基础知识总结一

    一.HTML是什么? HTML是超文本标记语言的英文缩写,"超文本"就是指页面内能够包括图片.链接.甚至音乐.程序等非文字元素.超文本标记语言的结构包括"头"部 ...

  2. apue学习笔记(第三章 文件I/O)

    本章开始讨论UNIX系统,先说明可用的文件I/O函数---打开文件.读写文件等 UNIX系统中的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close open函数 ...

  3. Java Learning Path(五)资源篇

    Java Learning Path(五)资源篇 1. http://java.sun.com/ (英文) Sun的Java网站,是一个应该经常去看的地方.不用多说. 2.http://www-900 ...

  4. 给UITextField设置头或尾空白

    有时候,我们需要在UITextField的头尾加入一些空白,如下图所示: 其中,黄色和红色部分代表空白. 实现起来,比较简单,只需要设置UITextField的leftView.leftViewMod ...

  5. presentModalViewController方法,present一个透明的viewController,带动画效果

    //假设需要被present的控制器实例为controller,controller的背景色设置为clearColor UIViewController * rootcontroller = self ...

  6. ASP.NET CORE RAZOR :在 ASP.NET Core 中开始使用 Razor Pages

    来自:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-pages-start 系统必备安装以下组件:. ...

  7. Andrew Ng机器学习笔记+Weka相关算法实现(五)SVM最优间隔和核方法

    这一章主要解说Ng的机器学习中SVM的兴许内容.主要包括最优间隔分类器求解.核方法. 最优间隔分类器的求解 利用以一篇讲过的的原始对偶问题求解的思路,我们能够将相似思路运用到SVM的求解上来. 详细的 ...

  8. 解决 三星Note3 桌面小部件不实时更新/不刷新 的问题

    机型及问题描述:我的是三星note3 (国行 SM-N9008V),已ROOT,安装了LBE安全大师.在桌面小部件中,有些不会实时更新.比如有 滴答清单(办过的事项无法勾选),百度云音乐(歌曲播放更新 ...

  9. C++11 并发指南三(Lock 详解)(转载)

    multithreading 多线程 C++11 C++11多线程基本使用 C++11 并发指南三(Lock 详解) 在 <C++11 并发指南三(std::mutex 详解)>一文中我们 ...

  10. UVA 10209

    10209 - Is This Integration ? #include <stdio.h> #include <math.h> /* */ //多次错误都是因为我将PI定 ...