【Ts重构Axios】url处理篇

需求分析

首先,我们可能需要使用我们封装的axios去发送一个下面这样的简单请求

axios({
    method: 'get',
    url: '/api/getInfo',
    params: {
        a: 1,
        b: 2
    }
})

最终,我们希望我们发送的请求url是这样的,/api/getInfo?a=1&b=2,这样服务器就可以通过请求的url解析到我们传来的参数了。那么,我们要做的实际上就是把params的key和vaule拼接到url上,当然,params是很负责的,可能会有以下几种情况:

参数为数组

axios({
    method: 'get',
    url: '/api/getiInfo',
    params: {
        foo: ['bar', 'baz']
    }
})

最终请求的url是这样的:/api/getInfo?foo[]=bar&foo[]=baz

参数为对象

axios({
    method: 'get',
    url: '/api/getiInfo',
    params: {
        foo: {
            bar: 'baz'
        }
    }
})

最终请求的url是这样的: /api/getInfo?foo=%7b%22bar:%22baz%2z%7d,foo后面拼接的是{"bar": "baz"}encode后的结果

参数为Date对象

axios({
    method: 'get',
    url: '/api/getiInfo',
    params: {
        date
    }
})

最终请求的url是/api/getInfo?date=2019-04-01T05:55:39.030Z,date后面跟的是date.toISOString()的结果

特殊字符的支持

对于@、:、$、[、]、空格,我们是允许出现在url中的,不希望encode

axios({
    method: 'get',
    url: '/api/getiInfo',
    params: {
        foo: '@:$'
    }
})

最终请求的url是这样的:/api/[email protected]:$+,注意我们会把空格转换成+

空值忽略

对于值为null或者undefined的属性,我们是不会添加到url参数中的。

axios({
    method: 'get',
    url: '/api/getiInfo',
    params: {
        foo: 'bar',
        baz: null
    }
})

最终请求的url是:/api/getInfo?foo=bar

丢弃url中的哈希标记

axios({
    method: 'get',
    url: '/api/getInfo#hash',
    params: {
        foo: 'bar'
    }
})

最终请求的url是:/api/getInfo?foo=bar

保留url中已存在的参数

axios({
    method: 'get',
    url: '/api/getiInfo?foo=bar',
    params: {
        bar: 'baz'
    }
})

最终请求的url是:/api/getInfo?foo=bar&bar=baz

buildUrl的实现

根据上面我们的分析,接下来我们来实现一个工具function,然后把params拼接到url上,并能处理上面这几种params

// helpers/util.ts
const toString = Object.prototype.toString

export function isDate(val: any): val is Date {
    return toString.call(val) === '[object Date]'
}

export function isObject(val: any): val is Object {
    return val !== null && typeof val === 'object'
}

export function isPlainObject(val: any): val is Object {
    return toString.call(val) === '[object object]'
}

// helpers/url.ts
import { isDate, isPlainObject } from './util'
import { encode } from 'punycode';

export function buildUrl(url: string, params?: any): string {
    if (!params) {
        return url
    }

    const parts: string[] = []

    Object.keys(params).forEach(key => {
        const val = params[key]
        if (val === null || typeof val === 'undefined') {
            return // 结束本次forEach
        }

        let values = []
        if (Array.isArray(val)) {
            values = val
            key += '[]'
        } else {
            values = [key]
        }
        values.forEach(val => {
            if (isDate(val)) {
                val = val.toISOString()
            } else if (isPlainObject(val)) { // 普通对象,不包含formData类型等
                val = JSON.stringify(val)
            }
            parts.push(`${encode(key)}=${encode(val)}`)
        })
    })

    let serialzedParams = parts.join('&')

    if (serialzedParams) {
        const markIndex = url.indexOf('#')
        if (markIndex !== -1) {
            url = url.slice(markIndex, 1)
        }
        url += (url.indexOf('?') === -1 ? '?' : '&')
    }

    return url
}

原文地址:https://www.cnblogs.com/fe-linjin/p/11386136.html

时间: 2024-10-18 09:53:53

【Ts重构Axios】url处理篇的相关文章

【Ts重构Axios】关于处理请求error三种情况

三种错误描述及基本解决方案 1.错误网络异常错误 当网络出现异常(比如网络不通)的时候,发送请求会触发XMLHTTPRequest对象实例的error事件.于是,我们可以在onerror的事件回调函数中捕获此类错误. 我们在xhr.ts中添加如下代码: ... request.onerror = function handleError() { reject(new Error('Network error')) } ... ? 2. 处理超时错误 我们可以设置某个请求的超时时间timeout,

(转)Android项目重构之路:实现篇

前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单的方式来搭建架构和实现代码. IDE采用Android Studio,Demo实现的功能为用户注册.登录和展示一个券列表,数据采用我们现有项目的测试数据,接口也是我们项目中的测试接口. 项目搭建 根据架构篇所讲的,将项目分为了四个层级:模型层.接口层.核心层.界面层.四个层级之间的关系如下图所示:

(转)Android项目重构之路:界面篇

在前一篇文章<Android项目重构之路:架构篇>中已经简单说明了项目的架构,将项目分为了四个层级:模型层.接口层.核心层.界面层.其中,最上层的界面,是变化最频繁的一个层面,也是最复杂最容易出问题的一个层面,如果规划不好,很容易做着做着,又乱成一团了. 要规划好界面层,至少应该遵循几条基本的原则: 保持规范性:定义好开发规范,包括书写规范.命名规范.注释规范等,并按照规范严格执行: 保持单一性:布局就只做布局,内容就只做内容,各自分离好:每个方法.每个类,也只做一件事情: 保持简洁性:保持代

Android项目重构之路:实现篇

项目搭建 根据架构篇所讲的,将项目分为了四个层级:模型层.接口层.核心层.界面层.四个层级之间的关系如下图所示: 实现上,在Android Studio分为了相应的四个模块(Module):model.api.core.app. model为模型层,api为接口层,core为核心层,app为界面层. model.api.core这三个模块的类型为library,app模块的类型为application. 四个模块之间的依赖设置为:model没有任何依赖,接口层依赖了模型层,核心层依赖了模型层和接

重读《重构》:第二篇

那些代码的坏味道: Duplicated code :最常见的复制黏贴综合征.人们会自然而然的会想到抽取方法. Long Method:这个也太常见.今天还在帮助一个小朋友重构她的python代码,一个函数写了100多行.她最痛苦的就是调试太痛苦了.其实最痛苦的还在后面.人们不愿意拆分功能,新写程序的人会觉得拆得特别散,然后n层调用关系,看起来很费劲,还不如堆在一坨.这是个非常错误的想法.拆分带来的好处是,解耦,重用,易于测试,易于理解(当然设计要合理),易于控制变更. 书中的一个原则是:每当但

&quot;奇葩家园“之 asyncTask 与 url 下载篇

asyncTask 是android提供的一个轻量级的异步处理的类,有3个泛型参数,params,progress,result params: 启动任务执行的时候传入的参数比如请求的 url 地址 progress:后台任务执行的百分比 result:后台任务执行完毕后返回的结果 比如string 使用asynctask必须要重写2个方法,一个是 doInBackground(Params...) 后台执行的方法,比较耗时的方法,这里不能直接操作ui,可以通过publicProgress(Pr

大话重构读书笔记——进阶篇二

我们怎样拥抱变化 软件系统应对快速变化的终极利器,是以领域模型为核心建立的软件架构. 软件发展的基本特征就是变更,不论是源于需求的变更还是源于技术的变更. 运用领域模型,通过图形化的分析,可以让我们快速掌握真实世界的规律,进而指导软件的设计与开发.领域模型是联系真实世界与软件世界的枢纽,首先通过对真实世界的分析绘制领域模型,然后照着领域模型设计软件,就可以保证真实世界与软件世界的对应关系. 一般来说,领域模型是基于用户业务领域知识的分析,这些领域知识源于用户对软件系统的业务需求,却超越了业务需求

大话重构读书笔记——进阶篇一

什么时候重构? 重构是一种习惯,一种编程习惯.这种习惯让我们迅速由菜鸟转变为大牛,可以编写出高质量.优秀的程序. 问题的关键就是降低修改成本与风险的方法,而这个方法就是系统重构. 走出重构的第一步对每一个人来说都是一次心灵的考验,甚至许多人总是徘徊于路口踌躇不前,但一旦跨出去了,它将成为你生命的一部分. 没有经过重构的,原生态的代码是没办法复用的,当我们发现代码需要复用时,切忌不要使用过去那种简单粗暴的复制黏贴,合理运用重构方法,加之以仔细.认真.即时的测试,就可以保证既有代码的正确,并使整个系

页面重构css技巧总结篇(8.1-8.5)

1.如何让文字在容器内垂直居中? (1)方法:为容器添加line-height属性,使得line-height的值等于容器的height. (2)代码 <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style type="text/css"> .container{ width: