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

    前后端分离式开发的思考 目前大部分公司都实行了前后端分离开发.然而在项目开发过程当中,经常会遇到以下几个尴尬的场景: 1.前端开发依赖于后端接口数据,需要与后端接口联调才能获得数据展示,从而拖慢了开发 ...

  2. [LeetCode] Restore IP Address [28]

    题目 Given a string containing only digits, restore it by returning all possible valid IP address comb ...

  3. servlet监听器与事件

    前言 在Servlet 2.4/JSP 2.0中,共同拥有八个Listener接口,六个Event类别. 參考:Servlet中的八大Listener 入门 阅读文件夹 Web监听器 监听器的分类 S ...

  4. listItem选中状态高亮

    两种方法1.在adapter中添加方法changeSelected()int mSelect = 0; //mSelect为选中项public void changeSelected(int posi ...

  5. HDU-1165-Eddy's research II

    这个事实上是一个递归题.题目非常easy.m的数非常小.分三种情况.算一下.就能够直接把公式算出来. 当然,也能够用dp做: #include<iostream> #include< ...

  6. linux 内存分析

    http://blog.yufeng.info/archives/2456  这篇文章不错 值得看 http://www.361way.com/memory-analysis/5018.html

  7. sprint3 【每日scrum】 TD助手站立会议第九天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 整合原来做过的功能,并做相应的改进,整合其他的功能 团队进入最终的功能测试阶段,准备发布Beta版 在测试阶段BUG太多,不知道如何解决 Y ...

  8. 在Ubuntu 16.04下安装 virtualbox 5.2

        sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian xenial contrib" ...

  9. URL重写:Rewirte模块原理详解

    Apache+PHP+MySQL Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等.本文将针对mod_ ...

  10. NPOI 计算单元格高度

    需求 要导出一个Excel,第一行是不定长字符串,合并单元格(A-G)已知,现要计算第一行的高度. 思路 已知,NPOI的宽度单位是1/256个英文字符,在本例中,A列的宽度是2048,即 2048 ...