Android中get請求的Url包含中文引數的解決方案
阿新 • • 發佈:2018-12-09
後臺伺服器使用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中指定了以下字元為保留字元:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。
- 解決方案:
- 在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"/>
-
在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", "/");
有的小夥伴可能只需要第一步就能解決,如果不行, 請兩步同時新增。