uView JS网络请求

便捷工具:

  • toast(title, duration = 1500)
    title toast的消息内容
    duration toast出现到消失的时间,单位ms,默认1500ms
this.$u.toast('Hello uView!');
  • os()
    此属性用于返回平台的名称,为小写的ios或android
console.log(this.$u.os());
  • sys()
    此属性用于获取设备的信息,相当于uni.getSystemInfoSync()的效果
console.log(this.$u.sys());

网络https://v1.uviewui.com/js/http.html

HTTP请求:

  • 基本使用:
    get | post | put | delete(url, params, header).then(res => {}).catch(res => {})
  • url 请求的URL,可以完整的URL(http开头),或者是路径的一部分,这时会自动拼接上baseUrl(一般为api的域名部分)
  • params 请求的参数,对象形式,如"{name: ‘lisa’, age: 23}",该参数是可选的
  • header 请求的header,对象形式,如果token等字段,建议通过配置写入,该参数是可选的

get和post都挂载在 u 对 象 下 , 其 中 g e t 和 p o s t 使 用 方 法 完 全 一 致 , 只 是 一 个 为 t h i s . u对象下,其中get和post使用方法完全一致,只是一个为this. ugetpost使this.u.get,一个为this.$u.post,使用如下:

一般来说,只在then中接收返回值即可,catch无特殊情况,无需编写和理会,因为如果服务端返回的不是200状态,插件内部会弹出model提示

<template>
    <view> </view>
</template>

<script>
export default {
  data(){
    return {

    }
  },
  onLoad(){
      this.$u.post('http://www.example.com',{id: 'xxx',name;'xxx'}).then(res=>{
          console.log(res)
      });
      this.$u.get('http://www.example.com',{},{
          token: 'xxx'
      }).then(res=>{
          console.log(res)
      });
  }
}
</script>

配置:

提示
uView在1.1.0版本后,建议将拦截器内容部分,写入到独立的外部JS文件中,而不是写在App.vue中,这样有更好的可读性,可维护性。
uView已经为用户考虑好了所有的情况,并详细指导您如何在外部JS中引用vuex变量以及Vue的this实例等。
建议在根目录下新建/common/http.interceptor.js文件,也即创建common目录(如果没有的话),再创建http.interceptor.js文件,将拦截器相关代码写在里面。

具体写法,建议在写在/common/http.interceptor.js(如无此文件夹和文件,请手动创建,一次配置,全局通用),写完之后,请在根目录的main.js 的new Vue()和app. m o u n t ( ) 之 间 引 入 此 文 件 , 在 n e w V u e ( ) 后 面 的 原 因 是 , 外 部 J S 文 件 需 要 引 用 v u e 的 实 例 , 也 即 t h i s 对 象 , 要 等 m a i n . j s 中 通 过 n e w 创 建 了 实 例 之 后 才 能 引 用 。 在 a p p . mount()之间引入此文件,在new Vue()后面的原因是,外部JS文件需要引用vue的实例,也即this对象,要等main.js中通过new创建了实例之后才能引用。 在app. mount()newVue()JSvuethismain.jsnewapp.mount()之前的原因是,在Vue挂载this实例(也即初始化App.vue)之前配置请求信息,所以在App.vue中也能正常发出请求。
main.js:

import Vue from 'vue';
import App from './App';
// 此为main.js本身已有内容
const app = new Vue({
    ...App
});

// http拦截器,此为需要加入的内容,如果不是写在common目录,请自行修改引入路径
import httpInterceptor from '@/common/http.interceptor.js';
// 这里需要写在最后,是为了等Vue创建对象完成,引入"app"对象(也即页面的"this"实例)
Vue.use(httpInterceptor, app);

app.$mount();

export default app;

http.interceptor.js:

// 这里的Vue为Vue对象(非创建出来的实例),vm为main.js中"Vue.use(httpInterceptor, app)"这一句的第二个参数,
// 为一个Vue的实例,也即每个页面的"this"
// 如果需要了解这个install方法是什么,请移步:https://uviewui.com/components/vueUse.html
const install = (Vue, vm) => {
    Vue.prototype.$u.http.setConfig = {
        baseUrl: '', // 请求的本域名
        method: 'POST',
        // 设置为json,返回后会对数据进行一次JSON.parse()
        dataType: 'json',
        showLoading: true, // 是否显示请求中的loading
        loadingText: '请求中...', // 请求loading中的文字提示
        loadingTime: 800, // 在此时间内,请求还没回来的话,就显示加载中动画,单位ms
        originalData: false, // 是否在拦截器中返回服务端的原始数据
        loadingMask: true, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透
        // 配置请求头信息
        header: {
            'content-type': 'application/json;charset=UTF-8'
        }
    };

    // 请求拦截,配置Token等参数
    Vue.prototype.$u.http.interceptor.request = config => {
        // 引用token
        // 方式一,存放在vuex的token,假设使用了uView封装的vuex方式
        // 见:https://uviewui.com/components/globalVariable.html
        // config.header.token = vm.token;

        // 方式二,如果没有使用uView封装的vuex方法,那么需要使用$store.state获取
        // config.header.token = vm.$store.state.token;

        // 方式三,如果token放在了globalData,通过getApp().globalData获取
        // config.header.token = getApp().globalData.username;

        // 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的
        // 所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值
        // const token = uni.getStorageSync('token');
        // config.header.token = token;
        config.header.Token = 'xxxxxx';

        // 可以对某个url进行特别处理,此url参数为this.$u.get(url)中的url值
        if (config.url == '/user/login') config.header.noToken = true;
        // 最后需要将config进行return
        return config;
        // 如果return一个false值,则会取消本次请求
        // if(config.url == '/user/rest') return false; // 取消某次请求
    };

    // 响应拦截,判断状态码是否通过
    Vue.prototype.$u.http.interceptor.response = res => {
        if (res.code == 200) {
            // res为服务端返回值,可能有code,result等字段
            // 这里对res.result进行返回,将会在this.$u.post(url).then(res => {})的then回调中的res的到
            // 如果配置了originalData为true,请留意这里的返回值
            return res.result;
        } else if (res.code == 201) {
            // 假设201为token失效,这里跳转登录
            vm.$u.toast('验证失败,请重新登录');
            setTimeout(() => {
                // 此为uView的方法,详见路由相关文档
                vm.$u.route('/pages/user/login');
            }, 1500);
            return false;
        } else {
            // 如果返回false,则会调用Promise的reject回调,
            // 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中,res为服务端的返回值
            return false;
        }
    };
};

export default { install };

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值