項目要實現這么一個功能,用戶通過點擊按鈕,通過axios來訪問python的API(算法,java不好做)得到一個結果存儲到數據庫並且返回到頁面。
但是python不是在tomcat上面運行的,所以不在一個域內session不能共享,考慮到安全問題,決定從java當作客戶端來調用python的API獲取數據。
開始考慮用netty,但是感覺沒必要,不如利用java的io和net來做,然后寫了一個工具類,用於JAVA訪問任意服務端的API。
代碼如下,注釋寫好了,可以直接用。
package com.sdnuode.nuofe.util; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.*; public class RequestUtils { //GET請求時可以只傳遞一個API地址參數 public static ArrayList<HashMap> runRequest(String requestUrl){ return runRequest(requestUrl, "GET", new HashMap<>()); } //訪問服務端API,三個參數,分別是API地址,請求方式,數據/參數 //Params請求傳遞Map,Data請求傳遞JSON字符串 public static ArrayList<HashMap> runRequest(String requestUrl, String method, Object info){ StringBuffer buffer = new StringBuffer();//用於存儲返回數據 try { URL url = new URL(requestUrl);//創建URL對象 //對請求方式為GET和空值進行處理 if (method == "GET"){ url = new URL(requestUrl+"?"+urlencode(info));//拼接URL } if (method != "GET" && method != "POST") { return new ArrayList<HashMap>();//只處理GET和POST請求,其他請求不做處理 } //配置連接屬性 HttpURLConnection httpUrlConn = (HttpURLConnection)url.openConnection();//創建連接對象 httpUrlConn.setDoInput(true);// 從HttpUrlConntion讀入,默認true httpUrlConn.setDoOutput(true);// post求情向httpUrlConntion讀出,默認flase httpUrlConn.setUseCaches(false);// post請求不使用緩存 httpUrlConn.setRequestMethod(method);// 請求方式,默認GET httpUrlConn.setRequestProperty("Connection", "Keep-Alive");//建議Http為長鏈接,提高響應速度 httpUrlConn.setRequestProperty("Charset", "UTF-8");//字符編碼 httpUrlConn.setRequestProperty("Content-Type","application/json; charset=UTF-8");// 傳輸json格式 httpUrlConn.setRequestProperty("accept","application/json");// 接收類型json //httpUrlConn.setRequestProperty("accept","*/*")//暴力方法設置接受所有類型,防止出現415 if(method == "POST") { byte[] writebytes = "".getBytes(); if (info != null){ writebytes = info.toString().getBytes();//字符流轉字節流 } httpUrlConn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));//設置文件長度 OutputStream outwritestream = httpUrlConn.getOutputStream();//創建輸出流對象 outwritestream.write(info.toString().getBytes());//輸出流的內容,可以傳3個參數,默認從0到len outwritestream.flush();//清空數據(讀完未必寫完,緩沖區有遺留的可能) outwritestream.close();//關閉輸出流 } httpUrlConn.connect();//開始連接,配置信息必須在連接前設置完畢 int statusCode = httpUrlConn.getResponseCode();//獲取狀態碼 if(statusCode == 200){ InputStream inputStream = httpUrlConn.getInputStream();//獲取輸入流 //字節流轉字符流 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader);//讀取字符流 String str = null; //將讀取到的字符流賦值給buffer,readLine為讀取一行,當前行為null時,表示已經讀完 while((str = bufferedReader.readLine()) != null) { buffer.append(str); } //關閉bufferReader和輸入流 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); inputStream = null;//清空輸入流 httpUrlConn.disconnect();//斷開連接 } } catch (Exception e) { e.printStackTrace(); } //將buffer轉換成ArrayList格式 if(buffer.length() != 0){ JSONArray jsonArray = JSONArray.fromObject(buffer.toString()); ArrayList<HashMap> arrayList = JSONArrayObjectToArrayListHashMap(jsonArray); return JSONArrayObjectToArrayListHashMap(jsonArray); }else { return new ArrayList<HashMap>(); } } //GET請求URL處理 public static String urlencode(Object params){ if(params == null){ return ""; } StringBuilder sb = new StringBuilder(); Map<String,Object> map = (Map)params; for (Map.Entry i : map.entrySet()) { try {sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } String str = sb.toString(); if(str.length() != 0){ str = str.substring(0,str.length()-1); } return str; } //JSONArray<Object>轉換ArrayList<HashMap> public static ArrayList<HashMap> JSONArrayObjectToArrayListHashMap(JSONArray jsonArray){ ArrayList<HashMap> arrayList = new ArrayList(); for (int i = 0;i<jsonArray.size();i++){ JSONObject jsonObject = JSONObject.fromObject(jsonArray.get(i)); Iterator it = jsonObject.keys(); while (it.hasNext()) { HashMap hashMap = new HashMap(); String key = String.valueOf(it.next()); String value = (String)jsonObject.get(key); hashMap.put(key,value); arrayList.add(hashMap); } } return arrayList; } }