JAVA通過http訪問其他服務端API


項目要實現這么一個功能,用戶通過點擊按鈕,通過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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM