因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用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<>(); //遍历请求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; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Golang发送http GET请求的示例代码,包括了Golang发送http GET请求的示例代码的使用技巧和注意事项,需要的朋友参考一下 使用标准库http来实现 以上就是Golang发送http GET请求的示例代码的详细内容,更多关于Golang发送http GET请求的资料请关注呐喊教程其它相关文章!
本文向大家介绍SpringBoot使用Jsp的示例代码,包括了SpringBoot使用Jsp的示例代码的使用技巧和注意事项,需要的朋友参考一下 本文是简单总结一下SpringBoot使用Jsp的Demo。 前言 在早期做项目的时候,JSP是我们经常使用的java服务器页面,其实就是一个简化servlet的设计,在本文开始之前,回顾一下jsp的几大对象,如图。 而在现在SpringBoot框架流行的
本文向大家介绍SpringBoot项目中使用Mockito的示例代码,包括了SpringBoot项目中使用Mockito的示例代码的使用技巧和注意事项,需要的朋友参考一下 Spring Boot可以和大部分流行的测试框架协同工作:通过Spring JUnit创建单元测试;生成测试数据初始化数据库用于测试;Spring Boot可以跟BDD(Behavier Driven Development)工
本文向大家介绍python用requests实现http请求代码实例,包括了python用requests实现http请求代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python用requests实现http请求过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. get 2. post请求 3. 登录 以上就是本
主要内容:Maven依赖关系,HTTP Delete请求方法示例本教程演示如何使用Apache HttpClient 4.5创建Http 请求。 HTTP 请求方法请求删除由URI指定的资源。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache 版本。 将以下依赖项添加到您的项目中,以便创建HTTP 请求方法。 pom.xml 文件的内容如下 - HTTP Delete请求方法示例 在以下示例中,我们将数据发布到资源URL: 。 该资源确
主要内容:Maven依赖关系,HTTP PUT请求方法示例本教程演示如何使用Apache 发出Http PUT请求。 HTTP PUT请求方法请求服务器接受并存储提供的URI中包含的实体。 如果该URI引用已经存在的资源,则该资源被修改; 如果URI不指向现有资源,则服务器可以使用该URI创建资源。 Maven依赖关系 我们使用maven来管理依赖关系,并使用Apache 版本。 将以下依赖项添加到您的项目中,以便创建HTTP PUT请求方法。 pom.