产品
: 大叔
有用户反映账户不能绑定公众号。
大叔
:啊咧咧?怎么可能,我看看?
大叔
:恩?这也没问题啊,魏虾米。
大叔
:还是没问题啊,挖叉类。
大叔
:T T,话说 产品姐姐
是不是 Java
提供接口的时候,没有对 URL
进行 encodeURI
。
产品
:啊咧咧?我问问看?
大叔
: 翔逼
你给我过来!
翔逼
:啊咧咧?怎么了 大叔
?
大叔
:知道在 URL
中的 +
有时候会变成什么吗?
翔逼
:啊咧咧?不是 +
吗?
大叔
:知道在 URL
中的 空格
有时候会变成什么吗?
翔逼
:啊咧咧?不是 空格
吗?
大叔
:还不赶快自己去查查看!别也成了挖坑型选手。
维基百科 中关于 百分号编码
中有段说明。
当HTML表单中的数据被提交时,表单的域名与值被编码并通过HTTP的GET或者POST方法甚至更古远的email把请求发送给服务器。这里的编码方法采用了一个非常早期的通用的URI百分号编码方法,并且有很多小的修改如新行规范化以及 把空格符的编码"%20"替换为"+"
. 按这套方法编码的数据的MIME类型是application/x-www-form-urlencoded, 当前仍用于(虽然非常过时了)HTML与XForms规范中. 此外,CGI规范包括了web服务器如何解码这类数据、利用这类数据的内容。
在浏览器里输入URL https://www.baidu.com/s?wd=翔逼+大叔
,这时候百度搜索框中出现的是 翔逼 大叔
, 搜索框
中 +
神奇的变成了 空格
。
在浏览器里输入URL https://www.baidu.com/s?wd=翔逼 大叔
,这时候百度搜索框中出现的是 翔逼 大叔
, URL
中 空格
的变成 %20
。
在浏览器里输入URL https://www.baidu.com/s?wd=翔逼%2B大叔
,这时候百度搜索框中出现的是 翔逼+大叔
, 搜索框
中 %2B
的变成 +
。
<?php echo $_POST['word'];
POST /1.php HTTP/1.1 Host: 127.0.0.1 Cache-Control: no-cache Postman-Token: fed5740c-aceb-0f57-edc9-cf42a275b35a Content-Type: application/x-www-form-urlencoded word=%2B%2B%2B+%2B%2B%2B
+++ +++
在社交登录或微信公众号等时候,我们常常会在 URL
中使用到回调地址来处理验证成功后的页面跳转。
例如:
回调地址为: lionis.taroball.com?username=lionis&sex=man
这时候在 URL
中附加回调信息时
地址变为 www.xxx.com?redirect=lionis.taroball.com?username=lionis&sex=man
。
这个时候尴尬的问题出现了, sex=man
在这个时候变成了 www.xxx.com
的参数了,而不是 lionis.taroball.com
的参数了。
这个时候就需要对回调信息进行 encodeURL
。
<?php // 文件名为test.php echo $_GET['redirect'];
localhost/test.php?redirect=lionis.taroball.com%3Fusername%3Dlionis%26sex%3Dman
lionis.taroball.com?username=lionis&sex=man
localhost/test.php?redirect=lionis.taroball.com?username=lionis&sex=man
lionis.taroball.com?username=lionis
如果想在URL中使用 +
需要对 URL
进行 encodeURL
,把 +
编码成 %2B
。
在服务端渲染页面的时候,对 URL
需要 encodeURL
。
在客户端发送请求的时候, javascript
需要使用 正则
来进行 替换
。
在服务端接受参数的时候,对 关键字
使用 decodeURL
。
对于 URL
中的 URL
也需要进行 encodeURL
POST
的 Content-Type
默认是 application/x-www-form-urlencoded
,顾名思义对 URL
进行了 encodeURL
。
想要了解更多有关 POST
可以看我之前写的你所不知道的POST。