因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用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
1
2
3
4
5
6
7
|
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
1
2
3
4
5
6
7
8
9
|
//根据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请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/**
* 发送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的
1
2
3
4
5
6
7
8
9
|
/**
* 获取request
* @return
*/
public static HttpServletRequest getRequest(){
ServletRequestAttributes ra= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = ra.getRequest();
return request;
}
|
二:有了request后,就有了url,下面再来解析请求参数,因为这个参数是没有封装的,所以获取所有的请求参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/**
* 没有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请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/**
* 发送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;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/zhangXingSheng/p/7745009.html