一、封装原生的xhr为ajax类

xhr以及用法见之前的文章

1、根据url确定请求的头部以及别的信息。

    var _headerConfig = {};
if(url.indexOf('getcaptcha') !== -1) {
_headerConfig = {
Accept: 'image/png',
responseType: 'arraybuffer',
}
} else if(url.indexOf('files/upload') !== -1) {
_headerConfig = {
'Content-Type': 'multipart/form-data',
responseType: 'json',
}
} else {
_headerConfig = {
'Content-Type': 'application/json',
Accept: 'application/json',
responseType: 'json',
}
}

2、根据参数信息中的信息,确定请求的方法以及请求的参数

    if("method" in options) {
options.method = options.method.toUpperCase();
} else {
options.method = "GET";
}
if(options.method !== "GET") {
if(!(options.params instanceof FormData)) {
options.params = JSON.stringify(options.params);
}
}

3、打开xhr并且根据头部头部以及其他信息设置,发送

    this.xhr.open(options.method, url, true);
for(var _i in _headerConfig) { if(_i === 'responseType') {
this.xhr.responseType = _headerConfig[_i];
} else {
this.xhr.setRequestHeader(_i, _headerConfig[_i]);
}
}
if(token) {
this.xhr.setRequestHeader("token", token);
}
this.xhr.send(options.params);

4、实现链式编程:在每个函数的结尾return this;

5、实现完成后执行回调

这个问题结合链式编程一度的卡了很久。

ajax.prototype.complete = function(completeFunction) {
this.xhr.onreadystatechange = function(e) {
if(this.readyState === 4) {
completeFunction(this);
}
}
return this;
}

二、封装实用性的request类

在项目中经常需要将request进行封装,使用ajax类发起请求。拼接请求的地址函数。

1、创建拼接方法。

var requstUrl = {
baseURL: URL,
API: {
NEWS: '/news',
LOGIN: '/',
},
// api为API中的参数,用于拼接url
// method为API后的地址,用于拼接url最后面的东西。
// params为get请求需要的参数
createUrl: function(api, method, params) {
var _requestUrl = this.baseURL + this.API[api] + method;
if(params) {
for(var i of params) {
_requestUrl += (_requestUrl.indexOf("?") == -1 ? "?" : "&");
_requestUrl += name + "=" + value;
}
}
return _requestUrl;
}
}

2、确定各个请求。

function handleRequest() {

}

//  get请求带参数。
handleRequest.prototype.getDataUseGet = function(api, method, params) {
var _url;
var ajax = new Ajax();
var token = sessionStorage.getItem('token');
if(params) {
_url = requstUrl.createUrl(api, method, params);
} else {
_url = requstUrl.createUrl(api, method);
}
return ajax.request(_url, {
method: 'GET',
params: params
}, token);
} // get请求不带token
handleRequest.prototype.getDataUseGetWithoutToken = function(api, method, params) {
var _url;
var ajax = new Ajax();
if(params) {
_url = requstUrl.createUrl(api, method, params);
} else {
_url = requstUrl.createUrl(api, method);
}
return ajax.request(_url, {
method: 'GET',
params: params
});
} // post请求带token
handleRequest.prototype.getDataUsePost = function(api, method, params) {
var _url = requstUrl.createUrl(api, method);
var token = sessionStorage.getItem('token');
var ajax = new Ajax();
console.log(createAjaxObj(_url, {
method: 'POST',
params: params
}, token));
return ajax.request(_url, {
method: 'POST',
params: params
}, token);
} // post请求不带token
handleRequest.prototype.getDataUsePostWithOutToken = function(api, method, params) {
var _url = requstUrl.createUrl(api, method);
var ajax = new Ajax();
return ajax.request(_url, {
method: 'POST',
params: params
});
} // put请求带token
handleRequest.prototype.getDataUsePut = function(api, method, params) {
var _url = requstUrl.createUrl(api, method);
var token = sessionStorage.getItem('token');
var ajax = new Ajax();
return ajax.request(_url, {
method: 'PUT',
params: params
}, token);
} // put请求不带token
handleRequest.prototype.getDataUsePutWithOutToken = function(api, method, params) {
var _url = requstUrl.createUrl(api, method);
var ajax = new Ajax();
return ajax.request(_url, {
method: 'PUT',
params: params
});
} // delete请求带token
handleRequest.prototype.deleteData = function(api, method, params) {
var _url = requstUrl.createUrl(api, method);
var token = sessionStorage.getItem('token');
var ajax = new Ajax();
return ajax.request(_url, {
method: 'DELETE',
params: params
}, token);
}

这个方法感觉可以再次进行封装。

三、使用

1、使用代码

<!DOCTYPE html>
<html> <head>
<meta charset="UTF-8">
<title></title>
</head> <body>
</body>
<script src="ip.js" type="text/javascript"></script>
<script src="xhr.js" type="text/javascript"></script>
<script src="request.js" type="text/javascript"></script>
<script type="text/javascript"> var data = {
"captcha": "string",
"password": "string",
"username": "string"
}; var test = new handleRequest();
test.getDataUsePostWithOutToken('LOGIN', 'login',data).complete(function(result) {
console.log(result)
})
</script> </html>

2、结果

成功发起请求。

完整代码点击查看

以上。

原文地址:https://segmentfault.com/a/1190000017006833

原生JS封装ajax以及request的更多相关文章

  1. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  2. 使用原生JS封装Ajax

    使用原生 的JS封装 Ajax,实现 仿JQuery的Ajax,post,get三种异步请求方式: var MAjax = { //根据浏览器创建异步对象 createXhr: function () ...

  3. 原生js封装ajax:传json,str,excel文件上传表单提交

    由于项目中需要在提交ajax前设置header信息,jquery的ajax实现不了,我们自己封装几个常用的ajax方法. jQuery的ajax普通封装 var ajaxFn = function(u ...

  4. 原生JS封装ajax方法

    http://blog.sucaijiayuan.com/article/89 jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只 ...

  5. 原生js封装ajax,深入理解$.ajax()

    直接上代码 //封装的ajax函数 // 传一个对象,所有要用的参数都在对象中 因为不写对象 实参列表个数太多,所以像jq一样,调用ajax也是把对象当实际参数传进去 // type 请求方式 默认g ...

  6. 原生js封装ajax代码

    方法一:(类似jQuery的封装方法) 1.ajax函数封装: /* *author: Ivan *date: 2014.06.01 *参数说明: *opts: {'可选参数'} **method: ...

  7. ajax 原生js封装ajax [转]

    /* 封装ajax函数 * @param {string}opt.type http连接的方式,包括POST和GET两种方式 * @param {string}opt.url 发送请求的url * @ ...

  8. 原生js封装Ajax

    [转载请注明出处] 1 /** * @fileoverview ajax请求公用组件 * @author Limo * @date 2015/08/07 * Native package ajax m ...

  9. 原生js封装ajax,实现跨域请求

    描述: 需要ajax跨域请求,用cors跨域方案.服务端设置: header('Access-Control-Allow-Origin: http://front.ls-la.me'); header ...

随机推荐

  1. --without-v4l ,make clean, 重新make即可。

    --without-v4l ,make clean, 重新make 2011-02-27 17:38 Error: X11 support required for GUI compilation

  2. sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个“你”当作android:),使用sax解析xml文件是我见到过 ...

  3. 分享一些 Java 后端的个人干货

    学习 Java 也有了不少时间,入 Java 后台的坑也有了一段时日.这段时间里,听过许多前辈的经验与分享,也看过许多大佬的文章和作品.找了个时间整理和总结了一下我个人到目前为止一路以来的听到看到或者 ...

  4. [Office]PPT 2013如何设置图片为半透明?

    PPT里面似乎无法直接为图片设置透明度属性.下面是一种变通的办法. 1,插入一个和图片大小一致的图形(矩形):2,右键插入的矩形,然后在属性设置里选择“图片填充”,选择以需要的图片填充到该矩形里:3, ...

  5. HDU 5372 Segment Game

    /** 多校联合2015-muti7-1004 <a target=_blank href="http://acm.hdu.edu.cn/showproblem.php?pid=537 ...

  6. UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=4675">点击打开链接 gg.. ...

  7. 使用Handler在子线程中更新UI

    Android规定仅仅能在主线程中更新UI.假设在子线程中更新UI 的话会提演示样例如以下错误:Only the original thread that created a view hierach ...

  8. redis持久化,rdb,aof

    RDB(Redis DataBase) AOF(Append Only File) 周阳语录:能撑过面试经理头一分钟最重要.头一分钟,决定人家还是否想跟你继续聊下去. RDB RDB就是在指定的时间内 ...

  9. Swift-UITextField用法

    文本框的创建,如下几种方式: UITextBorderStyle.None:无边框 UITextBorderStyle.Line:直线边框 UITextBorderStyle.RoundedRect: ...

  10. 前后端分离之接口登陆权限token

    随着业务的需求普通的springmvc+jsp已经不能满足我们的系统了,会逐渐把后台和前端展示分离开来,下面我们就来把普通的springmvc+jsp分为 springmvc只提供rest接口,前端用 ...