• spring boot中 使用http请求


    因为项目需求,需要两个系统之间进行通信,经过一番调研,决定使用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;
        }
    
  • 相关阅读:
    推荐:VisualStudio 2005/2008的“Consolas”字体包
    [转]Calendar 動態產生子控制項的 Event Handler, 模拟__doPostBack() 回发
    Ajax ToolKit ModelPopupExtender应用经验二则
    [转]Calendar 控件日期复选
    ASP.NET偷懒大法六(可空类型的动态赋值)
    弹出层(Div)屏蔽父窗口并且让父窗口变暗
    CSS巧用expression来区分只读文本框
    formValidator用户注册表单自动验证
    基于Session原理的验证码方案
    jQuery解决IE6下PNG图片背景透明问题
  • 原文地址:https://www.cnblogs.com/zhangXingSheng/p/7745009.html
Copyright © 2020-2023  润新知