自定义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 ...
随机推荐
- 【Excle】如何隐藏数据透视表中的错误值
如下:数据透视表出现错误 怎么解决呢 步骤 方法① 单击数据透视表任意单元格→数据透视表工具→分析→选项→勾选"对于错误值显示"→确定 方法② 右键→数据透视表选项(同样可以修改)
- 基于JWT的Token开发案例
代码地址如下:http://www.demodashi.com/demo/12531.html 0.准备工作 0-1运行环境 jdk1.8 maven 一个能支持以上两者的代码编辑器,作者使用的是ID ...
- Security Testing Basics
Security Testing BasicsSoftware security testing is the process of assessing and testing a system to ...
- PHP array_walk() 函数
定义和用法 array_walk() 函数对数组中的每个元素应用用户自定义函数.在函数中,数组的键名和键值是参数. <?php function myfunction($value,$key,$ ...
- cocos2d-x 3.0 Android环境搭建(亲測通过)
网上一大堆讲述coco2d-x 3.0 版本号的android环境搭建.真是不忍直視.讲的不清不楚,真是不知道他们自己有没有測试过.今天正好忙完项目有点时间去部署了下android环境. cocos2 ...
- lua学习笔记(三)
类型与值 lua是一种动态类型的语言,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息 lua中有8种基础类型 nil 只与自身相等assert(nil==nil ...
- Android linux kernel privilege escalation vulnerability and exploit (CVE-2014-4322)
In this blog post we'll go over a Linux kernel privilege escalation vulnerability I discovered which ...
- [转]const指针与指向const的指针
经常忘记,保存一下.. #include <iostream> using namespace std; int main(int argc, char *argv[]) { ; int ...
- mapreduce学习资料
http://blog.csdn.net/tianjun2012/article/category/6794531 http://blog.csdn.net/tianjun2012/article/d ...
- PHP 使用 GeoLiteCity 库解析 IP 为地理位置
关于把 IP 地址转换为地理位置可以使用网络上很多的 API,好处就是不用在本地存储一个 IP 数据库,而且一般网络上的 IP 库会自动更新,不利的地方就是太依赖于网络,性能表现也可能会弱些.比如像下 ...