1. 程式人生 > >Android中get請求的Url包含中文引數的解決方案

Android中get請求的Url包含中文引數的解決方案

後臺伺服器使用tomcat7。Android傳送get請求時報錯:

  • 錯誤資訊:九月 13, 2018 8:51:40 上午 org.apache.coyote.http11.AbstractHttp11Processor process  資訊: Error parsing HTTP request header  Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.  java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 
  • 錯誤原因:網上搜索發現是tomcat新版本的原因:由於tomcat的新版本增加了一個新特性,就是嚴格按照 RFC 3986規範進行訪問解析,而 RFC 3986規範定義了Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元(RFC3986中指定了以下字元為保留字元:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
  • 解決方案
  1. 在tomcat的配置檔案server.xml裡面配置新增紅色部分

    <Connector port="9998" maxHttpHeaderSize="8192"

                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

                   enableLookups="false" redirectPort="8443" acceptCount="100"

                   connectionTimeout="20000" disableUploadTimeout="true"useBodyEncodingForURI="true"   URIEncoding="UTF-8"/>

  2. 在Android端程式碼中對URL的引數或者整個URL路徑進行編碼格式的設定(根據自己需求參考下列程式碼)

//對引數進行編碼
String version = jsonObject.getString("version");
//對中文引數進行編碼
version= URLEncoder.encode(version,"UTF-8");
String apkUrl=Constant.BASEURL + "app_mobile!downloadApk.action?version=" + version;
//對路徑進行編碼 然後替換路徑中所有空格 編碼之後空格變成“+”而空格的編碼表示是“%20” 所以將所有的“+”替換成“%20”就可以了

 url = URLEncoder.encode(urlStr,"utf-8").replaceAll("\\+", "%20");
//編碼之後的路徑中的“/”也變成編碼的東西了 所有還有將其替換回來 這樣才是完整的路徑 
 url = url.replaceAll("%3A", ":").replaceAll("%2F", "/");

有的小夥伴可能只需要第一步就能解決,如果不行, 請兩步同時新增。