龙空技术网

推荐一种url query的格式化方法

天真塌不下来 185

前言:

此时小伙伴们对“url特殊字符处理”大致比较看重,看官们都需要剖析一些“url特殊字符处理”的相关资讯。那么小编同时在网摘上网罗了一些有关“url特殊字符处理””的相关知识,希望朋友们能喜欢,姐妹们快快来学习一下吧!

npm包库urljson-serializer是格式化 URL 查询字符串的实用工具。

urlquery

urlquery(data)

urlquery将data序列化为 URL 查询字符串。data是一个普通对象,表示一个属性集合。 data对象的每个属性序列化为一个键值对,键值对之间用&分隔,键和值之间用=分隔。

根据对象属性值的类型,下面的属性会被忽略,根本不会出现在查询字符串中:

undefinednullNaNInfinityfunctionSymbol''

属性值类型为字符串时,序列化为字符串本身。

属性值为布尔,数字,大整数类型时,序列化调用primitive.toString()

当属性值是对象时,用urljson格式序列化。urljson格式详见下面。

当属性集合为空时,urlquery返回空字符串。

用法:

test('urlquery', () => {    let obj = { foo: 'bar', baz: ['qux', 'quux'], corge: '' }    let y = urlquery(obj)    expect(y).toEqual("?foo=bar&baz=[~qux~,~quux~]")})

返回的字符串以?问号开头。字符串bar按原意出现在查询字符串中,两边直接接等号=和和号&。corge是空字符串,整个字段被忽略,不出现在查询字符串中。baz数组,是组合类型,序列化用urljson格式。

示例二:

对象序列化为查询字符串:

let x = {    a: false,    b: 2,    c: 'xyz',    d: [1, 2],    e: { x: 1, y: 2 },}let y = urlquery(x)expect(y).toEqual("?a=false&b=2&c=xyz&d=[1,2]&e={x:1,y:2}")

生成的结果,对象直接属性如果是标量,兼容Form Data字符串格式,可以被浏览器开发者工具识别解析。如果对象的属性是对象,则按Urljson格式化为字符串。注意数组是特殊的对象,也按Urljson格式化为字符串。

示例三:

let y = urlquery({})expect(y).toEqual("")

当属性集合为空时,urlquery返回空字符串。

urlquery与Form Data格式比较

urlquery函数序列化格式采用的是一种单层Form Data格式。

忽略空参数,当参数值为空字符串时,整个键值对被移除。一个键只会出现一次,并不会出现多次。用urljson序列化为一个参数。即使是基元数组也用urljson格式字符化,而不是多个同名参数顺序排列。没有用点号分隔的复合键。因为复杂对象都用urljson格式序列化。在输入数据属性都是基元类型时,兼容Form Data格式。所以,可以利用现有的各种form参数查看工具。设计原则是,使查询字符串尽可能短。Urljson格式

当urlquery序列化对象类型的属性时,采用urljson格式序列化属性值。

顾名思义,urljson格式类似于JSON格式,不同之处在于:

字符串限定符为波浪线~。代替json格式双引号"。字符串中的转义符号仍然是反斜杠。仅对波浪线、控制字符(\u0000-\u0020),空白字符(\s)转义,转义方法为:

\~ \\ \b \f \n \r \t \v \ hexdigit hexdigit 
属性键字符串的限定符是可选的。除非当属性键包含限定字符,控制字符,空白字符,标点符号时,限定符是必须的。

用波浪线作为字符串限定符,是因为双引号会被百分号转义为三个字符,增加了url的长度,也增加了阅读难度。

urljsonStringify

为了数据序列化为Urljson格式,使用函数urljsonStringify

let obj = {    a: 1,    b: true,}let s = urljsonStringify(obj)expect(s).toEqual("{a:1,b:true}")
urljson格式规范

The grammar can be transcribed as follows:

value : object      | array      | null      | boolean      | number      | string      ;object : "{" "}"       | "{" fields "}"       ;fields : field       | fields "," field       ;field : key ":" value      ;key : string     | identifier    ;array : "[" "]"      | "[" values "]"      ;values : value       | values "," value       ;
百分号编码

只对必要的字符进行pct编码,其余字符如有遗漏,浏览器会自动pct编码。百分号编码的字符有:

控制字符,理由非打印不好手写传送空格,理由经常被处理程序忽略加号,某些处理程序会翻译成空格百分号,百分号编码的开始符号哈希,url fragment部分的开始符号&,键值对的分隔符号等号,键值的分隔符号

其他符号浏览器会自动pct编码。并且不会对已经编码的字符多次编码。

下面是其他工具函数

toUtf8(charCode)

let n = '中'.charCodeAt(0)expect(toUtf8(n)).toEqual([228, 184, 173])

将charcode转换为utf8整数数组。

pctEncodeChar(utf8)

expect(pctEncodeChar([228, 184, 173])).toEqual('%E4%B8%AD')

根据字符的utf8编码,返回百分号编码字符串。

queryPctEncode(s)

let m = 'a+=1'let y = queryPctEncode(m)expect(y).toEqual("a%2B%3D1")

返回输入字符串的百分号编码字符串。

参见npm包库urljson-serializer开源于github,位于xp44mm/urljson-serializer仓库。FSharpCompiler.Json是一个NuGet开源json解析库,开源于github,它亦可以解析urljson,位于xp44mm/FSharpCompiler.Json仓库。AspNetCore.FSharpCompilerJson是一个NuGet开源库,开源于github,它将FSharpCompiler.Json整合进入Asp.net,位于xp44mm/AspNetCore.FSharpCompilerJson仓库。可以应用于Asp.net项目序列化JSON格式,演练教程如下:xp44mm/UrljsonExample

标签: #url特殊字符处理