使用WebView進行postUrl請求傳送引數過程中資料丟失或錯誤的問題。
這幾天在使用webview進行postUrl的時候出現引數丟失的問題。
最近公司的專案,進行對接第三方支付。具體流程是客戶端請求後臺介面,把後臺返回的引數拼接到Url後與第三方支付進行互動,用webview展示第三方的頁面,webview需要post來傳遞一些引數:
String HfSubmitUrl = mBody.getHfSubmitUrl(); String HfPostData = "Version=" + mBody.getVersion() + "&CmdId=" + mBody.getCmdId() + "&MerCustId=" + mBody.getMerCustId() + "&RetUrl=" + mBody.getRetUrl() + "&BgRetUrl=" + mBody.getBgRetUrl() + "&UsrId=" + mBody.getUsrId() + "&UsrName=" + mBody.getUsrName() + "&IdType=" + mBody.getIdType() + "&IdNo=" + mBody.getIdNo() + "&MerPriv=" + mBody.getMerPriv() + "&PageType=" + mBody.getPageType() + "&ChkValue=" + mBody.getChkValue(); mView.postUrl(HfSubmitUrl,EncodingUtils.getBytes(HfPostDatas, "base64"));
但是不同的賬號請求後臺返回的引數裡會不同,在於第三方支付互動的時候出現了問題,引數明明傳的沒有問題。從後臺解析中發現是引數錯誤。
仔細檢視過後,原來是在資料進行base64加密的時候出現了問題,引數中帶有"+"號的全都不翼而飛了,變成了空格,第三方接收到的引數不對,頁面也就會報錯。
隨後在網上查了資料,上面說"+"號在url中屬於特殊符號可能在伺服器端無法獲得正確的引數值,包括還有“=”、空格、“%”、“&”、“#”。於是
try { postData = URLEncoder.encode(data.toString(), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
URLEncoder就對字元進行了比較好的處理了。
但是,有些情況是可以這麼處理,如果處理一整串,那就會把其他的字元也換轉換,引數又會錯誤。所以最終的辦法就是用replaceAll把帶有“+”號的地方全部替換成“%2B”String HfPostDatas = HfPostData.replaceAll("\\+", "%2B");
這樣就能完美的解決這個問題了。
附加:
+ URL 中+號表示空格 %2B
空格 URL中的空格可以用+號或者編碼 %20
/ 分隔目錄和子目錄 %2F
? 分隔實際的URL和引數 %3F
% 指定特殊字元 %25
# 表示書籤 %23
& URL 中指定的引數間的分隔符 %26
= URL 中指定引數的值 %3D