URI Encoding

What is URL Encoding

URL Encoding 也被成为 percent encoding,URL是由有限的字符(来自US-ASCII character set)组成的,这些字符包含数字(0-9)、字幕(a-z, A-Z)、特殊字符- _ . ~

这也就意味着,URL中不能包含:

  • ASCII控制字符(退格键,垂直制表符,水平制表符,换行符等)
  • unsafe characters: space、\、<>、{、}
  • 不在ASCII中的字符

还有一些绝对不能出现在query中的字符:

  • 常见的一些对于URL有特殊意义的字符,被称作保留字符。比如: / # ? :

那么,当你的URI中必须要包含一些不被允许的字符该怎么办呢?

这时候就需要使用URL Encoding将不被允许的字符转换成对应的十六进制三元字符组, 这个转换的过程被称为URI的encoding。

URI encode也被称作percent-encoding, 原因是,所有不被允许的字符都需要转义成为使用%开头的十六进制字符组,因此也被叫做perceng encoding

哪些字符可以包含在URI中?

根据RFC 3986所述,一个valid的URI中只能包含以下84种字符:

  • 特殊字符
-._~:/?#[]@!$&'()*+,;=
  • 字母
    a-z / A-Z

  • 数字
    0-9

  • 以%开头的十六进制三元字符组

除此之外的任何一种字符都需要是使用字符三元组替代。

如果URL中出现这种不被允许的字符会怎么样呢?

  • 请求通过浏览器或者postman,做过转义之后发出

如果你通过浏览器发出请求中包含了一些不被允许的字符,浏览器会帮助我们做一些转义,别以为这是一件好事儿,因为不同的浏览器有不同的转义字符的方式。这时候你可能会惊喜的发现,同样一个URL,chrome上请求成功,IE11直接400

  • 请求不做任何转义直接发送到server

这种方式我也不知道如何做到,我尝试使用curl/postman/发现都会被转义,那么我们就大胆的猜测一下。

一个真的没有转义过包含非法字符的请求发送到server,会出现什么结果呢?

大胆猜测一下,server应该没有办法resolve这种请求,那么就有可能直接throw 400 error


简而言之, 如果直接发送包含不允许字符的URI给server,同样Server也不能够识别这些字符,就有可能导致这次请求失败

How can we achieve URL encoding in JS

JS提供了内置了两个API对URI进行encode:

  • encodeURIComponent
  • encodeURI

他们都可以将特殊字符进行encode,那么区别是什么呢?

  • encodeURI() 不会encode: ~!@#$&*()=:/,;?+'

说明这个function可以作用于整个URI

encodeURI('https://stackoverflow.com/questions/?path={"a":"1"}')

// "https://stackoverflow.com/questions/?path=%7B%22a%22:%221%22%7D"
  • encodeURIComponent() will not encode: ~!*()'

说明类似于?这种分界query和path的符号也会被转义,因此无法作用于整个URI

encodeURIComponent是对URI的组成部分进行编码的方法,而不用对整个URL进行编码。

encodeURIComponent('https://stackoverflow.com/questions/?path={"a":"1"}')

// "https%3A%2F%2Fstackoverflow.com%2F%3Fpath%3D%7B%22a%22%3A%221%22%7D"

这样的URL根本无法被识别

Note

请不要使用escape,此方法已经被废弃

实例

  • 在client端发一个请求获取所有的search result, 我在code中直接使用了fetch给下面的url发送了请求
https://xxxx/AAA/api/results?info={
"name":"yoyo"}&options={"page":1,"pageSize":30}
  • 当我在chrome中打开页面的时候,server端接收到的请求是:
https://xxxx/AAA/api/results?info={%22name%22:%22yoyo%22}&options={%22page%22:1,%22pageSize%22:30}
  • 当我在IE11中打开页面的时候,发现这个请求总是400,结果查看server端接收到的请求是:
https://xxxx/AAA/api/results?info={\x22name\x22:\x22yoyo\x22}&options={\x22page\x22:1,\x22pageSize\x22:30}

由于window的编码方式不同,导致server端无法识别\x22,所以直接返回400

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容

  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,338评论 0 6
  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,548评论 0 6
  • 最近难得有时间,可以看看平时经常用的牛逼的三方框架是怎么实现的,学习学习。比如okhttp ,眼下安卓开发 网络框...
    张哲1111阅读 1,237评论 0 1
  • 8. 方法定义(Method Definitions) 通用的HTTP/1.0的方法集将在下面定义,虽然该方法集可...
    Palomar阅读 3,174评论 0 2
  • 不知不觉,大半生已过。这一路走来,经历了坎坷,也收获了快乐。不管怎么说,生活总是喜忧参半的,放大自己的格局...
    晴空一鹤范祖华阅读 432评论 0 11