一、問題闡述
今天寫 url 請求時,不管是get 請求還是 post 請求,如果參數中帶有 + % # 等特殊符號,就無法正常獲得參數
具體現象就是 用URL傳參數的時候,用&符號連接,如果某一個參數中含"#$ ^ & * + ="這些符號的時候,在另一個頁面getParameter就會取不到傳過來的參數。
二、解決方法
有些符號在URL中是不能直接傳遞的,如果要在URL中傳遞這些特殊符號,那么就要使用他們的編碼了
1)下面列出了一些URL特殊符號及編碼十六進制值
- + URL 中+號表示空格 %2B
- 空格 URL中的空格可以用+號或者編碼 %20
- / 分隔目錄和子目錄 %2F
- ? 分隔實際的 URL 和參數 %3F
- % 指定特殊字符 %25
- # 表示書簽 %23
- & URL 中指定的參數間的分隔符 %26
- = URL 中指定參數的值 %3D
2)java 實現
如果代碼采用java 來訪問請求的話,可以采用 URLEncoder.encode(param,"utf-8") 將參數值編碼,對應的解碼方法為URLEncoder.decode()
java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);
比如
String str = "http://localhost:8980/select?param=" + URLEncoder.encode("bcpuser$userid$1#3#4","utf-8") ;
//得到結果 http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234
得到url 可以直接在瀏覽器上訪問,如果后台采用的java+ springMVC,可以直接得到預期的參數(無需再次解碼的)
3)C# 實現
C#中編碼的主要方法:HttpUtility.UrlEncode (不推薦)、Server.UrlEncode (不推薦)、Uri.EscapeUriString、Uri.EscapeDataString。(更多詳情,看參考)
String str = "http://localhost:8980/select?param=" + Uri.EscapeDataString("bcpuser$userid$1#3#4"); //得到結果 http://localhost:8980/BCPClientServer/select?param=bcpuser%24userid%241%233%234
4) javascript 實現方法
javascript中的編碼有三種方法:escape (不推薦,對ASCII符號正確編碼)、encodeURI、encodeURIComponent
encodeURI:用於對網址編碼(不包含參數)
encodeURI不編碼字符有82個:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURI就是為這個而設計的。encodeURI不對URI中的特殊字符進行編碼,如冒號(:)、斜杠(/)。下面看個示例:
encodeURI("http://www.cnblogs.com/a file with spaces.html") // outputs http://www.cnblogs.com/a%20file%20with%20spaces.html
可以看到僅僅把空格替換成了20%,所以此方法可用於對網址進行編碼。
由於encodeURI不對冒號(:)、斜杠(/)進行編碼,所以如果參數(如把網址作為參數)中包含冒號(:)、斜杠(/),就會解析出錯,所以此方法不能對參數進行編碼。
encodeURIComponent:用於對網址參數進行編碼
encodeURIComponent不編碼字符有71個:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
可以看到此方法對:/都進行了編碼,所以不能用它來對網址進行編碼。由於此方法對中文,空格,井號(#),斜線(/),冒號(:)都進行了編碼,所以適合對URI中的參數進行編碼。看下面的示例:
var param="博客園"; var url="http://www.cnblogs.com/?key="+encodeURIComponent(param)+"&page=1"; console.log(url);//outputs http://www.cnblogs.com/?key=%E5%8D%9A%E5%AE%A2%E5%9B%AD&page=1
三、總結
這里我並沒有寫的很詳細,只是達到了我的目的,故暫時記錄這么多。
因為問題出現傳遞的參數里包含特殊符號而導致參數獲取錯誤,故這里在url 拼接參數的時候,將參數的值編碼后傳遞即可(原理如此,不限語言)
參考博客:http://www.cnblogs.com/kissdodog/archive/2013/04/22/3035907.html
,"utf-8")