因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用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="";
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<>();
//遍历请求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请求
/**
* 发送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;
}

spring boot中 使用http请求的更多相关文章

  1. Spring Boot中扩展XML请求和响应的支持

    在Spring Boot中,我们大多时候都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式返回一 ...

  2. spring boot中使用AJAX请求,并将回调函数赋值给input输入框

    HTML: <script>/* $(document).ready(function(){} 页面加载事件,加载完页面之后执行 */ $(document).ready(function ...

  3. Spring Boot中如何扩展XML请求和响应的支持

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  4. Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

  5. 【spring boot】spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面

    问题描述: spring boot中使用@RestController不起作用,不返回json,依旧去找访问接口的请求地址对应的页面 表现结果: 1>使用postman测试接口,表现为返回是40 ...

  6. Spring Boot中使用AOP记录请求日志

    这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...

  7. 46. Spring Boot中使用AOP统一处理Web请求日志

    在之前一系列的文章中都是提供了全部的代码,在之后的文章中就提供核心的代码进行讲解.有什么问题大家可以给我留言或者加我QQ,进行咨询. AOP为Aspect Oriented Programming的缩 ...

  8. 转:Spring Boot中使用AOP统一处理Web请求日志

    在spring boot中,简单几步,使用spring AOP实现一个拦截器: 1.引入依赖: <dependency> <groupId>org.springframewor ...

  9. Spring Boot中的注解

    文章来源:http://www.tuicool.com/articles/bQnMra 在Spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了 ...

随机推荐

  1. 【set】bzoj2761 [JLOI2011]不重复数字

    set去重. #include<cstdio> #include<set> using namespace std; set<int>S; ],b[],en; in ...

  2. 使用layer.js注意事项

    一.使用时,将layer整个文件夹放置你站点的任何一个目录,layer.js 开发版,layer.min.js 压缩版,引入其中一个即可.css等其它文件无需引入. 二.如果您的js引入是通过合并处理 ...

  3. Fatal error: Maximum execution time of 30 seconds exceeded in

    Fatal error: Maximum execution time of 30 seconds exceeded in C:\Program Files\Apache Software Found ...

  4. C#的Xamarin开发小米盒子应用并以WCF实现微信通知

    对于熟悉C#语言的开发人员而言,用Xamarin开发Android应用也是一个不错的选择.小米盒子是Android系统.当然也就能够使用Xamarin来开发.首选来看效果图. watermark/2/ ...

  5. 使用.reg文件删除暴风影视库图标和注册信息

    暴风播放器安装后会自动安装一个叫暴风影音库的软件,在你的电脑资源管理器中增加了一个“暴风影视库”的图标.看着很烦,删起来还比较麻烦,于是搜索了相关资源,自己写了个注册表处理文件,方便大家一键删除之. ...

  6. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.6.集群管理命令

    3.6. 集群管理命令 3.6.1. RAC的启动与关闭 oracle rac默认会开机自启动,如需维护时可使用以下命令: 关闭: crsctl stop cluster 停止本节点集群服务 crsc ...

  7. Actionscript 3 自定义 matedata

    metadata就是元数据 反应一个类本质的属性 可以通过describeType(obj)来得到反应该对象的xml 要自定义元数据,如[MyMatedata()] package {  public ...

  8. java源码阅读LinkedBlockingQueue

    1类签名与简介 public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements Blocking ...

  9. 【面试问题】—— 2019.3月前端面试之JS原理&CSS基础&Vue框架

    前言:三月中旬面试了两家公司,一家小型公司只有面试,另一家稍大型公司笔试之后一面定夺.笔试部分属于基础类型,网上的复习资料都有. 面试时两位面试官都有考到一些实际工作中会用到,但我还没接触过的知识点. ...

  10. 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何获取标准驱动器扭矩值获取电流值

    双击某个驱动器(以松下伺服驱动器为例),在Process Data中,注意默认显示了PDO mapping1的数据(Error code, status word等)   注意左侧,2和3分别表示了与 ...