2013-04-25 93 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