axios实现跨域及突破host和referer的限制

本文详细介绍了如何在Vue项目中配置跨域请求,以QQ音乐API为例,展示了vue.config.js的代理设置及axios的GET请求使用,适用于前后端分离项目的跨域问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跨域请求设置

以qq音乐为例

  1. 配置vue.config.js
   devServer: {
    proxy: { // 代理跨域
      '/api': { // 代理url关键字
        target: 'https://c.y.qq.com', // 需要代理的地址
        secure: false, // 如果是https接口,需要配置这个参数
        changeOrigin: true, // 是否跨域
        pathRewrite: {
          '^/api': ''
        }
      },
      '/pc': { // 代理url关键字
        target: 'https://u.y.qq.com', // 需要代理的地址
        secure: false, // 如果是https接口,需要配置这个参数
        changeOrigin: true, // 是否跨域
        pathRewrite: {
          '^/pc': ''
        },
        // 突破host和origin的限制
        headers: {
          referer: 'https://y.qq.com/',
          origin: 'https://y.qq.com'
        }
      }
}
  1. ajax请求
import axios from 'axios'
// 获取轮播图数据
export function banner () {
  return axios({
    method: 'get',
    url: '/api/musichall/fcgi-bin/fcg_yqqhomepagerecommend.fcg',
    params: {
      // 参数
    }
  })
}
// 获取歌曲列表
export function songList () {
  const url = '/pc/cgi-bin/musicu.fcg'
  const data = Object.assign({}, commonParams, {
    loginUin: 0,
    hostUin: 0,
    platform: 'yqq.json',
    needNewCode: 0,
    data: JSON.stringify({
      'comm': { 'ct': 24 },
      'playlist': {
        'method': 'get_playlist_by_category',
        'param': {
          'id': 3317,
          'curPage': 1,
          'size': 40,
          'order': 5,
          'titleid': 3317
        },
        'module': 'playlist.PlayListPlazaServer'
      }
    }),
    ...commonParams
  })
  return axios({
    method: 'get',
    url: url,
    params: data
  })
}

注意请求的路径后面跟的参数一定要用params传递

  1. 在需要的组件内调用
import { banner, songList } from '../../api/store'
export default {
  data () {
    return {
      bannerList: [],
      songList: []
    }
  },
  created () {
    this.getBanner()
    this.getSongList()
  },
  methods: {
    getBanner () {
      banner().then(res => {
        if (res.status === 200) {
          this.bannerList = res.data.data.slider
        }
      })
    },
    getSongList () {
      songList().then(res => {
        if (res.status === 200) {
          this.songList = res
        }
      })
    }
  }
}
<think>好的,我现在要解决用户提到的Axios发送POST请求时表单数据无法在表格中接收的问题,以及处理Excel或表格数据的收发问题。首先,我需要理清用户的问题场景。用户可能在使用Vue3项目,通过Axios发送请求,但后端没有正确接收数据,导致表格数据无法显示。此外,用户提到后端控制器没有处理生产环境的前缀,需要通过Nginx转发去掉前缀,这可能涉及到代理配置的问题。 首先,检查Axios的请求配置是否正确。用户的项目中Axios请求带有"/production"前缀,而后端没有这个前缀,所以Nginx需要去掉这个前缀。这可能意味着请求的URL路径不正确,导致404错误或者请求未到达正确的后端接口。需要确认Nginx的配置是否正确,例如: ``` location /production { proxy_pass http://backend_server/; rewrite ^/production/(.*) /$1 break; } ``` 这样配置后,所有以/production开头的请求都会被转发到后端,并且去掉该前缀。如果Nginx配置有误,请求路径可能不正确,导致后端无法接收到请求,自然无法返回数据。 接下来,关于Axios发送表单数据的问题。用户可能使用了默认的JSON格式发送数据,而后端期望的是表单编码格式(application/x-www-form-urlencoded)。这时需要使用URLSearchParams或者Qs库将数据转换为表单格式,并设置正确的Content-Type头。例如: ```javascript const formData = new URLSearchParams(); formData.append('key', 'value'); axios.post('/api/endpoint', formData, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); ``` 如果发送的是FormData对象(如文件上传),需要确保正确构建FormData,并且浏览器会自动设置Content-Type为multipart/form-data,此时后端需要支持该格式的解析。如果Content-Type设置不正确,后端可能无法解析数据,导致请求体为空。 另外,问题(CORS)也可能导致请求失败,后端需要设置正确的响应头,如Access-Control-Allow-Origin。但用户的问题可能更偏向于数据格式或路径问题,因为已经提到Nginx代理,可能问题已经处理过。 在处理Excel或表格数据时,前端可能需要发送文件或接收二进制数据。例如,上传Excel文件需要使用FormData: ```javascript const formData = new FormData(); formData.append('file', file); axios.post('/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); ``` 接收Excel文件时,需要设置responseType为'blob',以便正确处理二进制流: ```javascript axios.get('/api/download', { responseType: 'blob' }) .then(response => { const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'file.xlsx'); document.body.appendChild(link); link.click(); }); ``` 如果后端返回的数据格式不正确,或者前端没有正确处理响应数据,可能导致表格无法渲染。例如,后端应返回JSON格式的表格数据,而实际返回了其他格式,或者数据结构不符合前端预期。 总结问题可能的原因: 1. Nginx代理配置不正确,导致请求路径错误,无法到达后端。 2. 数据格式不正确,如未使用表单编码或FormData,后端无法解析。 3. 响应数据处理错误,如Excel文件未正确接收或解析。 4. 问题,但可能性较低,因为已使用Nginx代理。 需要用户提供更多信息,例如具体的请求代码、Nginx配置片段、后端的接口定义,以及浏览器网络请求的详细信息(如请求头、响应状态码等),以便进一步诊断问题。</think>### 解决Axios请求中表格/Excel数据传输问题的分步指南 #### 一、检查Nginx代理配置(关键前置条件) 由于您的Axios请求带有`/production`前缀,而后端接口没有该前缀,需在Nginx中配置路径重写: ```nginx location /production { proxy_pass http://backend_server/; # 替换为实际后端地址 rewrite ^/production/(.*) /$1 break; # 去掉前缀 } ``` 验证请求是否被正确转发: - 浏览器开发者工具查看网络请求的**实际URL** - 确保请求头中的`Host``Referer`符合预期[^1] #### 二、表单数据发送问题(POST) *场景:发送`application/x-www-form-urlencoded`格式数据* 1. **正确编码数据** ```javascript import qs from 'qs'; // 使用axios自带序列化则无需手动引入 axios.post('/production/api/submit', qs.stringify({ id: 123, name: "表格数据" }), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) ``` 2. **验证后端接收** - 使用Postman发送相同格式请求 - 检查后端日志是否收到`request body` #### 三、表格文件上传(Excel等二进制文件) *场景:上传Excel文件到服务器* 1. **前端代码示例** ```javascript const fileInput = document.querySelector('input[type="file"]'); const formData = new FormData(); formData.append('excel', fileInput.files[0]); axios.post('/production/api/upload', formData, { headers: { 'Content-Type': 'multipart/form-data' // 浏览器会自动设置 } }) ``` 2. **后端处理建议(Spring Boot示例)** ```java @PostMapping("/api/upload") public ResponseEntity<?> handleUpload(@RequestParam("excel") MultipartFile file) { // 使用Apache POI解析Excel } ``` #### 四、接收表格数据问题 *场景:获取后端返回的表格数据无法渲染* 1. **JSON数据格式验证** ```javascript axios.get('/production/api/data') .then(response => { console.log(response.data); // 检查数据结构是否包含如rows/total等关键字段 }) ``` 2. **Excel文件下载** ```javascript axios.get('/production/api/export', { responseType: 'blob' // 必须指定响应类型 }).then(response => { const url = window.URL.createObjectURL(new Blob([response.data])); const a = document.createElement('a'); a.href = url; a.download = 'report.xlsx'; a.click(); }) ``` #### 五、常见问题排查表 | 现象 | 可能原因 | 解决方案 | |-------|---------|---------| | 请求404 | Nginx路径未正确重写 | 检查`proxy_pass`末尾是否有`/` | | 数据解析失败 | 未设置正确Content-Type | 使用Postman对比测试 | | 错误 | 代理配置未生效 | 检查响应头是否包含`Access-Control-Allow-Origin` | | 文件损坏 | 未指定responseType | 添加`responseType: 'blob'` |
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值