引言
最近公司專案遇到專案之間的專案呼叫,通過HttpURLConnection實作的,不過在此程序中,遇到了中文和特殊字符的問題,結果最后排查半天是因為中文和特殊字符(%)導致的介面調不通或是調通介面后,決議資料出現例外,問題很隱蔽難排查,不過好在最后還是功夫不負有心人,只是耽誤了點時間!
1:呼叫URL中出現中文引數的問題
//洗掉VBD-IIS大資料違法記錄 public boolean delVehicleBigData(String vehicleBigDataUrl,String plateNo,String passTime){ boolean flag=false; StringBuffer strURLCount = new StringBuffer();
//vehicleBigDataUrl請求路徑 如:http://10.30.27.153:8090 strURLCount.append(vehicleBigDataUrl + "/VBD/illegal/deleteIllegalData?"); try { strURLCount.append("plateNo="+URLEncoder.encode(plateNo,"utf-8")); //鄂AK7259 strURLCount.append("&passTime="+URLEncoder.encode(passTime,"utf-8")); JSONObject jsonObject = Tools.insert(strURLCount.toString()); if(jsonObject.isNullObject()){ LogUtil.error("jsonObject = null"); flag=false; } int ret = jsonObject.getInt("ret"); if(0 != ret){ LogUtil.error("ret = " + ret); flag=true; }else{ flag=false; } }catch(UnsupportedEncodingException e1) { e1.printStackTrace(); } return flag; }
Tools幫助類
/** * 方法說明: 呼叫URL回傳結果 * * @param Url * @return * @作者及日期:zhaosqing 2020-09-21 * @修改人及日期:zhaosqing 2020-09-21 * @修改描述: * @其他: */ public static JSONObject insert(String Url){ if(null == Url){ return null; } StringBuffer strBuffer = new StringBuffer(); BufferedReader brd =null; HttpURLConnection connet = null; try { URL url = new URL(Url); //實體一個HTTP CONNECT connet = (HttpURLConnection) url.openConnection(); connet.setRequestMethod("GET"); connet.setDoOutput(true); connet.setDoInput(true); connet.setUseCaches(false); connet.setConnectTimeout(300000); connet.setReadTimeout(300000); connet.connect(); if(connet.getResponseCode() != 200){ throw new IOException(connet.getResponseMessage()); } //將回傳的值存入到String中 brd = new BufferedReader(new InputStreamReader(connet.getInputStream(),"utf8")); String line=brd.readLine(); while(line != null){ line = java.net.URLDecoder.decode(line, "UTF-8"); strBuffer.append(line); line = brd.readLine(); } } catch (MalformedURLException e) { LogUtil.error("insert MalformedURLException:" + e.getMessage()); return null; } catch (IOException e) { LogUtil.error("insert IOException:" + e.getMessage()); return null; }finally{ if(brd !=null){ try { brd.close(); } catch (IOException e) { } } if(connet!=null){ connet.disconnect(); } } return JSONObject.fromObject(strBuffer.toString()); }
因為呼叫URL的里邊包含車牌號plateNo和同行時間passTime,車牌號必要會帶中文引數的,如鄂AK7259,這就會導致呼叫http請求的時候,請求失敗,只有先將plateNo通過URLEncoder.encode(plateNo,"utf-8"))編碼后,然后再拼接到url中,最后接收請求的時候,在通過解碼的方式,將其還原成中文,如:String plaeteNo= URLDecoder.decode(illegal .getPlateNo(),"utf-8");
2:呼叫URL回傳結果中包含特殊字符如(%)
/** * 獲取大資料違法型別串列 * @param vehicleBigDataUrl * @return * @throws Exception */ public List<ItsCodewfdm> getAllwfdmCodeList() throws Exception{ List<ItsCodewfdm> list=new ArrayList<ItsCodewfdm>(); String vehicleBigDataUrl=this.vehicleBigDataUrl();//獲取大資料服務器的ip和埠 StringBuffer strURLCount = new StringBuffer(); try {
//vehicleBigDataUrl 請求的url 如 http://10.30.27.153:8090 strURLCount.append(vehicleBigDataUrl + "/VBD/illegal/queryAllwfdmCodeList"); JSONObject jsonObject = Tools.getWfdmCodeListByVBD(strURLCount.toString()); if(jsonObject.isNullObject()){ LogUtil.error("jsonObject = null"); return list; } String content=jsonObject.getString("content"); JSONArray array= JSONArray.fromObject(content); if(array!=null && array.size()>0){ for(int i=0;i<array.size();i++){ ItsCodewfdm wfdm =new ItsCodewfdm(); wfdm.setDm(array.getJSONObject(i).getString("dm")); wfdm.setWfxw(array.getJSONObject(i).getString("wfxw")); list.add(wfdm); } } } catch (Exception e) { e.printStackTrace(); } return list; }
Tools幫助類
/** * 方法說明: 呼叫URL回傳結果 * 回傳vbd違法型別資料 * @param Url * @return * @作者及日期:zhaosqing 2020-09-20 * @修改描述: * @其他: */ public static JSONObject getWfdmCodeListByVBD(String Url){ if(null == Url){ return null; } StringBuffer strBuffer = new StringBuffer(); BufferedReader brd =null; HttpURLConnection connet = null; try { URL url = new URL(Url); //實體一個HTTP CONNECT connet = (HttpURLConnection) url.openConnection(); connet.setRequestMethod("GET"); connet.setDoOutput(true); connet.setDoInput(true); connet.setUseCaches(false); connet.setConnectTimeout(300000); connet.setReadTimeout(300000); connet.connect(); if(connet.getResponseCode() != 200){ throw new IOException(connet.getResponseMessage()); } //將回傳的值存入到String中 brd = new BufferedReader(new InputStreamReader(connet.getInputStream(),"utf8")); String line=brd.readLine(); //處理回傳結果中包含%的問題 (如:超速20%-50%) if(line.contains("%")){ line=URLEncoder.encode(line,"UTF-8"); } while(line != null){ line = java.net.URLDecoder.decode(line, "UTF-8"); strBuffer.append(line); line = brd.readLine(); } } catch (MalformedURLException e) { LogUtil.error("insert MalformedURLException:" + e.getMessage()); return null; } catch (IOException e) { LogUtil.error("insert IOException:" + e.getMessage()); return null; }finally{ if(brd !=null){ try { brd.close(); } catch (IOException e) { } } if(connet!=null){ connet.disconnect(); } } return JSONObject.fromObject(strBuffer.toString()); }
因為請求url后通過IO流的方式獲取查詢到的結果然后決議,在回傳的line結果中包含特殊字符,然后通過URLDecoder.decode(line, "UTF-8");進行解碼后就出現例外了,所以得判斷一下,時候包含特殊字符,如果包含就先將其URLEncoder.encode(line,"UTF-8");編碼再解碼就不會出現問題,
至此,問題排查分析完了,不過在當初專案中你排查的時候,可是費了一番功夫排查的,因為專案部署在服務器Linux系統上,不能遠程debug,只有慢慢分析代碼打日志排查了!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119888.html
標籤:Java
