url编码的正确用法

时间:2013-04-25 17:14:54

标签: http http-headers

我正在创建一个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编码吗?

1 个答案:

答案 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是准备表单数据。在这种情况下,您通常从一组键值对开始。您可以为这样的表单构建编码数据(在伪代码中):

  1. 对密钥和值进行编码
  2. 将键和值与它们之间的'='连接以获取术语。例如:http://somehost.com
  3. 重复1和2,直到您有一个术语列表
  4. 加入与&符号的所有条款。例如:encodedKey=encodedValue
  5. 解码是相反的过程:

    1. 将表单数据拆分为“&”获得一系列条款的迹象
    2. 将每个术语拆分为“=”字符以获取编码的键和值
    3. 解码密钥和值
    4. 这听起来很简单,但你可能会感到震惊有多少人弄错了。

      我在这里掩饰了一些更精细的细节。与往常一样,相关规范是硬道理。在这种情况下,RFC 1738