• 原生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;
    看的故事多了,才慢慢知道,话说多了就是打自己的脸!
  • 相关阅读:
    C++ 4种强制类型转换
    HTTP与HTTPS异同/HTTP1.0与HTTP1.1差别
    大数据处理-Trie树
    Linux进程状态转换图
    纯css实现背景图片半透明内容不透明的方法-opacity属性正确使用
    由vue理解passive修饰符引起的思考
    Vue+VSCode开发环境配置备忘(代码格式设置)
    哎呦喂web 前端三日老师 《精通Flex布局》
    flex实战之移动页面确定按钮置底布局
    Poptip插件拖动造成IOS下与同页面下mescroll.js也被拖动的解决,即对e.preventDefault();的理解
  • 原文地址:https://www.cnblogs.com/alex-415/p/7839966.html
Copyright © 2020-2023  润新知