请求http接口下载东西

package cn.linkey.rulelib.FBLC;

import java.lang.reflect.Array;
import java.util.*;
import cn.linkey.dao.*;
import cn.linkey.util.*;
import cn.linkey.doc.*;
import cn.linkey.factory.*;
import cn.linkey.wf.*;
import cn.linkey.rule.LinkeyRule;
import cn.linkey.org.LinkeyUser;
import cn.linkey.factory.BeanCtx;
import cn.linkey.util.Tools;
import net.sf.json.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.commons.lang3.StringUtils;
import java.io.*;
import java.net.*;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;

/**
 * @Title: <p>R_FBLC_B003_downloadTarFromProductionLib</p>
 * @Description: <p>从制品库下载war</p>
 * @author: 
 * @Date: 2019/8/22 19:18
 * @version: 1.0
 * @Copyright: . All rights reserved.
 */
final public class R_FBLC_B003_downloadTarFromProductionLib implements LinkeyRule {

    // 设置连接超时时间,单位毫秒。
    private static final int CONNECT_TIMEOUT = 6000;

    // 请求获取数据的超时时间(即响应时间),单位毫秒。
    private static final int SOCKET_TIMEOUT = 6000;

    //请求指定验证的用户名
    private String userName;

    //请求指定验证的密码
    private String password;

    //保存目录  "/usr/local/okit/bpmfiles/"
    private String filePath;

    //办公网段ip
    private String officeSegment;

    //日志前缀
    private String logPre = "[从制品库下载war]<R_FBLC_B003_downloadTarFromProductionLib>";

    /**
     * @Title: <p>run</p>
     * @Description: <p>从制品库下载war</p>
     * @param params
     * @return: java.lang.String
     * @author: 
     * @Date: 2019/8/22 19:18
     * @throws
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    @Override
    public String run(HashMap<String, Object> params) throws Exception  {

        /**
         * 1.返回值准备
         */
        JSONObject obj = new JSONObject();
        obj.put("result", true);
        obj.put("message", "下载完成!");

        /**
         * 2.参数校验
         */
        String objStr = init();
        if (null != objStr) {

            return objStr;

        }

        /**
         * 3.网段校验
         */
        objStr = isOfficeSegment();
        if (null != objStr) {

            return objStr;

        }

        /**
         * 4.数据准备
         */
        //String fileName = "IPDO_20190807165725.tar";
        String fileName = BeanCtx.g("fileName");
        //String openUrl = "http://22.5.104.1:8081/artifactory/IPDO-JFROG-DEV/sprint--deploy-20190807/69/IPDO_20190807165725.tar";   //文件URL地址
        String openUrl = BeanCtx.g("openUrl");
        BeanCtx.out(logPre + "入参:fileName=" + fileName + ",openUrl=" + openUrl);

        /**
         * 5.开始从制品库下载到本地
         */
        boolean success = getWarByGetMathod(openUrl, fileName);

        /**
         * 6.返回值校验
         */
        if(!success){

            obj.put("result", false);
            obj.put("message", "从制品库下载失败!");
            BeanCtx.out(logPre + "出参:obj=" + obj.toString());
            return obj.toString();

        }

        /**
         * 7.bpm从本地下载
         */
        Tools tools = new Tools();
        tools.downloadFile(filePath + fileName, fileName);
        BeanCtx.out("success");

        /**
         * 8.出参日志
         */
        BeanCtx.out(logPre + "出参:obj=" + obj.toString());

        /**
         * 9.数据返回
         */
        //BeanCtx.p(obj.toString());
        return obj.toString();

    }

    /**
     * @Title: <p>isOfficeSegment</p>
     * @Description: <p>校验请求ip是否处于办公网段</p>
     * @param
     * @return: java.lang.String
     * @author: 
     * @Date: 2019/9/18 16:30
     * @throws
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    public String isOfficeSegment() {

        JSONObject obj = new JSONObject();
        HttpServletRequest request = BeanCtx.getRequest();
        String requestIp = getIpAddr(request);
        BeanCtx.out(logPre + "客户端请求的ip=" + requestIp);

        String[] officeSegmentArr = officeSegment.split(",");
        BeanCtx.out(logPre + "办公网段=" + Arrays.toString(officeSegmentArr));

        for (String officeSeg : officeSegmentArr) {

            if (isInRange(requestIp, officeSeg)) {

                obj.put("result", false);
                obj.put("message", "您所处在办公网段!无法下载!请到开发测试网段进行下载!");
                BeanCtx.out(logPre + "出参:obj=" + obj.toString());
                return obj.toString();

            }

        }
        BeanCtx.out(logPre + "出参:obj=null");
        return null;
    }

    /**
     * @Title: <p>isInRange</p>
     * @Description: <p>判断某个IP是否在某个网段内</p>
     * @param ip
     * @param cidr
     * @return: boolean
     * @author: 
     * @Date: 2019/10/11 15:15
     * @throws
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    public static boolean isInRange(String ip, String cidr) {
        String[] ips = ip.split("\\.");
        int ipAddr = (Integer.parseInt(ips[0]) << 24)
                | (Integer.parseInt(ips[1]) << 16)
                | (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);
        int type = Integer.parseInt(cidr.replaceAll(".*/", ""));
        int mask = 0xFFFFFFFF << (32 - type);
        String cidrIp = cidr.replaceAll("/.*", "");
        String[] cidrIps = cidrIp.split("\\.");
        int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)
                | (Integer.parseInt(cidrIps[1]) << 16)
                | (Integer.parseInt(cidrIps[2]) << 8)
                | Integer.parseInt(cidrIps[3]);

        return (ipAddr & mask) == (cidrIpAddr & mask);
    }

    /**
     * @Title: <p>init</p>
     * @Description: <p>数据初始化</p>
     * @param
     * @return: String
     * @author: 
     * @Date: 2019/9/18 16:26
     * @throws
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    public String init() {

        JSONObject obj = new JSONObject();
        try {

            officeSegment = getInterfaceValueByInterfaceKey("transfer.officeSegment");
            BeanCtx.out(logPre + " officeSegment=" + officeSegment);
            userName = getInterfaceValueByInterfaceKey("transfer.productLibUserName");
            BeanCtx.out(logPre + " userName=" + userName);
            password = getInterfaceValueByInterfaceKey("transfer.productLibUserPwd");
            BeanCtx.out(logPre + " password=" + password);
            filePath = getInterfaceValueByInterfaceKey("transfer.productLibFilePath");
            BeanCtx.out(logPre + " filePath=" + filePath);
            return null;

        } catch (Exception e) {

            BeanCtx.out(logPre + "init方法发生异常: " + e);
            obj.put("result", false);
            obj.put("message", "数据初始化异常!请联系管理员查看后台日志解决问题!");
            BeanCtx.out(logPre + "出参:obj=" + obj.toString());
            return obj.toString();

        }
    }

    /**
     * @Title: <p>getIpAddr</p>
     * @Description: <p>获取请求ip</p>
     * @param request
     * @return: java.lang.String
     * @author: 
     * @Date: 2019/9/18 16:24
     * @throws
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    public String getIpAddr(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

    /**
     * @Title: <p>run</p>
     * @Description: <p>根据关键字查询interface_config表对应的属性值</p>
     * @param interfaceKey
     * @return: java.lang.String
     * @author: 
     * @Date: 2019/9/4 17:50
     * @throws
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    public String getInterfaceValueByInterfaceKey(String interfaceKey) throws Exception  {

        /**
         * 1.入参日志:获取系统唯一id
         */
        String logPre = "[根据关键字查询制品库的测试ip与端口]<getInterfaceValueByInterfaceKey>";
        BeanCtx.out(logPre + "入参:interfaceKey = " + interfaceKey);

        /**
         * 2.参数校验
         */
        if (StringUtils.isEmpty(interfaceKey)) {

            BeanCtx.out(logPre + "入参为空,直接返回!interfaceKey = " + interfaceKey);
            return "";
        }

        /**
         * 3.查询流程数据:根据关键字查询interface_config表对应的属性值
         */
        String sql = "select interface_value from pms.interface_config where interface_key = '" + interfaceKey + "' limit 1 ";
        BeanCtx.out(logPre + " 执行的sql = " + sql);
        String interfaceValue = Rdb.getValueBySql(sql);

        /**
         * 4.出参日志
         */
        BeanCtx.out(logPre + "出参(制品库的测试ip与端口): interfaceValue = " + interfaceValue);

        /**
         * 5.数据返回
         */
        return interfaceValue;

    }

    /**
     * @Title: <p>getWarByGetMathod</p>
     * @Description: <p>从指定URL下载文件并保存到指定目录</p>
     * @return: boolean
     * true:下载成功
     * false:下载失败
     * @param url      请求的路径
     * @param fileName 文件名称
     * @throws
     * @author: 
     * @Date: 2019/8/19 15:16
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    public boolean getWarByGetMathod(String url, String fileName) {

        /**
         * 1.入参日志
         */
        String logPre = "[从制定URL下载文件并保存到指定目录]<getWarByGetMathod>";
        BeanCtx.out(logPre + "入参日志:url=" + url + ",保存目录=" + filePath + ",fileName=" + fileName + ",请求指定验证的用户名=" + userName + ",请求指定验证的密码=" + password);

        /**
         * 2.校验
         */
        //创建不同的文件夹目录
        File file = new File(filePath);
        //判断文件夹是否存在
        if (!file.exists()) {
            //如果文件夹不存在,则创建新的的文件夹
            file.mkdirs();
        }

        /**
         * 3.参数准备
         */
        FileOutputStream fileOut = null;
        InputStream inputStream = null;
        boolean result = false;

        /**
         * 4.开始下载
         */
        try {

            //发送get请求获取返回的数据流
            inputStream = doGet(url);
            //数据校验
            if (null == inputStream ||0 == inputStream.available()) {

                BeanCtx.out(logPre + "发送get请求获取数据为空!war包不存在");
                return result;
            }

            BufferedInputStream bis = new BufferedInputStream(inputStream);
            //判断文件的保存路径后面是否以/结尾
            if (!filePath.endsWith("/")) {

                filePath += "/";

            }
            //写入到文件(注意文件保存路径的后面一定要加上文件的名称)
            fileOut = new FileOutputStream(filePath + fileName);
            BufferedOutputStream bos = new BufferedOutputStream(fileOut);

            byte[] buf = new byte[4096];
            int length = bis.read(buf);
            //保存文件
            while (length != -1) {
                bos.write(buf, 0, length);
                length = bis.read(buf);
            }
            bos.close();
            bis.close();
            result = true;

        } catch (Exception e) {

            /**
             * 5.异常捕捉
             */
            BeanCtx.out(logPre + "抛出异常!" + e);
        }

        /**
         * 6.出参日志
         */
        BeanCtx.out(logPre + "(true:下载成功 false:下载失败)出参日志:result=" + result);

        /**
         * 7.数据返回
         */
        return result;

    }

    /**
     * @Title: <p>doGet</p>
     * @Description: <p>发送get请求</p>
     * @param url  请求地址
     * @return: java.io.InputStream
     * @author: 
     * @Date: 2019/8/22 19:05
     * @throws
     * @version: 1.0
     * @Copyright: . All rights reserved.
     */
    public InputStream doGet(String url) throws IOException {

        /**
         * 1.入参日志
         */
        BeanCtx.out("[发送get请求]<doGet>Get请求转发URL:" + url + ",请求指定验证的用户名:" + userName + ",请求指定验证的密码:" + password);

        /**
         * 2.参数准备
         */
        // 创建httpClient对象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 创建http对象
        HttpGet httpGet = new HttpGet(url);
        /**
         * setConnectTimeout:设置连接超时时间,单位毫秒。
         * setConnectionRequestTimeout:设置从connect Manager(连接池)获取Connection
         * 超时时间,单位毫秒。这个属性是新加的属性,因为目前版本是可以共享连接池的。
         * setSocketTimeout:请求获取数据的超时时间(即响应时间),单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用。
         */
        RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(CONNECT_TIMEOUT).setSocketTimeout(SOCKET_TIMEOUT).build();
        httpGet.setConfig(requestConfig);

        //该网页需要认证(用户名、密码)
        HttpClientContext context = new HttpClientContext();
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
        context.setCredentialsProvider(credentialsProvider);

        /**
         * 3.发送请求
         */
        CloseableHttpResponse execute = httpClient.execute(httpGet, context);

        /**
         * 4.返回值校验
         */
        if (200 != execute.getStatusLine().getStatusCode()) {

            return null;

        }

        /**
         * 5.返回数据准备
         */
        HttpEntity entity = execute.getEntity();
        InputStream in = entity.getContent();

        /**
         * 6.出参日志
         */
        BeanCtx.out("[发送get请求]<doGet>Get请求返回的数据流为:" + in);

        /**
         * 7.入参日志
         */
        return in;
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值