我正在制作一个 HTTP 客户端,我需要在其中发送 HTTP get 请求以获取数据。我正在使用 boost asio 库,因此我无法使用任何标准的 url 编码库。
这是我从 netcat 和 Mozilla 得到的(一个典型的 get 请求)
localhost:2000/questions/10838702/how-to-encode or-d ecode-url-in-objective-c
获取请求地址
F:\pydev>nc -l -p 2000
GET /questions/10838702/how-to-encode%20or-d%20%20%20ecode-url-in-objective-c HTTP/1.1
Host: localhost:2000
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
我发现 Mozilla 只对 url 的查询部分进行编码。
我试过这个url编码网页 http://meyerweb.com/eric/tools/dencoder/
并且它对下面的url进行编码
localhost:2000/questions/10838702/how-to-encode or-d ecode-url-in-objective-c
到
localhost%3A2000%2Fquestions%2F10838702%2Fhow-to-encode%20or-d%20%20%20ecode-url-in-objective-c
谁能建议我在哪里使用 URL 编码?
最佳答案
作为一般规则,除字母数字 (A-Z0-9)、- _ . 和 以外的任何字符~ 要么在 URL 中有一些特殊用途,要么是不允许的。
保留字符为; / ? : @& = 和空格。如果您以不同于其特殊含义的方式使用这些字符中的任何一个,则必须对其进行 URL 编码。为了安全起见,许多编码器只对所有不明确安全的内容进行编码。
例如,假设您有一个带有问号的文件名(我们将文件命名为 file?name
,您需要创建一个 URL。问题是 http://somehost.com/file?name
不会按照您希望的方式进行解释。该 url 将与您的网络空间中的 /file
相匹配,并且有一个搜索词name
。您必须对文件名进行编码才能获取 URL http://somehost.com/file%3Fname
。
该规范允许您对任何字符进行 URL 编码,甚至是字母数字,并期望它们不会被服务器编码。您只需要确保在将保留字符用于其预期目的的任何地方,它们都不会被编码。例如:您不想在 http://somehost.com
中对冒号或斜杠进行编码,因为它们被用作分隔符。
url-encoding 最常使用的是准备表单数据。在这种情况下,您通常从一组键值对开始。您将为这样的表单构造编码数据(伪代码):
- 对键和值进行编码
- 在键和值之间用“=”连接它们以获得术语。例如:
encodedKey=encodedValue
。 - 重复 1 和 2,直到您得到一个术语列表
- 用 & 符号连接所有条款。例如:
encKey1=encVal1&encKey2=encVal2
解码是逆过程:
- 沿“&”符号拆分表单数据以获得术语数组
- 在“=”字符上拆分每个术语以获得编码的键和值
- 解码键和值
这听起来很简单,但您可能会震惊很多人都弄错了。
我在这里忽略了一些更精细的细节。一如既往,相关规范才是硬道理。在这种情况下,RFC 1738 .
关于http - 正确使用url编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220861/