我正在创建一个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只对网址的查询部分进行编码。
我尝试了这个网址编码网页 http://meyerweb.com/eric/tools/dencoder/
它编码以下网址
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编码吗?
答案 0 :(得分:2)
作为一般规则,除了字母数字(A-Z0-9), - _ 。和〜之外的任何字符在网址中有一些特殊用途,或者是不允许的。
保留字符为; / ? : @ & ; = 和 space 。如果您以不同于其特殊含义的方式使用任何这些字符,则必须对其进行URL编码。为了安全起见,许多编码器只编码那些不明确安全的编码器。
例如,假设您有一个带有问号的文件名(让我们将文件命名为file?name
,您需要创建一个URL。问题是http://somehost.com/file?name
不会按您希望的方式解释。网址将与您的网络空间中的/file
匹配,并且搜索字词为name
。您必须对文件名进行编码以获取网址{{1} }。
规范允许您对任何字符(甚至是字母数字)进行URL编码,期望它们将被服务器取消编码。您只需要确保保留字符用于其预期目的的任何地方,它们都不会被编码。例如:你不想在http://somehost.com/file%3Fname
中对冒号或斜杠进行编码,因为它们被用作分隔符。
最常用的url-encoding是准备表单数据。在这种情况下,您通常从一组键值对开始。您可以为这样的表单构建编码数据(在伪代码中):
http://somehost.com
。 encodedKey=encodedValue
解码是相反的过程:
这听起来很简单,但你可能会感到震惊有多少人弄错了。
我在这里掩饰了一些更精细的细节。与往常一样,相关规范是硬道理。在这种情况下,RFC 1738。