原生http请求封装
满血复活,今天开始开始更新博客。
随着es6的普遍应用,promise属性也随之用之普遍,我们在一些项目中,为了避免引入一些http库,节省空间,就简单将原生http请求做了封装处理,封装代码如下:
(其中应用到了fetch,不懂得同学可以去mdn了解一下)
import http from './http';
let Http = {
/**
* @example
* ```js
* Http.get('http://xxx.com/some_api', {
* headers: 'Instance of Header',
* mode: '请求模式 cors、 no-cors 或者 same-origin',
* })```
*
* @param {String} url
* @param {Object} opt
*/
get(url, opt) {
opt = opt || {};
opt.method = 'GET';
return fetch(url, opt);
},
/**
*
* @example
* ```js
* Http.post('http://xxx.com/some_api', {
* headers: 'Instance of Header',
* mode: '请求模式 cors、 no-cors 或者 same-origin',
* body: '字符串 查询字符串 FormData实例 Blob 或者 BufferSource(2进制数组)'
* })```
* @param {String} url
* @param {String | URLSearchParams | FormData | Blob | ArrayBuffer} data
* @param {Object} opt
*/
post(url, data, opt) {
opt = opt || {};
opt.method = 'POST';
let param;
if (data instanceof FormData || data instanceof URLSearchParams || typeof(data) === 'string') {
param = data;
} else {
param = new URLSearchParams();
for (let k in data) {
param.append(k, data[k]);
}
}
opt.body = param;
return fetch(url, opt);
},
/**
* @example
* ```js
* Http.upload('http://xxx.com/some_api', {
* progress: (loaded, total)=>{
* console.log(loaded, total);
* }
* })```
*
*
* @param {String} url
* @param {FormData | Blob | ArrayBuffer} data
* @param {Object} opt
*/
upload(url, data, opt) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('POST', url, true);
xhr.onprogress = opt.progress;
xhr.onerror = reject;
xhr.timeout = reject;
xhr.onload = function(evt) {
resolve({ body: evt.target.response, ok: evt.target.status >= 200 && evt.target.status < 300 });
};
xhr.send(data);
});
},
/**
* @example
* ```js
* Http.download('http://xxx.com/some_api', {
* type: 'arraybuffer',
* progress: (loaded, total)=>{
* console.log(loaded, total);
* }
* })```
*
*
* @param {String} url
* @param {Object} opt
*/
download(url, opt) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = opt.type || '';
xhr.onprogress = opt.progress;
xhr.onerror = reject;
xhr.timeout = reject;
xhr.onload = function(evt) {
resolve({ body: evt.target.response, ok: evt.target.status >= 200 && evt.target.status < 300 });
};
xhr.send(null);
});
}
};
export default Http;
原生http请求封装的更多相关文章
- 原生AJAX请求教程
ajax 即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用.本质是在 HTTP 协议的基础上以异步的方式与服务器进行通信. 异 ...
- 原生 ajax 请求
ajax 即 Asynchronous Javascript And XML,AJAX 不是一门的新的语言,而是对现有持术的综合利用.本质是在 HTTP 协议的基础上以异步的方式与服务器进行通信. 异 ...
- iOS开发——post异步网络请求封装
IOS中有许多网络请求的函数,同步的,异步的,通过delegate异步回调的. 在做一个项目的时候,上网看了很多别人的例子,发现都没有一个简单的,方便的异步请求的封装例子.我这里要给出的封装代码,是异 ...
- 原生ajax与封装的ajax使用方法
当我们不会写后端接口来测试ajax时,我们可以使用node环境创建一个本地服务器. 1.创建一个本地服务器可参考http://www.cnblogs.com/heyujun-/p/6793900.ht ...
- drf复习(一)--原生djangoCBV请求生命周期源码分析、drf自定义配置文件、drf请求生命周期dispatch源码分析
admin后台注册model 一.原生djangoCBV请求生命周期源码分析 原生view的源码路径(django/views/generic/base.py) 1.从urls.py中as_view ...
- Flutter 实际开发常用工具类(全局提示,请求封装,token缓存,验证码倒计时、常用窗帘动画及布局)
介绍: 一星期从入门到实际开发经验分享及总结 代码传送门github Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面.未来App开发 ...
- 基于 fetch 的请求封装
原生 fetch 请求失败后(如无网络)状态会变成 reject 走 .catch .绝大多数情况下业务场景只需要给个 toast 等简单处理.每个请求都 .catch 会显得格外繁琐,并且如果不 . ...
- flutter dio网络请求封装实现
flutter dio网络请求封装实现 文章友情链接: https://juejin.im/post/6844904098643312648 在Flutter项目中使用网络请求的方式大致可分为两种 ...
- WebApi系列~基于单请求封装多请求的设计
回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...
随机推荐
- Python中的SQLAlchemy
在Python中,使用SQLAlchemy可以对数据库进行操作. SQLAlchemy是Python中的一个标准库. 要使用SQLAlchemy,首先要创建连接: url = mysql+pymysq ...
- Visual Studio 2017 Key 激活码
Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS201 ...
- RPC原理解析
1.RPC原理解析 1.1 什么是RPC RPC(Remote Procedure Call Protocol) --远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络 ...
- 关于如何在mac系统上安装Git并在码市上建立项目
对Git一窍不通,为了在mac系统上安装Git,查了很多资料,走了很多弯路,一切搞定后发现其实很简单. 1.在https://brew.sh上按要求安装Homebrew. 2.在电脑终端键入brew ...
- [W班]第二次结对作业成绩评价
作业地址: https://edu.cnblogs.com/campus/fzu/FZUSoftwareEngineering1715W/homework/1016 作业要求: 1.代码具有规范性. ...
- 数据结构基础——指针及动态内存分配(malloc)
一.指针 C语言中的指针是一种数据类型,比如说我们用int *a;就定义了一个指针a,它指向一个int类型的数.但是这个指针是未初始化的,所以,一般的,我们都在创建指针时初始化它,以免出错,在还不吃的 ...
- Flask 页面缓存逻辑,jinja2 过滤器,测试器
回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...
- Node入门教程(4)第三章:第一个 Nodejs 程序
第一个 Nodejs 程序 本教程仅适合您已经有一定的JS编程的基础或者是后端语言开发的基础.如果您是零基础,建议您先学一下老马的前端免费视频教程 第一步:创建项目文件夹 首先创建 demos 文件夹 ...
- JAVA_SE基础——6.标识符&关键字
学会写helloworld之后, 我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...
- ajax和jquery使用技巧
1.使用ajax的方法的时候可以使用u方法来获取连接,这样更加安全:alert弹窗的时候需要单引号双引号火狐浏览器会报错!