自定义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
自定义xhr请求的更多相关文章
- LoadRunner之自定义HTTP请求
LoadRunner之自定义HTTP请求 性能测试开发脚本时使用的都是同样的模式.对在性能测试规划时指定的典型业务逻辑场景进行录制,形成基本的脚本骨架. 录制脚本后需要对脚本进行编辑,以满足性能测试需 ...
- 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求
初学性能测试时候,第一步必学脚本录制,但一路下来各种录制失败.回放脚本失败的问题层出不穷,究其原因一是LR本身存在对测试环境的兼容性问题导致录制失败,更深层次的原因是录制者不清楚LR录制脚本的原理,或 ...
- 使用Typescript重构axios(二十八)——自定义序列化请求参数
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 自定义Http请求头并且获取
在一些开发需求中.我们需要把一些信息放到Http请求头中.比如我需要把签名信息 signature 放到Http请求头 所以就需要自定义请求头 signature ,用webClient发起请求 我这 ...
- Jmeter自定义Java请求开发
一.本次实验目的 IDEA新建maven项目,使用java开发自定义jmeter的请求. 本次开发使用的代码,会百度云分享给大家. 二.本次实验环境 Idea 2017.02 Jmeter 5.1.1 ...
- jQuery—自定义HTTP请求
Ajax设置自定义请求头的两种方法 $.ajax({ url: 'http://www.baidu.com', type: 'get', data: JSON.stringify({"nam ...
- 仅仅知道如何终止XHR请求,或许对你来说是不够的!
TLDR: 当我们需要的时候,我们可以通过AbortController接口来终止一个或者多个请求. 前言 到目前为止,我们有两个常用的基本的手段去发送请求进而局部刷新页面内容,其一是XMR(XMLH ...
- JMETER并发压测-自定义不同请求参数
背景 虽然可以请求相同的接口做测试,但是请求参数每次都是相同的.为了模拟不同的用户,请求不同的参数,所以要自定义参数来做多线程并发压力测试. 点赞再看,关注公众号:[地藏思维]给大家分享互联网场景设计 ...
- Jmeter扩展组件开发(7) - 自定义java请求的开发
CODE package com.demo;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.ja ...
随机推荐
- lodash 数组裁剪 drop
_.drop(array, [n=1]) 裁剪数组中的前 N 个数组,返回剩余的部分. <!DOCTYPE html> <html lang="zh"> & ...
- HBase数据同步到ElasticSearch的方案
ElasticSearch的River机制 ElasticSearch自身提供了一个River机制,用于同步数据. 这里能够找到官方眼下推荐的River: http://www.elasticsear ...
- Loadrunner中对中文进行UTF-8转码的探索
上一篇 / 下一篇 2010-02-22 15:20:28 查看( 2378 ) / 评论( 2 ) / 评分( 5 / 0 ) 这是一个HTTP接口测试中经常会碰到的问题,目前的服务器采用的都是U ...
- Convolutional Patch Networks with Spatial Prior for Road Detection and Urban Scene Understanding
Convolutional Patch Networks with Spatial Prior for Road Detection and Urban Scene Understanding 深度学 ...
- mongoDB 特别指令用法
http://apluck.iteye.com/blog/1176160 a. 修改collection集合字段名 参见:http://www.mongodb.org/display/DOCS/U ...
- 腾讯云DevOps 解决方案
地址:https://www.qcloud.com/solution/devops 主要经历的几个阶段: 代码托管 持续集成与交互 测试管理 运维监控 项目管理 在上面图中都有,可以回过去查看.
- IBM Security AppScan Glass Box:一种全新的漏洞扫描思想
IBM Security AppScan Glass Box:一种全新的漏洞扫描思想 Glass Box 是 IBM Security AppScan Standard Edition(以下简称 Ap ...
- win 下g++ 安装、环境配置等
工具:eclipse for c++: 由于eclipse没有集成c++的编译器及执行环境,所以须要自己额外安装g++等. 方法: 使用MinGW来下载和安装须要的工具: 下载地址:http://ww ...
- [root@localhost ~]#各项解释
[root@localhost ~]# 解释: [登录用户@主机名 索引目录(~家目录,当前所在的目录)]#号代表超级用户,$普通用户
- Linux中的关机
我是用普通用户登录,在终端下输入shutdown命令,结果显示 command not found.这就奇怪了,难道我的linux不支持这个命令?man了一下shutdown,大篇幅的说明告诉我,我的 ...