2013-04-25 88 views
1

我正在制作一个HTTP客户端,我需要发送HTTP获取请求来获取数据。我使用boost asio库,因此我无法使用任何标准的url编码库。url编码的正确用法

下面是我从netcat的和Mozilla(典型的GET请求)

localhost:2000/questions/10838702/how-to-encode or-d ecode-url-in-objective-c 

Get请求URL

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/

而且它编码以下网址

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编码?

回答

2

作为一般规则,比其它字母数字(A-Z0-9)任何字符,-_在URL中有一些特殊用途,或者是不允许的。

保留字符是;/@&=空间。如果您以某种方式使用这些字符以外的其他特殊字符,则必须对其进行网址编码。为了安全起见,许多编码器只编码一些不明显安全的东西。

例如,假设您的文件名中带有问号(让我们将文件命名为file?name,并且您需要创建一个URL。问题是http://somehost.com/file?name不会按照您希望的方式进行解释被该网址会在你的web空间匹配/file,并有name一个搜索词。你要编码的文件名来获取URL http://somehost.com/file%3Fname

该规范允许你进行URL编码任何字符,甚至是字母数字,期望它们将被服务器取消编码,您只需确保保留字符用于其预期用途的任何地方,它们就不会被编码,例如:您不想编码冒号或slas他在http://somehost.com,因为他们被用作分界线。

url编码最常使用的是准备表单数据。在这种情况下,您通常从一组键值对开始。你会构建编码数据的形式,像这样(以伪代码):

  1. 编码键和值
  2. 串联键和值与“=”之间得到条款。例如:encodedKey=encodedValue
  3. 重复1和2,直到您有一个术语列表
  4. 加入所有与&符的术语。例如:encKey1=encVal1&encKey2=encVal2

解码是相反的过程:

  1. 拆分沿着“&”标志的形式的数据以获得术语
  2. 拆分每个术语的“=”字符的阵列获得编码键和值
  3. 解码键和值

这听起来很简单,但你可能是震惊了有多少人弄错了。

我在这里掩盖了一些细节。一如既往,相关规范是硬道理。在这种情况下,RFC 1738