spring boot中使用http請(qǐng)求的示例代碼
因?yàn)轫?xiàng)目需求,需要兩個(gè)系統(tǒng)之間進(jìn)行通信,經(jīng)過一番調(diào)研,決定使用http請(qǐng)求。
服務(wù)端沒有什么好說的,本來就是使用web 頁面進(jìn)行訪問的,所以spring boot啟動(dòng)后,controller層的接口就自動(dòng)暴露出來了,客戶端通過調(diào)用對(duì)應(yīng)的url即可,所以這里主要就客戶端。
首先我自定義了一個(gè)用來處理http 請(qǐng)求的工具類DeviceFactoryHttp,既然是url訪問,那就有兩個(gè)問題需要處理,一個(gè)請(qǐng)求服務(wù)的url,和請(qǐng)求服務(wù)端的參數(shù),客戶端的消息頭請(qǐng)求服務(wù)的url:請(qǐng)求服務(wù)端url我定義的是跟客戶端一個(gè)樣的url服務(wù)端的參數(shù):服務(wù)端的參數(shù)有兩種一種經(jīng)過封裝的,類似下面這樣:
http://localhost:8080/switch/getAllStatus?data{"interface name”:”getAllStudentStaus”}
一種是沒有經(jīng)過封裝的,類似下面這樣:
http://localhost:8080/switch/getStudentInfoByName?name=zhangSan
首先是經(jīng)過封裝:
一:初始化httpclient
private static HttpClient client = null; static { PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(128); cm.setDefaultMaxPerRoute(128); client = HttpClients.custom().setConnectionManager(cm).build(); }
二:獲取請(qǐng)求的url,因?yàn)槲曳?wù)端定義的url與客戶端一樣,所以我直接使用請(qǐng)求客戶端的url
//根據(jù)request獲取請(qǐng)求的url public StringBuffer getUrlToRequest(HttpServletRequest request) { StringBuffer url=request.getRequestURL();//獲取請(qǐng)求的url(http://localhost:8080/switch/getStudentInfoByName) String[] splitArr=url.toString().split("/"); String appName=splitArr[3];//項(xiàng)目名稱 String ipReport=splitArr[2];//項(xiàng)目ip:report String resultStr=url.toString().replaceAll(appName,DevFacConstans.facname).replaceAll(ipReport, DevFacConstans.ip+":"+DevFacConstans.report); return new StringBuffer(resultStr); }
獲取url根據(jù)/ 進(jìn)行split,因?yàn)槲疫@是測(cè)試環(huán)境,生產(chǎn)環(huán)境ip,端口號(hào)(域名)肯定不是localhost,有的前面還會(huì)加上項(xiàng)目名稱,所以我split對(duì)應(yīng)的值來進(jìn)行替換。
三:拼裝請(qǐng)求參數(shù),調(diào)用http請(qǐng)求
/** * 發(fā)送http請(qǐng)求 有request * 給controller層調(diào)用 * @param request * @return */ public String sendHttpToDevFac(HttpServletRequest request)throws Exception { HttpClient client = null; String returnResult=""; // http://localhost:8080/leo/1.0/h5/login StringBuffer urlBuffer=getUrlToRequest(request);//調(diào)用第二步,獲取url //獲取參數(shù)并拼裝 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("開始調(diào)用http請(qǐng)求,請(qǐng)求url:"+urlBuffer.toString()); HttpResponse rep=client.execute(get); returnResult=EntityUtils.toString(rep.getEntity(),"utf-8"); logger.info("http 請(qǐng)求調(diào)用結(jié)束!!"); return returnResult; }
先獲取請(qǐng)求的參數(shù),再將參數(shù)拼裝在url后面,URLEncoder.encode 這個(gè)不要忘了,因?yàn)閰?shù)會(huì)有一些符號(hào),需要對(duì)參數(shù)進(jìn)行編碼后再加入url,否則就會(huì)拋出異常,set headers:因?yàn)橛胁糠中畔⒎?wù)端會(huì)從請(qǐng)求頭中取出,所以我將客戶端的請(qǐng)求頭也set到服務(wù)端的request中,請(qǐng)求的url和請(qǐng)求的參數(shù)拼好就就可以client.exceute(get)執(zhí)行請(qǐng)求了。
上面的是我瀏覽器直接將request請(qǐng)求作為參數(shù)傳到我客戶端,我所以我可以直接從request中獲取url,有的是沒有request,就需要從request的上下文環(huán)境中取了。
沒有經(jīng)過封裝的:
首先從上下文中獲取request的
/** * 獲取request * @return */ public static HttpServletRequest getRequest(){ ServletRequestAttributes ra= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = ra.getRequest(); return request; }
二:有了request后,就有了url,下面再來解析請(qǐng)求參數(shù),因?yàn)檫@個(gè)參數(shù)是沒有封裝的,所以獲取所有的請(qǐng)求參數(shù)
/** * 沒有request 請(qǐng)求,給controller層調(diào)用 * @param key * @param interfaceName * @param strings * @return * @throws Exception */ public String centerToDeviceFacNoRequest(String key,String interfaceName)throws Exception { try { HttpServletRequest request=getRequest();//上面第一步,從上下文中獲取url //獲取reuquest請(qǐng)求參數(shù) Enumeration<String> names= request.getParameterNames(); Map<String,String>paramMap=new HashMap<>(); //遍歷請(qǐng)求map while(names.hasMoreElements()) { String name=names.nextElement(); String value=(String) request.getParameter(name); paramMap.put(name, value); } //調(diào)用發(fā)送http請(qǐng)求的方法 return sendHttpToDevFacNoData(paramMap,request); } catch (Exception e) { e.printStackTrace(); } //end return null; }
三:發(fā)送http請(qǐng)求
/** * 發(fā)送http請(qǐng)求,【沒有data數(shù)據(jù)的】 * @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("&")); //發(fā)送請(qǐng)求 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("開始調(diào)用http請(qǐng)求,請(qǐng)求url:"+resultUrl); //返回結(jié)果 result=EntityUtils.toString(rep.getEntity(),"utf-8"); logger.info(" http 請(qǐng)求調(diào)用結(jié)束!!"); return result; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java中Json與List、Map、entity的互相轉(zhuǎn)化
在開發(fā)中,Json轉(zhuǎn)換的場(chǎng)景往往也就是那么幾個(gè),本文主要介紹了Java中Json與List、Map、entity的互相轉(zhuǎn)化,具有一定的參考價(jià)值,感興趣的可以了解一下2022-07-07Spring運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)bean的方法
這篇文章主要介紹了Spring運(yùn)行時(shí)動(dòng)態(tài)注冊(cè)bean的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Java 基礎(chǔ)全面講解StringBuffer類的使用
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder類,和String類不同的是,StringBuffer和 StringBuilder類的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象2022-01-01