zoukankan      html  css  js  c++  java
  • uniapp的uni.request()请求封装

    第一种:常见的直接发起uni.request()请求

            onLoad() {//页面加载时调用
                this.getSwipers()
            },
            methods: {
                //获取轮播图数据
                getSwipers(){
                    uni.request({
                        url:"https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata",
                        method:"GET",
                        success: (res) => {
                            console.log(res)
                            if(res.data.meta.status !== 200){//如果请求失败,不等于200状态码
                                return uni.showToast({
                                    title:"请求失败!"
                                })
                            }
                            //数据请求成功
                            this.swipers = res.data.message
                        }
                    })
                }
            }
    

      

     第二种:async修饰函数和await的使用,这个好像是es7的

            onLoad() {//页面加载时调用
                this.getSwipers()
            },
            methods: {
                //获取轮播图数据
                async getSwipers(){
                    const res = await uni.request({
                        url:"https://api-hmugo-web.itheima.net/api/public/v1/home/swiperdata",
                        method:"GET" //默认是GET,可省
                    })
                    console.log(res)
                }
            }
    

      

    第三种:es6异步promise封装这种发起请求接口,跟axios封装差不多

    一个项目有N多个接口,但前面的一段url基本是一致不变的(专业点说也就是前面那一段是域名,域名是不变的+后面一段是变化的,是接口地址)。

    这时候我们就可以抽离封装了api了。

     

    api.js
    //功能:暴露接口
    
    const BASE_URL = 'https://api-hmugo-web.itheima.net' //域名或选取所有接口不变的那一部分
    export const myRequest = (options) => { //暴露一个function:myRequest,使用options接收页面传过来的参数
            return new Promise((resolve, reject) => { //异步封装接口,使用Promise处理异步请求
                uni.request({ //发送请求
                    url: BASE_URL + options.url, //接收请求的API
                    method: options.method || 'GET', //接收请求的方式,如果不传默认为GET
                    data: options.data || {}, //接收请求的data,不传默认为空
                    success: (res) => { //数据获取成功
                        if (res.data.meta.status !== 200) { //因为200是返回成功的状态码,如果不等于200,则代表获取失败,
                            return uni.showToast({
                                title: "数据获取失败!"
                            })
                        }
                        resolve(res) //成功,将数据返回
                    },
                    fail: (err) => { //失败操作
                        uni.showToast({
                            title: "请求接口失败!"
                        })
                        reject(err)
                    }
                })
            })
        }
    
    /*下面代码不作用途:仅参照演示,模仿页面调用函数,将实参传进myRequest,也就是上面myRequest使用(options)接收。
    myRequest({
        url: '/getInfo',
        method: 'POST',
    })
    */

    在uni-app的main.js中将api.js挂载到全局,让所有页面都能接收

    import { myRequest } from './utils/api.js'
    
    //挂载到全局,让所有页面都能接收
    Vue.prototype.$myRequest = myRequest //挂载到Vue的原型上
    

      页面调用(index.vue想使用):

            data() {
                return {
                    swipers: []
                }
            },
            onLoad() { //页面加载时调用
                this.getSwipers()
            },
            methods: {
                //获取轮播图数据
                async getSwipers() {
                    const res = await this.$myRequest({//调用封装好的API请求函数
                        url:'/api/public/v1/home/swiperdata',//把接口传过去
                        method:'GET',
                    })
                    console.log(res)
                    this.swipers = res.data.message //保存值
                }
            }
    

      



    作者:似朝朝我心
    链接:https://www.jianshu.com/p/8276ca362e5c
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     

    uni-app封装一个request请求  案例二

    在上一篇文章里面,写到使用uni.request请求的方法
    https://www.jianshu.com/p/bc62c9e1beed

    getList() {         
                    uni.request({
                        url: "https://unidemo.dcloud.net.cn/api/news",                  
                        method: 'get',
                        dataType: 'json',
                        success: (res) => {
                            console.log(res.data);
                            this.productList = res.data;
                        },                  
                    });
                },
    

      

    但是实际做项目的时候,会发现每个界面都要重复的写这些,看起来重复又啰嗦,心情就十分的不美丽了。

    如果不封装那么我们会面临几个不方便的地方:

    那么,该怎么使用uni-app封装一个request请求?步骤很简单,且听我一一道来。

    注意:使用的例子,来自于这篇文章的相关的代码,修改封装请求是基于这个文章里面代码。进行相关的修改的。
    https://www.jianshu.com/p/bc62c9e1beed

    步骤如下:

    1、项目下新建common文件夹,再创建request.js文件

    2、打开request.js文件,开始写封装的代码

    思路很简单

    定义域名:baseUrl;
    定义方法:api;
    通过promise异步请求,最后导出方法。

    request.js参考代码如下

    const baseUrl = 'https://unidemo.dcloud.net.cn'   
    const request = (url = '', date = {}, type = 'GET', header = {
    }) => {
        return new Promise((resolve, reject) => {
            uni.request({
                method: type,
                url: baseUrl + url,
                data: date,
                header: header,
                dataType: 'json',         
            }).then((response) => {
                setTimeout(function() {
                    uni.hideLoading();
                }, 200);
                let [error, res] = response;        
                resolve(res.data);
            }).catch(error => {
                let [err, res] = error;
                reject(err)
            })
        });
    }
    export default request
    

      

    3、在main.js全局注册
    import request from 'common/request.js'
    Vue.prototype.$request = request
    

      

    4、页面调用
    this.$request('/api/news', {
    // 传参参数名:参数值,如果没有,就不需要传
    }).then(res => {
    // 打印调用成功回调
    console.log(res)
    })
    

      页面调用的index.vue

    <template>
        <view>
            <uni-list v-for="(item,index) in productList" :key="index">
                <uni-list-item :title="item.author_name" :note="item.title"></uni-list-item>
            </uni-list>
    
        </view>
    </template>
    <script>
        import uniList from "@/components/uni-list/uni-list.vue"
        import uniListItem from "@/components/uni-list-item/uni-list-item.vue"
        export default {
            components: {
                uniList,
                uniListItem
            },
            data() {
                return {
                    productList: [],
                };
            },
            onLoad() {
                this.getList();
            },
            methods: {
                getList() {
                    this.$request('/api/news', {
                        // 传参参数名:参数值,如果没有,就不需要传
                        // "username": "john",
                        // "key": this.searchValue
                    }).then(res => {
                        // 打印调用成功回调
                        console.log(res)
                        this.productList = res;
                    })
                },
            }
        }
    </script>
    <style>
    </style>
    

      

  • 相关阅读:
    高性能JS载入脚本并执行
    JavaScriptDOM高级程序设计myLogger.js
    (旧文重贴)看看这两段代码有什么不同?
    (旧文重贴)原来进行Authorization:basic的时候,后面的credentials就是
    (旧文重贴)终于把ServerAppUnaviable的问题搞定了。
    (旧文重贴)花了一个小时时间,给项目组作了一个汉字到拼音的转换
    (旧文重贴)昨晚和谢晓讨论了一下多组件服务器验证的问题
    大家好!我是浪潮通软的鞠强,初来贵地,请多多指教!
    (旧文重贴)vs.net的asp.net程序无法在winserver2003上打开,终于搞定了,郁闷ing。。。
    (旧文重贴)SQLDMO好像只能在打有sp3的sql2000上用?
  • 原文地址:https://www.cnblogs.com/yszr/p/15711646.html
Copyright © 2011-2022 走看看