加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

spring boot中使用http请求的示例代码

发布时间:2020-12-14 20:23:52 所属栏目:Java 来源:网络整理
导读:因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用http请求。 服务端没有什么好说的,本来就是使用web 页面进行访问的,所以spring boot启动后,controller层的接口就自动暴露出来了,客户端通过调用对应的url即可,所以这里主要就客户端。

因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用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;
 } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读