欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-04 11:12:16
因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用http请求。 服务端没有什么好说的,本来就是使用web 页面进行访问的,所以spring boot启动后,...

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

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