http 400錯誤現象:
使用java代碼訪問某PDF文件地址, 報了http 400錯誤 ,瀏覽器卻能正常訪問 . 所以猜測瀏覽器對地址做了額外處理.
異常代碼
String srcUrl = "http://www.abc.com/王小丫/go/home";
InputStream inputStream = new URL(srcUrl).openStream();
上述URL類的openStream()方法內部其實還是用到了URLConnection openConnection(URL u);
其實代碼本身是沒有任何問題的, 錯就錯在這個地址含有中文上了. 我的請求地址類似於http://www.abc.com/王小丫/go/home
解決方法
現在我們重點是需要對 http://www.abc.com/ 之后的 "王小丫/go/home" 做URLEncoder.encode(srcString, "UTF-8"); 處理. (其實重點只在"王小丫"這三個字上,但是為了以防路徑中其它地址又存在中文,所以還是對域名www.abc.com/之后的所有路徑全encode更保險.
使用與正則解析並處理后,得到的URL將是: http://www.abc.com/%E7%8E%8B%E5%B0%8F%E4%B8%AB%2Fgo%2Fhome
public static String handleUrl(String url) {
if (url != null) { Pattern p = Pattern.compile("(http://.*?/)(.*)"); Matcher m = p.matcher(url); if (m.find()) { String str1 = m.group(1).trim(); String str2 = m.group(2).trim(); try { str2 = URLEncoder.encode(str2, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } url = str1 + str2; } } return url; }
這個時候再用 以下代碼去獲取InputStream就再也不會報錯了.
String srcUrl = "http://www.abc.com/%E7%8E%8B%E5%B0%8F%E4%B8%AB%2Fgo%2Fhome";
InputStream inputStream = new URL(srcUrl).openStream();