http - 正确使用url编码

标签 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 只对 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 最常使用的是准备表单数据。在这种情况下,您通常从一组键值对开始。您将为这样的表单构造编码数据(伪代码):

  1. 对键和值进行编码
  2. 在键和值之间用“=”连接它们以获得术语。例如:encodedKey=encodedValue
  3. 重复 1 和 2,直到您得到一个术语列表
  4. 用 & 符号连接所有条款。例如:encKey1=encVal1&encKey2=encVal2

解码是逆过程:

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

这听起来很简单,但您可能会震惊很多人都弄错了。

我在这里忽略了一些更精细的细节。一如既往,相关规范才是硬道理。在这种情况下,RFC 1738 .

关于http - 正确使用url编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220861/

相关文章:

c# - HttpClient 和 HttpRequestHeaders.Range

http - 检测浏览器对 RFC5987 的支持

node.js - Express 应用程序中端口 3000 的意义

javascript - Appcelerator Titanium 上传到谷歌驱动器 - Javascript 中的 Rest API - 错误 404

mysql - 在cakephp中下载Blob文件

java - 解析有效日期时出现 ParseException

php - 如何将我的 angularjs 变量传递给 Php 页面并检索它

node.js - 如何通过谷歌云 http 功能上传大于 10mb 的文件。 ?还有其他选择吗?

java - 显示http header servlet不显示任何内容

dictionary - 如何扩充 ResponseWriter 的 Header() 返回的映射