目录

get请求无法解析特殊字符的问题

get请求无法解析特殊字符的问题

get请求无法解析特殊字符的问题

使用的axios,vue环境,发现参数带有特殊字符的时候,接口报错,这是因为无法解释的原因,比如带有[]/&.等等,身为前端我们应该怎么做呢?

  1. 最直接有效的是让后端把接口get方式改成post请求,在body体内,便不会出现这样的问题。(当然后端是后端愿意的情况下)
  2. 使用get的params,但是这个也不能保证一定不出错,因为博主就是发现参数带有[这样的字符]报错了
  3. 手动解析get参数

正常写法

import request from '@/utils/request';//全局请求拦截器

export function getMetaCatalog(params) {//汇交目录
    return request({
        url: '/metadata/basin/getMetaCatalog',
        method: 'get',
        params: params
    })

}

改造成这样,发现可以用,很开心,但是,本项目get都是之前的写法,并且接口很多了,如果都去改成这样需要大量时间和人力成本,而且很麻烦,我就不想每个接口都去改造一遍,于是,就可以如4这样做

export function getMetaCatalog(params) {//汇交目录
    const searchParams = new URLSearchParams(); 
    Object.entries(params).forEach(([key, value]) => {
        if (value !== null && value !== undefined) {
            searchParams.append(key, value);
        }
    });
    return request({
        url: `/apply/basin/getMetaApply?${searchParams.toString()}`,
        method: 'get',
    });
}
  1. 在请求拦截器统一改造,既不用动源代码又能保证每个使用此文件的都可以改造到

request.js 根据自己的文件来

import axios from 'axios'
// 创建axios实例
const service = axios.create({
        // axios中请求配置有baseURL选项,表示请求URL公共部分
        baseURL: process.env.VUE_APP_BASE_API,
        // 超时
        timeout: 1000000,

    })
    //request拦截器
service.interceptors.request.use(config => {
    if (config.method === 'get' && config.params) {//判断params因为本博主之前是params传参,params是一个对象,所以有键值对
        const searchParams = new URLSearchParams();
        Object.entries(config.params).forEach(([key, value]) => {
          if (value !== null && value !== undefined) {
            searchParams.append(key, value);
          }
        });

        const queryString = searchParams.toString();
        if (queryString) {
          config.url += (config.url.includes('?') ? '&' : '?') + queryString;
        }
        // 清除原来的 params,避免重复
        config.params = {};
      }
   //其他逻辑按照自己的来
    return config
}, error => {
        Promise.reject(error)


})

// 响应拦截器
service.interceptors.response.use(res => {
      //自己的逻辑,跟请求拦截器无关
 })

export default service

如果是新写的项目,不妨参照我现在的写法,之前已经有自己的传参形式,可以看看怎么改造比较方便