zoukankan      html  css  js  c++  java
  • nuxt中 使用axios 封装api

    安装axios

    cnpm install axios --save

     在plugins文件夹下面创建request.js

    import axios from "axios";// 创建一个axios实例
    const service = axios.create({
        baseURL:"", // url = base url + request url
        withCredentials: true, // send cookies when cross-domain requests
        timeout: 10000, // request timeout 10s
    });
    
    // 请求拦截器
    service.interceptors.request.use(config => {
        // do something before request is sent
        return config;
    },error => {
        // do something with request error
        console.log(error) // for debug
        return Promise.reject(error);
    });
    
    // 响应拦截器
    service.interceptors.response.use(response => {
        //do something before response
        if (response.status >= 200 && response.status <= 210) {
            return response;
        } else if(response.status == 404){
            console.error(response.data.errmsg);
        }else{
            // 不走
        }
    },
    error => {
        console.log('err' + error); // for debugreturn Promise.reject(error);
    })
    
    export default service;

     创建一个api文件夹 里面创建user.js  假设这里是用户相关的接口

    import request from '@/plugins/request';
    import proxy from '@/utils/proxy';
    
    export function repeatUserName(param){
    //用户名验重  false为不重复  true为重复  测试接口
        return new Promise(resolve=>{
            request({
                url:proxy.lipeng+`/api/1/user/repeat/username?userOrgId=${param.userOrgId}&username=${param.username}`,
                method:"GET",
                params:null
            }).then(res=>{
                if(res.data.code==0){
                    resolve(res.data.data)
                }else{
                    console.error(res.data.message);
                }
            }).catch(err=>{
                console.error(err);
            })
        });
    }

    我这里专门弄了个proxy.js专门来管理代理的,此文件在utils文件夹下放着    utils/proxy.js

    const onlineIP = "http://182.92.xxx.xxx:8xxx"
    
    
    //全局变量
    let lipeng = "";
    if(process.server){
      // 服务端不用走本地代理
      lipeng = process.env.NODE_ENV === "production" ? onlineIP + "/qiantai" : "http://182.92.xxx.xxx:8xxx";
    }
    
    if(process.client){
      //客户端走本地代理
      lipeng = process.env.NODE_ENV === "production" ? onlineIP + "/qiantai" : "/test";
    }
      
    export default {
      lipeng
    }

    另外 设置本地代理 不要按照之前vue单页项目的方式设置了,这里需要额外安装一个插件

    安装@gauseen/nuxt-proxy包依赖

    cnpm install @gauseen/nuxt-proxy --save

    在nuxt.config.js中配置如下:

    modules: [
        "@gauseen/nuxt-proxy"
    ],
    proxyTable:{
      /**
       * 代理
       */
        "/test": {
          target: "http://182.92.xxx.xxx:8001",//测试服务器
          // target: "http://192.168.x.xxx:8008",//xxx
          changeOrigin: true,
          pathRewrite: {
            "^/test": ""
          }
        },
        "/mock": {
          target:'http://39.97.xxx.xxx:8095/mock/21',
          changeOrigin: true,
          pathRewrite: {
            "^/mock": ""
          }
        },
      },

    然后在页面中就可以这样使用了:

    import {repeatUserName} from "~/api/user";
    mounted() {
        repeatUserName({userOrgId:2,username:"xxx"})
     },

    我成功的获取到了数据:

    另外我试试能否在asyncData生命周期中使用!!!

    依然成功!!!!!!!!!!!(终于搞通了!!!!!)

    下面介绍一下 一般的方法:

    如果上面的方法,跑通了,就不需要用下面的方法了,因为上面的方法比较系统

     然后参考文档  这样请求却请求成功了:

    import axios from "axios";
    async asyncData({isDev, route, store, env, params, query, req, res, redirect, error}) {
        let {data:{data:bb}}=await axios(`http://182.92.xxx.xxx:8001/api/1/user/repeat/username?userOrgId=1&username=22`);
        return{
          bb,
        }
      },

    那么有一个疑问,如果我想设置请求响应拦截器该在哪设置呢?

     看来还的使用官方推荐的@nuxt/axios的方式在nuxt项目中做请求,自己封装的axios在nuxt中好像不大好用,拦截器在网上已经找到答案了,后续更新

     安装

    npm install @nuxtjs/axios --save

    安装:

    cnpm install @nuxtjs/proxy --save

    nuxt.config.js中配置

    modules: [
        '@nuxtjs/axios',
        '@nuxtjs/proxy',
     ],
    build: {
        vendor: ['axios'],//防止重复渲染
     },
    axios: {
        proxy: true, // 表示开启代理
        prefix: '', // 表示给请求url加个前缀 /api
        credentials: true // 表示跨域请求时是否需要使用凭证
      },
      proxy: {
        "/test": {
          target: "http://18x.92.xxx.xxx:8001",
          changeOrigin: true,
          pathRewrite: {
            "^/test": ""
          }
        },
     }

    在页面中使用:

    mounted() {
        this.$axios.get(`/test/xxx/1/user/repeat/username?userOrgId=2&username=${encodeURIComponent("刘小兵")}`).then(res=>{
          console.log(res)
        }).catch(err=>{
          console.log(err)
        })
     },

    在asyncData中使用:

    async asyncData({app,isDev, route, store, env, params, query, req, res, redirect, error}) {
        let rep= await app.$axios.get(`/test/xxx/1/user/repeat/username?userOrgId=2&username=${encodeURIComponent("刘小兵")}`);
        return{
          asyncDataText:"假数据",
          message:rep.data.message
        }
     },

    ok!!!

    并发请求:

    let [a,b] = await Promise.all([
          app.$axios.get(`/test/xxx/1/user/repeat/username?userOrgId=2&username=${encodeURIComponent("刘小兵")}`),
          app.$axios.get(`/test/xxx/1/user/repeat/username?userOrgId=2&username=${encodeURIComponent("刘小兵")}`),
        ])
        return{
          asyncDataText:"假数据",
          message1:a.data.message,
          message2:b.data.code,
       }

    ok!!!

  • 相关阅读:
    vue后台管理系统——权限管理模块
    vue后台管理系统——用户管理模块
    vue后台管理系统——主页布局
    vue后台管理系统——登录/退出功能
    vue后台管理系统
    kratos 日志请求响应记录
    composer 版本切换
    Nacos搭建并使用
    go micro 搭建微服务
    consul命令行参数
  • 原文地址:https://www.cnblogs.com/fqh123/p/12952646.html
Copyright © 2011-2022 走看看