spring boot中 使用http請求


因為項目需求,需要兩個系統之間進行通信,經過一番調研,決定使用http請求。
服務端沒有什么好說的,本來就是使用web 頁面進行訪問的,所以spring boot啟動后,controller層的接口就自動暴露出來了,客戶端通過調用對應的url即可,所以這里主要就客戶端。
 
首先我自定義了一個用來處理http 請求的工具類 DeviceFactoryHttp,
既然是url訪問,那就有兩個問題需要處理,一個請求服務的url,和請求服務端的參數,客戶端的消息頭
請求服務的url:請求服務端url我定義的是跟客戶端一個樣的url
服務端的參數:服務端的參數有兩種一種經過封裝的,類似下面這樣:
http://localhost:8080/switch/getAllStatus?data{"interface name”:”getAllStudentStaus”}
一種是沒有經過封裝的,類似下面這樣:
http://localhost:8080/switch/getStudentInfoByName?name=zhangSan
 
首先是經過封裝:
一:初始化httpclient
private static HttpClient client = null;
static {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(128);
cm.setDefaultMaxPerRoute(128);
client = HttpClients.custom().setConnectionManager(cm).build();
}
二:獲取請求的url,因為我服務端定義的url與客戶端一樣,所以我直接使用請求客戶端的url
//根據request獲取請求的url
public  StringBuffer getUrlToRequest(HttpServletRequest request) {
StringBuffer url=request.getRequestURL();//獲取請求的url(http://localhost:8080/switch/getStudentInfoByName)
String[] splitArr=url.toString().split("/");
String appName=splitArr[3];//項目名稱
String ipReport=splitArr[2];//項目ip:report
String resultStr=url.toString().replaceAll(appName,DevFacConstans.facname).replaceAll(ipReport, DevFacConstans.ip+":"+DevFacConstans.report);
return new StringBuffer(resultStr);
}
獲取url根據/ 進行split,因為我這是測試環境,生產環境ip,端口號(域名)肯定不是localhost,有的前面還會加上項目名稱,
所以我split對應的值來進行替換。
三:拼裝請求參數,調用http請求
/**
* 發送http請求 有request
* 給controller層調用
* @param request
* @return
*/
public String sendHttpToDevFac(HttpServletRequest request)throws Exception {
HttpClient client = null;
String returnResult="";
StringBuffer urlBuffer=getUrlToRequest(request);//調用第二步,獲取url
//獲取參數並拼裝
String dataAsJson = request.getParameter("data");
String encoderData=URLEncoder.encode(dataAsJson,"utf-8");
HttpGet get=new HttpGet(urlBuffer.append("?data=").append(encoderData).toString());
//set headers
Enumeration<String> headerNames=request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName=headerNames.nextElement();
String headerValue=request.getHeader(headerName);
get.setHeader(headerName, headerValue);
}
client=DeviceFactoryHttp.client;
logger.info("開始調用http請求,請求url:"+urlBuffer.toString());
HttpResponse rep=client.execute(get);
returnResult=EntityUtils.toString(rep.getEntity(),"utf-8");
logger.info("http 請求調用結束!!");
return returnResult;
}
先獲取請求的參數,再將參數拼裝在url后面,URLEncoder.encode 這個不要忘了,因為參數會有一些符號,需要對參數進行編碼后再加入url,否則就會拋出異常,
set headers:因為有部分信息服務端會從請求頭中取出,所以我將客戶端的請求頭也set到服務端的request中,請求的url和請求的參數拼好就就可以client.exceute(get)執行請求了。
 
上面的是我瀏覽器直接將request請求作為參數傳到我客戶端,我所以我可以直接從request中獲取url,有的是沒有request,就需要從request的上下文環境中取了。
沒有經過封裝的:
首先從上下文中獲取request的
/**
* 獲取request
* @return
*/
public static HttpServletRequest getRequest(){
  ServletRequestAttributes ra= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  HttpServletRequest request ra.getRequest();
  return request;
}
二:有了request后,就有了url,下面再來解析請求參數,因為這個參數是沒有封裝的,所以獲取所有的請求參數
/**
     * 沒有request 請求,給controller層調用
     * @param key
     * @param interfaceName
     * @param strings
     * @return
     * @throws Exception
     */
    public String centerToDeviceFacNoRequest(String key,String interfaceName)throws Exception {
        try {
                
                HttpServletRequest request=getRequest();//上面第一步,從上下文中獲取url
                //獲取reuquest請求參數
                Enumeration<String> names=  request.getParameterNames();
                Map<String,String>paramMap=new HashMap<>();
                //遍歷請求map
                while(names.hasMoreElements()) {
                    String name=names.nextElement();
                    String value=(String) request.getParameter(name);
                    paramMap.put(name, value);
                }
                //調用發送http請求的方法
                return sendHttpToDevFacNoData(paramMap,request);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //end
        return null;
    }

 

三:發送http請求
/**
     * 發送http請求,【沒有data數據的】
     * @return
     */
    public String sendHttpToDevFacNoData(Map<String,String>paramMap,HttpServletRequest request)throws Exception {
        HttpClient client = null;
        String result="";
        StringBuffer dataBuffer=getUrlToRequest(request);//獲取url
        dataBuffer.append("?");
        client=DeviceFactoryHttp.client;
        
        Iterator<Entry<String, String>> paamIt=paramMap.entrySet().iterator();
        while(paamIt.hasNext()) {
            Entry<String, String> entry=paamIt.next();
            dataBuffer.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }
        String resultUrl=dataBuffer.toString().substring(0, dataBuffer.toString().lastIndexOf("&"));
        
        //發送請求
        HttpGet get=new HttpGet(resultUrl);
        //set headers
        Enumeration<String> headerNames=request.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String headerName=headerNames.nextElement();
            String headerValue=request.getHeader(headerName);
            get.setHeader(headerName, headerValue);
            
        }
        HttpResponse rep=client.execute(get);
        logger.info("開始調用http請求,請求url:"+resultUrl);
        //返回結果
        result=EntityUtils.toString(rep.getEntity(),"utf-8");
        logger.info(" http 請求調用結束!!");
        
        return result;
    }

 


免責聲明!

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



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