手把手带你使用 typescript 实现一个 axios 库(二)url 参数处理
栏目: JavaScript · 发布时间: 5年前
内容简介:主要内容:对 get 请求参数的处理看下面这个请求系列一实现了
主要内容:对 get 请求参数的处理
需求分析
看下面这个请求
axios({ method: 'get', url: '/base/get', params: { a: 1, b: 2 } }) 复制代码
系列一实现了 axios
的基本请求,但是如果你细心会发现还存在问题,就是我们的请求 url
其实是不全的。具体看下图
图片占位
可以看到我们并没有将 params
的参数拼接到 url
尾部,so 我们这一节要做的事情就是完善 url。
在 axios
中参数 params
可以有多重,如下所示
// 为数组 axios({ method: 'get', url: '/base/get', params: { foo: ['aaa', 'bbb'] } }) // url: /base/get?foo[]=aaa&foo[]=bbb // 为对象 axios({ method: 'get', url: '/base/get', params: { foo: { bar: 'baz' } } }) // url: /base/get?foo=%7B%22bar%22:%22baz%22%7D, foo 后面拼接的是 {"bar":"baz"} encode 后的结果 // 为日期 const date = new Date() axios({ method: 'get', url: '/base/get', params: { date } }) // url: /base/get?date=2019-04-01T05:55:39.030Z, date 后面拼接的是 date.toISOString() 的结果 // 特殊字符等。字符:@ : $ , [ ] 是允许出现在url参数中的 axios({ method: 'get', url: '/base/get', params: { foo: '@:$, ' } }) // url: /base/get?foo=@:$+, 注意,我们会把空格 转换成 + 复制代码
此章节只展示 params
为 数组
时的实现,其余的可以自己对照源码进行查看
思路分析
先看下列请求,接下来的代码都是以这个请求为例进行说明。
axios({ method: 'get', url: '/base/get', params: { foo: ['aaa', 'bbb'] } }) 复制代码
我们最终要的结果为 /base/get?foo[]=aaa&foo[]=bbb
,大体实现步骤为以下几步。
- 1、1、创建一个数组,用于存放键值对,其最终结构为[ 'foo[]=aaa', 'foo[]=bbb' ]
- 2、循环params,获取其键值对进行操作
- 3、创建一个临时数组,用于存放处理好的params,结构为[ 'aaa', 'bbb' ]
- 4、4、循环添加,以key=value的形式,
- 5、字符串拼接
实现
接下来我们来看具体实现
demo.js
let url = '/base/get' let params = { foo: ['aaa', 'bbb'] } // 1、创建一个数组,用于存放键值对,其最终结构为[ 'foo[]=aaa', 'foo[]=bbb' ] const parts = [] // 2、循环params,获取其键值对进行操作 Object.keys(params).forEach(key => { let val = params[key] // val: ['aaa', 'bbb'] xiaofeng, key:foo too // 3、创建一个临时数组,用于存放处理好的params,结构为[ 'aaa', 'bbb' ] let values = [] if (Array.isArray(val)) { values = val key += '[]' } else { values = [val] } // 4、循环添加,以key=value的形式, values.forEach(item => { parts.push(`${key}=${item}`) }) // parts: [ 'foo[]=aaa', 'foo[]=bbb' ] }) let serializedParams = parts.join('&') // 5、字符串拼接 url += `${url}?${serializedParams}` console.log(url) // 输出:/base/get/base/get?foo[]=aaa&foo[]=bbb 复制代码
这里用原生 js 粗略的实现了这个功能。
接下来我们用 typescript
来进行改写
buildURL 函数实现
遵循模块化的思想,我们也将这个功能拆分出来,成为一个单独的模块。 src
下新建一个 helpers
目录用于存放 工具 函数和辅助方法,在这个目录下新建一个 url.ts
文件用于存放 url
相关的工具函数。
根据上面的代码,你不难写出如下代码
export function buildURL(url: string, params?: any): string { if (!params) { return url } // 这里的写法可以参考typescript文档https://www.tslang.cn/docs/handbook/basic-types.html const parts: string[] = [] Object.keys(params).forEach(key => { const val = params[key] if (val === null || typeof val === 'undefined') { return } let values = [] if (Array.isArray(val)) { values = val key += '[]' } else { values = [val] } values.forEach(item => { // parts.push(`${key}=${item}`) }) }) let serializedParams = parts.join('&') url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams return url } 复制代码
此时我们就用 typescript 实现了对 url
参数为数组时的处理,不过我们这里还有很多需要完善的地方,接下来我带领你一步一步的去完善,修改它。
为完待续...
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Python 中如何实现参数化测试?
- Java内部DNS查询实现和参数设置
- SpringBoot实现动态控制定时任务-支持多参数
- SpringBoot实现通用的接口参数校验,注解实战
- 挖洞经验 | 篡改密码重置的加密参数实现账号劫持
- [译] ES6:理解参数默认值的实现细节
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
未来世界的幸存者
阮一峰 / 人民邮电出版社 / 2018-6-1 / 39.00 元
本书为阮一峰博客文集,主要收录的是作者对技术变革的影响的一些思考,希望能够藉此书让读者意识到世界正在剧烈变化,洪水就在不远处,从而早早准备出路。本书适合所有乐于思考的读者。一起来看看 《未来世界的幸存者》 这本书的介绍吧!