2014年11月20日 星期四

「Http」Http Post/GET參數傳送小叮嚀

本篇為小弟在實作HTTP Post 資料到Server端時遇到的D槽 ,經排除問題後做的紀錄。

在URI的規範中定義了一些保留字元(Reserved character),如下表所示




保留字
%HEXHEX
空白
%20
!
%21
#
%23
$
%24
&
%26
%27
(
%28
)
%29
*
%2A
+
%2B
,
%2C
/
%2F
:
%3A
;
%3B
=
%3D
?
%3F
@
%40
[
%5B
]
%5D



上表保留字在URI中都有它的作用,如果你要在請求參數上表達URI中的保留字元,必須在%字

元之後以十六進位數值表示方式,來表示該字元的八個位元數值。如果URL中使用到了這些保

留字,就必須將它編碼為「%HEXHEX」(HEX表示1個16進位值,HEXHEX表示有二個16進位

)的形式,舉例來說,「空白字元」的 ASCII code 是32 (16進制為20),所以會被編碼

為 %20,而其它 non-ASCII 字元(如:中文字)則以 UTF-8 字元編碼後的位元組來編碼成

%HEXHEX 的形式。


空白與加號( + ) 。


今天你如果參數內容為 123 + 45 + 6 ,沒有經過編碼直接post到Server,Server收到的會是

123 45 6 ,Server端預設自動把+ 號轉成空白。


也就是說,其實你在以post傳遞參數時,Server看到+ 就 誤會 你輸入的是空白,是client端

程式(ex . chrome , FireFox , IE)幫你把空白轉換成+再送到Server的(其實我本來

就打+,跳到愛河也洗不清了 ) ,所以你真的要打+ 怎麼辦。可以選擇手動把原本要打+的地

方轉換成%2B或是用程式做轉換。

 (以C#為例)


string text = HttpUtility.UrlEncode(text,encoding);

 text為欲轉換的參數字串。不要用錯,

它還有一個

string text = HttpUtility.HtmlEncode(text, encoding); 

 這二個容易搞混, 用的時間點如下說明


將 HTML 文件中不允許出現的字元進行編碼,通常會編碼 "<"、">"、"&" 等字元。


URL 編碼方式會將 URL 中不允許的字元轉換為相等的字元實體,例如+ 、= 、: 、? 等字元。




參考資料

http://openhome.cc/Gossip/Encoding/URLEncoding.html

http://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81

沒有留言:

張貼留言