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: *');

测试:没有问题

 请求头:

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

原文地址:https://www.cnblogs.com/e0yu/p/13418416.html