spring boot中使用http请求的示例代码
因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用http请求。
服务端没有什么好说的,本来就是使用web页面进行访问的,所以springboot启动后,controller层的接口就自动暴露出来了,客户端通过调用对应的url即可,所以这里主要就客户端。
首先我自定义了一个用来处理http请求的工具类DeviceFactoryHttp,既然是url访问,那就有两个问题需要处理,一个请求服务的url,和请求服务端的参数,客户端的消息头请求服务的url:请求服务端url我定义的是跟客户端一个样的url服务端的参数:服务端的参数有两种一种经过封装的,类似下面这样:
http://localhost:8080/switch/getAllStatus?data{"interfacename”:”getAllStudentStaus”}
一种是没有经过封装的,类似下面这样:
http://localhost:8080/switch/getStudentInfoByName?name=zhangSan
首先是经过封装:
一:初始化httpclient
privatestaticHttpClientclient=null;
static{
PoolingHttpClientConnectionManagercm=newPoolingHttpClientConnectionManager();
cm.setMaxTotal(128);
cm.setDefaultMaxPerRoute(128);
client=HttpClients.custom().setConnectionManager(cm).build();
}
二:获取请求的url,因为我服务端定义的url与客户端一样,所以我直接使用请求客户端的url
//根据request获取请求的url
publicStringBuffergetUrlToRequest(HttpServletRequestrequest){
StringBufferurl=request.getRequestURL();//获取请求的url(http://localhost:8080/switch/getStudentInfoByName)
String[]splitArr=url.toString().split("/");
StringappName=splitArr[3];//项目名称
StringipReport=splitArr[2];//项目ip:report
StringresultStr=url.toString().replaceAll(appName,DevFacConstans.facname).replaceAll(ipReport,DevFacConstans.ip+":"+DevFacConstans.report);
returnnewStringBuffer(resultStr);
}
获取url根据/进行split,因为我这是测试环境,生产环境ip,端口号(域名)肯定不是localhost,有的前面还会加上项目名称,所以我split对应的值来进行替换。
三:拼装请求参数,调用http请求
/**
*发送http请求有request
*给controller层调用
*@paramrequest
*@return
*/
publicStringsendHttpToDevFac(HttpServletRequestrequest)throwsException{
HttpClientclient=null;
StringreturnResult="";
//http://localhost:8080/leo/1.0/h5/login
StringBufferurlBuffer=getUrlToRequest(request);//调用第二步,获取url
//获取参数并拼装
StringdataAsJson=request.getParameter("data");
StringencoderData=URLEncoder.encode(dataAsJson,"utf-8");
HttpGetget=newHttpGet(urlBuffer.append("?data=").append(encoderData).toString());
//setheaders
EnumerationheaderNames=request.getHeaderNames();
while(headerNames.hasMoreElements()){
StringheaderName=headerNames.nextElement();
StringheaderValue=request.getHeader(headerName);
get.setHeader(headerName,headerValue);
}
client=DeviceFactoryHttp.client;
logger.info("开始调用http请求,请求url:"+urlBuffer.toString());
HttpResponserep=client.execute(get);
returnResult=EntityUtils.toString(rep.getEntity(),"utf-8");
logger.info("http请求调用结束!!");
returnreturnResult;
}
先获取请求的参数,再将参数拼装在url后面,URLEncoder.encode这个不要忘了,因为参数会有一些符号,需要对参数进行编码后再加入url,否则就会抛出异常,setheaders:因为有部分信息服务端会从请求头中取出,所以我将客户端的请求头也set到服务端的request中,请求的url和请求的参数拼好就就可以client.exceute(get)执行请求了。
上面的是我浏览器直接将request请求作为参数传到我客户端,我所以我可以直接从request中获取url,有的是没有request,就需要从request的上下文环境中取了。
没有经过封装的:
首先从上下文中获取request的
/**
*获取request
*@return
*/
publicstaticHttpServletRequestgetRequest(){
ServletRequestAttributesra=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequestrequest=ra.getRequest();
returnrequest;
}
二:有了request后,就有了url,下面再来解析请求参数,因为这个参数是没有封装的,所以获取所有的请求参数
/**
*没有request请求,给controller层调用
*@paramkey
*@paraminterfaceName
*@paramstrings
*@return
*@throwsException
*/
publicStringcenterToDeviceFacNoRequest(Stringkey,StringinterfaceName)throwsException{
try{
HttpServletRequestrequest=getRequest();//上面第一步,从上下文中获取url
//获取reuquest请求参数
Enumerationnames=request.getParameterNames();
MapparamMap=newHashMap<>();
//遍历请求map
while(names.hasMoreElements()){
Stringname=names.nextElement();
Stringvalue=(String)request.getParameter(name);
paramMap.put(name,value);
}
//调用发送http请求的方法
returnsendHttpToDevFacNoData(paramMap,request);
}catch(Exceptione){
e.printStackTrace();
}
//end
returnnull;
}
三:发送http请求
/** *发送http请求,【没有data数据的】 *@return */ publicStringsendHttpToDevFacNoData(MapparamMap,HttpServletRequestrequest)throwsException{ HttpClientclient=null; Stringresult=""; StringBufferdataBuffer=getUrlToRequest(request);//获取url dataBuffer.append("?"); client=DeviceFactoryHttp.client; Iterator >paamIt=paramMap.entrySet().iterator(); while(paamIt.hasNext()){ Entry entry=paamIt.next(); dataBuffer.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } StringresultUrl=dataBuffer.toString().substring(0,dataBuffer.toString().lastIndexOf("&")); //发送请求 HttpGetget=newHttpGet(resultUrl); //setheaders Enumeration headerNames=request.getHeaderNames(); while(headerNames.hasMoreElements()){ StringheaderName=headerNames.nextElement(); StringheaderValue=request.getHeader(headerName); get.setHeader(headerName,headerValue); } HttpResponserep=client.execute(get); logger.info("开始调用http请求,请求url:"+resultUrl); //返回结果 result=EntityUtils.toString(rep.getEntity(),"utf-8"); logger.info("http请求调用结束!!"); returnresult; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。