spring boot中 使用http请求
生活随笔
收集整理的這篇文章主要介紹了
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=""; // http://localhost:8080/leo/1.0/h5/login 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<>();//遍歷請求mapwhile(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();}//endreturn 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);//獲取urldataBuffer.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 headersEnumeration<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;}?
轉載于:https://www.cnblogs.com/zhangXingSheng/p/7745009.html
總結
以上是生活随笔為你收集整理的spring boot中 使用http请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【loj6191】「美团 CodeM 复
- 下一篇: NOIP赛前模拟20171027总结