1

我正在制作一个 HTTP 客户端,我需要在其中发送 HTTP 获取请求以获取数据。我正在使用 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/

它对以下网址进行编码

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

4

1 回答 1

2

作为一般规则,除字母数字 (A-Z0-9) 之外的任何字符,- _ .或者~在 URL 中具有某些特殊用途,或者不允许使用。

保留字符是; / ? : @& =space。如果您以不同于其特殊含义的方式使用这些字符中的任何一个,那么您必须对其进行 URL 编码。为了安全起见,许多编码器只是对不明确安全的所有内容进行编码。

例如,假设您有一个带有问号的文件名(让我们为文件命名file?name,并且您需要创建一个 URL。问题是它http://somehost.com/file?name不会按照您想要的方式解释。url 将匹配/file在您的网络空间中,并且有一个搜索词name. 您必须对文件名进行编码才能获得 URL http://somehost.com/file%3Fname

该规范允许您对任何字符(甚至是字母数字)进行 URL 编码,并期望它们不会被服务器编码。您只需确保将保留字符用于其预期目的的任何地方,它们都没有被编码。例如:您不想编码冒号或斜杠,http://somehost.com因为它们被用作分隔符。

url-encoding 最常见的用途是准备表单数据。在这种情况下,您通常从一组键值对开始。您将为这样的形式构建编码数据(在伪代码中):

  1. 编码键和值
  2. 将键和值与它们之间的“=”连接起来以获取术语。例如:encodedKey=encodedValue
  3. 重复 1 和 2,直到你有一个术语列表
  4. 用 & 号加入所有条款。例如:encKey1=encVal1&encKey2=encVal2

解码是相反的过程:

  1. 沿“&”符号拆分表单数据以获取术语数组
  2. 拆分“=”字符上的每个术语以获取编码的键和值
  3. 解码键和值

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

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

于 2013-04-25T21:47:40.293 回答