// 接口URL+模板調(diào)用方法,構(gòu)成調(diào)用的完整URL
String apiUrl = configInfo.getUrl() + patternInfo.getInvokeMethod();
HttpPost method = new HttpPost(apiUrl);
//處理+號問題粹庞。+號轉(zhuǎn)換為%2B
request = request.replace("+", "%2B");
JSONObject jsonObject = JSON.parseObject(request);
以下轉(zhuǎn)自:https://www.cnblogs.com/gzchenjiajun-php/articles/4841529.html
url之所以要編碼痘绎,不外乎幾個原因泉哈,比如:url中某些字符會引起歧義蛉幸、url參數(shù)中含有隱私數(shù)據(jù)、url中參數(shù)中含有中文(url編碼格式采用ascii而非unicode)等丛晦。
一奕纫、參數(shù)字符串
url參數(shù)字符串中使用key=value鍵值對這樣的形式來傳遞參數(shù),鍵值對之間以&符號分隔烫沙,比如:/ex?i=mm_1_2_3& cb=jsonp_callback匹层。如果value字符串中包含了=或者&,那么就會造成接收url的服務器解析錯誤锌蓄,因此升筏,必須對會引起歧義 的符號=和&進行轉(zhuǎn)義,即對其進行編碼瘸爽。
典型的url格式如下:
http://www.jbxue.com:80/ex?i=mm_35055626_3484594_13482142&cb=jsonp_callback_7498#nose
scheme:http://
authority:www.jbxue.com:80
path:/ex
query:?i=mm_35055626_3484594_13482142&cb=jsonp_callback
fragment:#nose
二您访、編解碼字符
rfc3986規(guī)定url中只允許包含英文字母(a-za-z)、數(shù)字(0-9)剪决、4個特殊字符(-灵汪、_檀训、.、~)以及所有保留字符(比如:/享言、?峻凫、 []、@等)览露。rfc3986對url編碼問題做了詳細建議荧琼,指出了哪些字符需要編碼才不會引起url語義歧義,以及對這些字符編碼的原因肛循。
url可以劃分為若干組件铭腕,比如:協(xié)議、主機多糠、路徑等累舷,保留字符中有些就是用作分隔不同組件的,比如:冒號用于分隔協(xié)議和主機夹孔,/用于分隔主機和路徑被盈,?用于分隔路徑和查詢參數(shù)等,還有一些字符用于每個組件內(nèi)起到分隔作用搭伤,比如:=用于分隔查詢參數(shù)中的key=value只怎,&用于分隔查詢參數(shù)中的多個鍵值對等。當組件中的普通數(shù)據(jù)包含這些特殊字符使怜俐,需要對其進行編碼身堡。
rfc3986中指定保留字符包括:!、*拍鲤、'贴谎、()、;季稳、:擅这、@、&景鼠、=仲翎、+、$铛漓、,溯香、/、?浓恶、#逐哈、[],此外问顷,還有一些字符也不能直接出現(xiàn)在 url中而需要編碼昂秃,比如:空格禀梳、引號、<>肠骆、#算途、%(用作編碼時使用的特殊字符)、{}蚀腿、|嘴瓤、\、^莉钙、[]廓脆、`、~等磁玉。
總之停忿,url中如果出現(xiàn)非字母和數(shù)字字符時,就去查一下rfc3986文檔以確認是否需要編碼蚊伞,而不是靠臆測席赂。
三、編解碼方式
url編碼(url encoding)也稱為百分號編碼(percent-encoding)时迫,即其使用百分號(%)加上兩位字符(0123456789abcdef)來代 表一個字節(jié)的十進制形式(即被編碼字符)颅停,其實就是用%+兩個十六進制字符來表示一個字符。url編碼默認使用的字符集是ascii掠拳,例如:字符a在 ascii碼中對應的十六進制是0x61(十進制是97)癞揉,那么url編碼后得到的就是%61。實際中溺欧,字符a是不需要編碼的烧董。
對于非ascii字符,需要使用ascii字符集的超集進行編碼得到相應的字節(jié)胧奔,然后對每個字節(jié)執(zhí)行百分號編碼。
對于unicode字符预吆,rfc文檔建議使用utf-8對其進行編碼得到相應的字節(jié)龙填,然后對每個字節(jié)執(zhí)行百分號編碼。例如:“中文”使用utf-8字符集 得到的字節(jié)為0xe4拐叉、0xb8岩遗、0xad、0xe6凤瘦、0x96宿礁、0x87,經(jīng)過url編碼之后得到%e4蔬芥、%b8梆靖、%ad控汉、%e6、%96返吻、%87姑子。
各種語言都需要編寫自己對應的編碼和解碼函數(shù),c/c++的可以參見這里测僵。此處街佑,以javascript為例說明之,javascript中提供了3對函數(shù)用于對url進行編碼和解碼捍靠,分別是escape/unescape沐旨、encodeuricomponent/decodeuricomponent、encodeuri/decodeuri榨婆。
escape編碼基本已經(jīng)廢棄磁携,后兩者使用utf-8對非ascii字符進行編碼,然后再進行百分號編碼纲辽,這是rfc推薦使用的方式颜武。
encodeuricomponent和encodeuri區(qū)別在于適用場合不同:encodeuricomponent被用作對uri的一個組件進行編碼,而encodeuri被用作對一個完整的uri進行編碼拖吼。
二者編碼字符范圍不一樣鳞上,即前者比后者范圍大。附上三者無需編解碼的字符范圍作為結(jié)束:
(1)escape(69個):吊档、/篙议、@、+怠硼、-鬼贱、.、_香璃、0-9这难、a-z、a-z
(2)encodeuricomponent(71個):!葡秒、'姻乓、()、眯牧、-蹋岩、.、学少、~剪个、0-9、a-z版确、a-z
(3)encodeuri(82個):!扣囊、#乎折、$、&如暖、'笆檀、()、*盒至、+酗洒、,、/枷遂、:樱衷、;、=酒唉、?矩桂、@、-痪伦、.侄榴、、~网沾、0-9癞蚕、a-z、a-z