zoukankan      html  css  js  c++  java
  • vue---封装request.js解决跨域问题【再一次完美解决】

    最近在用VUE开发www.dianphp.com后台管理系统,再次遇到vue使用axios,在进行跨域请求的时候,遇到了一些分装reques.js以及遇到了一些封装问题和跨域问题,但是经过一天的测试最终还是解决了。

    首先是封装的request.js(位置:utils/request.js)代码如下:

    import axios from 'axios'
    import Qs from 'qs'
    
    // 创建一个axios实例
    const service = axios.create({
      baseURL: 'http://www.dianphp.com/',
      transformRequest:[function(data){
        return Qs.stringify(data)
      }],
      timeout: 3000
    });
    
    // 添加请求拦截器
    service.interceptors.request.use(config => {
      // 打开可能会报错 x-token不被允许
      // config.headers['x-token'] = 'x-xxxxxxxxxxxxxxxxxxx';
      return config;
    },error => {
      // 请求错误做些事
      return Promise.reject(error);
    });
    
    // 添加相应拦截器
    service.interceptors.response.use(response => {
      const res = response.data;
      // 如果返回的状态码不是200 就主动报错
      if(res.state != 200){
        return Promise.reject(res.msg || 'error');
      }
      return response;
    },error => {
      // 返回接口的错误信息
      return Promise.reject(error);
    })
    
    export default service

    整理封装api.js(位置:src/api/login.js)

    import request from '@/utils/request'
    
    export function login(data) {
      return request({
        url: 'api/admin/login',
        method: 'post',
        // 跨域报错 可能出现在data上,测试的时候可以先不带data
        // data的处理方式需要放在request.js使用qs处理
        data:{username:'张三'}
      });
      // 可行
      // request({
      //   url:'api/admin/login',
      //   method: 'post'
      // }).then(res => {
      //   console.log(res);
      // });
      // 可行
      // return request.post('api/admin/login');
      // 可行
      // request.post('api/admin/login').then(res => {
      //   console.log(res);
      // });
      // 可行
      // request.get('api/admin/login',{
      //   timeout:2000
      // }).then(res => {
      //   console.log(res);
      // });
    }

    具体使用方式:

    import { login } from '@/api/login'
    login({username:'张三'}).then(res => {
      console.log(res);
    });

    处理跨域问题:

    第一步:VUE前端配置(config/index.js)

    const path = require('path')
    module.exports = {
      dev: {
        // Paths
        assetsSubDirectory: 'static',
        assetsPublicPath: '/',
        proxyTable: {
            '/api': {
                target: 'http://dianphp.fyz.com',
                changeOrigin: true,
                pathRewrite: {
                    '^/api': '/api'
                }
            }
        },

    服务端配置:

    如果发起的请求是 OPTIONS 请求 需要配置路由(thinkphp5)

    return [
      'api/admin/login' => ['api/admin/login/',['method' => 'post|get|options']],
      'api/:controller/:action'=>['api/:controller/:action',['method' => 'post|get|options']],
      'api/'=>'api/index/index',
    ];

    接口配置:

    header('Access-Control-Allow-Origin: *');

    测试:没有问题

     请求头:

    具体代码,还可以在优化,这里只做个示例。

  • 相关阅读:
    General Problem Solving Techniques [Beginner-1]~H
    做HDU1010 带出来一个小问题
    HDU1009
    hdu1007
    hdu 1008
    HDU1006
    hdu 1005
    hdu 1004
    UVA 10970 第一次比赛 D题 (后面才补的)
    LightOJ 1317 第八次比赛 A 题
  • 原文地址:https://www.cnblogs.com/e0yu/p/13418416.html
Copyright © 2011-2022 走看看