1. 程式人生 > >使用WebView進行postUrl請求傳送引數過程中資料丟失或錯誤的問題。

使用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