spring boot中使用http請(qǐng)求的示例代碼
因?yàn)轫?xiàng)目需求,需要兩個(gè)系統(tǒng)之間進(jìn)行通信,經(jīng)過(guò)一番調(diào)研,決定使用http請(qǐng)求。
服務(wù)端沒(méi)有什么好說(shuō)的,本來(lái)就是使用web 頁(yè)面進(jìn)行訪問(wèn)的,所以spring boot啟動(dòng)后,controller層的接口就自動(dòng)暴露出來(lái)了,客戶端通過(guò)調(diào)用對(duì)應(yīng)的url即可,所以這里主要就客戶端。
首先我自定義了一個(gè)用來(lái)處理http 請(qǐng)求的工具類DeviceFactoryHttp,既然是url訪問(wèn),那就有兩個(gè)問(wèn)題需要處理,一個(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)過(guò)封裝的,類似下面這樣:
http://localhost:8080/switch/getAllStatus?data{"interface name”:”getAllStudentStaus”}
一種是沒(méi)有經(jīng)過(guò)封裝的,類似下面這樣:
http://localhost:8080/switch/getStudentInfoByName?name=zhangSan
首先是經(jīng)過(guò)封裝:
一:初始化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)的值來(lái)進(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("開(kāi)始調(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,有的是沒(méi)有request,就需要從request的上下文環(huán)境中取了。
沒(méi)有經(jīng)過(guò)封裝的:
首先從上下文中獲取request的
/**
* 獲取request
* @return
*/
public static HttpServletRequest getRequest(){
ServletRequestAttributes ra= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ra.getRequest();
return request;
}
二:有了request后,就有了url,下面再來(lái)解析請(qǐng)求參數(shù),因?yàn)檫@個(gè)參數(shù)是沒(méi)有封裝的,所以獲取所有的請(qǐng)求參數(shù)
/**
* 沒(méi)有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)求,【沒(méi)有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("開(kāi)始調(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)文章
springboot掃碼登錄的簡(jiǎn)單實(shí)現(xiàn)
本文主要介紹基于SpringBoot + Vue + Android實(shí)現(xiàn)的掃碼登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
淺談byte和長(zhǎng)度為8的boolean數(shù)組互相轉(zhuǎn)換
下面小編就為大家?guī)?lái)一篇淺談byte和長(zhǎng)度為8的boolean數(shù)組互相轉(zhuǎn)換。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11
SpringBoot Admin健康檢查功能的實(shí)現(xiàn)
admin主要就是告訴運(yùn)維人員,服務(wù)出現(xiàn)異常,然后進(jìn)行通知(微信、郵件、短信、釘釘?shù)龋┛梢苑浅?焖偻ㄖ竭\(yùn)維人員,相當(dāng)報(bào)警功能,接下來(lái)通過(guò)本文給大家介紹SpringBoot Admin健康檢查的相關(guān)知識(shí),一起看看吧2021-06-06
解決nacos升級(jí)spring cloud 2020.0無(wú)法使用bootstrap.yml的問(wèn)題
這篇文章主要介紹了解決nacos升級(jí)spring cloud 2020.0無(wú)法使用bootstrap.yml的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot數(shù)據(jù)庫(kù)查詢超時(shí)配置詳解
這篇文章主要介紹了SpringBoot數(shù)據(jù)庫(kù)查詢超時(shí)配置,超時(shí)配置可以避免長(zhǎng)時(shí)間占用數(shù)據(jù)庫(kù)連接,提高系統(tǒng)的響應(yīng)速度和吞吐量,還可以快速的反饋可以提升用戶體驗(yàn),避免用戶因長(zhǎng)時(shí)間等待而感到挫敗,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2024-11-11
淺試仿?mapstruct實(shí)現(xiàn)微服務(wù)編排框架詳解
這篇文章主要為大家介紹了淺試仿?mapstruct實(shí)現(xiàn)微服務(wù)編排框架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之哈希算法實(shí)現(xiàn)
哈希表本質(zhì)是一種(key,value)結(jié)構(gòu),由此我們可以聯(lián)想到,能不能把哈希表的key映射成數(shù)組的索引index呢?如果這樣做的話那么查詢相當(dāng)于直接查詢索引,查詢時(shí)間復(fù)雜度為O(1),其實(shí)這也正是當(dāng)key為int型時(shí)的做法,將key通過(guò)某種做法映射成index,從而轉(zhuǎn)換成數(shù)組結(jié)構(gòu)2022-02-02
Java如何使用流去除集合中某個(gè)字段為空的對(duì)象
這篇文章主要給大家介紹了關(guān)于Java如何使用流去除集合中某個(gè)字段為空的對(duì)象,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-08-08

