IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> axios的get方法中,参数值为null时,参数被删除的问题 -> 正文阅读

[JavaScript知识库]axios的get方法中,参数值为null时,参数被删除的问题

问题描述
vue开发的时候,发现get请求的参数值为null,这个参数会被删除掉,在后端检查这个参数时不存在就会报错。
?

Example:
入力参数: { foo: null, bar: "baz", qux: undefined }
变换后的参数: ?bar=baz

foo被删除了,后台参数检查时发现foo不存在,就会报错

参照
https://github.com/axios/axios/issues/1139

这个问题在axios:release/1.0.0-beta.1中被修改,但是没有反映到稳定版中
https://github.com/axios/axios/pull/1987

解决方案

1.这个问题在release/1.0.0-beta.1据说解决了,但是不敢使用测试版
2.使用qs模块替换axios中有问题参数序列化模块
? axios官网也推荐使用qs来代替原来的模块,原来的模块还有其他问题,比如说嵌套对象也会出问题https://github.com/nodejs/node-v0.x-archive/issues/1665

? https://github.com/axios/axios#config-defaults

? // `paramsSerializer` is an optional function in charge of serializing `params`
? // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
? paramsSerializer: function (params) {
? ? return Qs.stringify(params, {arrayFormat: 'brackets'})
? },

修改方法1
? ? config.paramsSerializer = params => qs.stringify(params, { arrayFormat: 'brackets' })

? Example:
? 入力参数: { foo: null, bar: "baz", qux: undefined }
? 变换后的参数: ?foo=&bar=baz
? 相当于变成了空字符串

修改方法2
? ? config.paramsSerializer = params => qs.stringify(params, { arrayFormat: 'brackets', strictNullHandling: true })

? Example:
? 入力参数: { foo: null, bar: "baz", qux: undefined }
? 变换后的参数: ?foo&bar=baz

// request interceptor
service.interceptors.request.use(
  config => {
    // do something before request is sent
    config.paramsSerializer = params => qs.stringify(params, { arrayFormat: 'brackets', strictNullHandling: true })
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

? 这种方法php或者是cakephp不能很好解析,依然解析成了空字符串,或许是这个问题迟迟不能反映到稳定版中的原因。

Example:
This params object: { foo: null, bar: "baz", qux: undefined }
Becomes this query string: ?foo&bar=baz

? qs官网
? https://github.com/ljharb/qs

3.不使用null,前台用空字符串代替

4.后台使用null参数的时候,作为可选参数,用array_key_exists或isset先判断一下,避免了参数检查错误

5.完全不使用参数检查

6.配合方案2,不使用php的参数解析,自己解析

第一推荐使用方案4
由于现在的php无法正确解析null,要完美解决这个问题,需要用方案4。


第二推荐使用方案2,由于php的参数解析问题,变成了空字符串,依然不完美,并不能正确传送null值,但是这种方案能够确保参数存在,避免了参数检查错误,空字符串与null虽然不一样,但是get方法中的参数一般用于查询,cakephp自动把空字符变成了is null,所以可以不改代码。

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:23:40  更:2022-03-15 22:27:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:48:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码