原生JS封装ajax以及request

一、封装原生的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


更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 8 Friday Goodies:SQL ResultSet流

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了…

java类型转换答案,在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。...

在java中支持两种类型的类型转换,自动类型转换和强制类型转换。父类转化为子类需要强制转换。更多相关问题计算机病毒通过()传染扩散得极快,危害最大。当一个现象的数量由小变大,另一个现象的数量相反地由大变小,这种相关称为()。输油管道沿线…

Java实现回形数,只利用数组、循环和if-else语句

import java.util.Scanner; public class learn {   public static void main(String[] args){ System.out.println("请输入你需要打印多少阶的回形数:");     Scanner scan new Scanner(System.in);     int num scan.nextInt();    // 接收num,则…

FWT(快速沃尔什变换)学习

https://www.cnblogs.com/cjyyb/p/9065615.html edo直接看大佬的博客吧 不仅有证明之类的还有板子呢 转载于:https://www.cnblogs.com/ENESAMA/p/10109995.html

创建一个简单的JAX-RS MessageBodyWriter

JAX-RS确实很酷,借助JAXB,只需添加带有JAXB批注的批注数据对象,即可为您转换许多响应数据类型。 我对JAXB相当陌生,但是一些简单的注释剪切/粘贴操作将带给您很长的路要走。 出于无法从JAX-RS资源方法返回该数据类型的目的&#…

SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

1. 什么是负载均衡? 负载均衡,就是分发请求流量到不同的服务器。 负载均衡一般分为两种 1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 2. 服务提供者(spring-cloud-provider&#xff…

pHp中文网零基础,零基础编程

基础编程conmysql_connect(constant("SERVER"),constant("USERNAME"),constant("PASSWORD"));if(!$this->con){die(connet to mysql error.mysql_error());}else{mysql_select_db(constant("DATABASE"),$this->con);}}function …

正确判断js数据类型 总结记录

正确判断js数据类型 总结记录 判断js中的数据类型有一下几种方法:typeof、instanceof、 constructor、 prototype、 三方库。 js六大数据类型 number: 数字,整数、浮点数等等, string: 单引号或者双引号来说明&…

wait/notify实现线程间的通信

使线程之间进行通信之后,系统间的交互性更加强大,在大大提高CPU利用率的同时还会使程序对各线程任务在处理的过程中进行有效的把控与监督。 1.不使用wait/notify实现线程间通信 使用sleep()while(true)也可以实现线程间通信。 例如:两个线程&#xff0c…

项目学生:使用AOP简化代码

这是Project Student的一部分。 许多人坚信方法应适合您的编辑器窗口(例如20行),而有些人则认为方法应小于此范围。 这个想法是一种方法应该做一件事,而只能做一件事。 如果它做的还不止于此,则应将其分解为多种方法&…

洛谷 P3367 【模板】并查集

嗯... 题目链接:https://www.luogu.org/problemnew/show/P3367 并查集可以支持的操作:“并”和“查”。然后这道题主要就是考察这两种操作。将每一个点的“父亲”初始化为自己,然后分别进行“并”和“查”。 “并”:用递归函数fin…

MySQL使用学习使用,mysql学习--基本使用_MySQL

一旦安装完成,MySQL 服务器应该自动启动。sudo start mysql #手动的话这样启动sudo stop mysql #手动停止当你修改了配置文件后,你需要重启 mysqld 才能使这些修改生效。要想检查 mysqld 进程是否已经开启,可以使用下面的命令:pgr…

解决@vue/cli 创建项目是安装chromedriver时失败的问题

最近在使用新版vue的命令行工具创建项目时,安装chromedriver老是失败,导致后面的步骤也没有进行。网上搜索了一下,全是使用 npm install chromedriver --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedriver 安装的&#xff0c…

Java 8 Friday Goodies:Lambda和排序

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了…

npm 包下载的各种姿势

最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用比较混乱。其实博主在这之前对这两个参数的理解也是模糊的,各种查资料和实践后对它们之间的异同点略有理解。遂写下这篇文章避免自己忘记,同时也给node猿友一…

39.数组中数值和下标相等的元素

题目描述: 假设一个单调递增的数组里的每个元素都是整数且是唯一的,请编程实现一个函数,找出数组中任意一个数值等于其下标的元素,例如,在数组{-3,-1,1,3,5}中数字3和它的下标相同。 思路分析: …

php读取xml标签内容,从xml php5获取内容

我正在研究一个支付解决方案,需要一些关于php的帮助。我正在做一个httprequest,作为回应,我将得到一些xml。XML可能如下所示:1description121510authurlsettleurl基本上我想做的是从标签中获取内容并将其保存为字符串。我试过这个:$order <?xml version"1.0" en…

jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题

项目中使用的jquery版本是jquery-3.2.1&#xff0c;在使用layui弹出全屏iframe窗口时&#xff0c;iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-…

ADF Faces。 立即的自定义客户端事件

在本文中&#xff0c;我将重点介绍ADF Faces Javascript API方法以从客户端触发自定义事件。 例如&#xff1a; function cliListener(actionEvent) {AdfCustomEvent.queue(actionEvent.getSource(), "servListener",null, true);}我们可以使用af&#xff1a;client…

react-native页面间传递数据的几种方式

1. 利用react-native 事件DeviceEventEmitter 监听广播 应用场景&#xff1a; - 表单提交页面&#xff0c; A页面跳转到B页面选人&#xff0c; 然后返回A页面&#xff0c; 需要将B页面选择的数据传回A页面。 - 多个多媒体来回切换播放&#xff0c;暂停后二次继续播放等问题。…