JAVA的HTTP客户端支持form表单,其他调用全部正常(最全)

一:说明

使用http客户端在我们日常开发也是经常使用的,比如操作第三方系统,采集第三方系统数据,一般会使用到http客户端操作。

二:代码类

一般会使用到apache的http客户端工具

>pom引入依赖

 <!--http客户端工具-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.7</version>
        </dependency>

 >http客户端工具类代码

/**
 * @author lrx
 * @description: TODO
 * @date 2021/3/9 13:50
 */
public class HttpPressureUtil {

    /**
     * 向指定URL发送GET方法的请求
     *
     * @param httpurl 请求参数用?拼接在url后边,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return result 所代表远程资源的响应结果
     */
    public static String doGet(String httpurl) {
        HttpURLConnection connection = null;
        InputStream is = null;
        BufferedReader br = null;
        String result = null;// 返回结果字符串
        try {
            // 创建远程url连接对象
            URL url = new URL(httpurl);
            // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接方式:get
            connection.setRequestMethod("GET");
            // 设置连接主机服务器的超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取远程返回的数据时间:60000毫秒
            connection.setReadTimeout(60000);
            // 发送请求
            connection.connect();
            // 通过connection连接,获取输入流
            if (connection.getResponseCode() == 200) {
                is = connection.getInputStream();
                // 封装输入流is,并指定字符集
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                // 存放数据
                StringBuffer sbf = new StringBuffer();
                String temp = null;
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            connection.disconnect();// 关闭远程连接
        }

        return result;
    }

    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param httpUrl 发送请求的 URL
     * @param param   请求参数应该是{"key":"==g43sEvsUcbcunFv3mHkIzlHO4iiUIT R7WwXuSVKTK0yugJnZSlr6qNbxsL8OqCUAFyCDCoRKQ882m6cTTi0q9uCJsq JJvxS+8mZVRP/7lWfEVt8/N9mKplUA68SWJEPSXyz4MDeFam766KEyvqZ99d"}的形式。
     * @return 所代表远程资源的响应结果
     */
    public static List<String> doPost(String httpUrl, String param) {

        HttpURLConnection connection = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        String result = null;
        List<String> list = new ArrayList<>();
        try {
            URL url = new URL(httpUrl);
            // 通过远程url连接对象打开连接
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接请求方式
            connection.setRequestMethod("POST");
            // 设置连接主机服务器超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取主机服务器返回数据超时时间:60000毫秒
            connection.setReadTimeout(60000);

            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
            connection.setDoOutput(true);
            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
            connection.setDoInput(true);
            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
            connection.setRequestProperty("Content-Type", "application/json");
            // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
            //connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
            // 通过连接对象获取一个输出流
            os = connection.getOutputStream();
            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
            os.write(param.getBytes());
            // 通过连接对象获取一个输入流,向远程读取
            if (connection.getResponseCode() == 200) {

                is = connection.getInputStream();
                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

                StringBuffer sbf = new StringBuffer();
                String temp = null;
                // 循环遍历一行一行读取数据
                while ((temp = br.readLine()) != null) {
                    list.add(temp);
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 断开与远程地址url的连接
            connection.disconnect();
        }
        return list;
    }

    /**
     * @param httpUrl 请求的url
     * @param param   form表单的参数(key,value形式)
     * @return
     */
    public static LoginToCollectDTO doPostForm(String httpUrl, Map param) {

        HttpURLConnection connection = null;
        InputStream is = null;
        OutputStream os = null;
        BufferedReader br = null;
        String result = null;
        //创建登录地址,验证信息对象
        LoginToCollectDTO loginToCollectDTO = new LoginToCollectDTO();
        try {
            URL url = new URL(httpUrl);
            // 通过远程url连接对象打开连接
            connection = (HttpURLConnection) url.openConnection();
            // 设置连接请求方式
            connection.setRequestMethod("POST");
            // 设置连接主机服务器超时时间:15000毫秒
            connection.setConnectTimeout(15000);
            // 设置读取主机服务器返回数据超时时间:60000毫秒
            connection.setReadTimeout(60000);

            // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
            connection.setDoOutput(true);
            // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
            connection.setDoInput(true);
            // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
            //connection.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
            // 通过连接对象获取一个输出流
            os = connection.getOutputStream();
            // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的(form表单形式的参数实质也是key,value值的拼接,类似于get请求参数的拼接)
            os.write(createLinkString(param).getBytes());
            // 通过连接对象获取一个输入流,向远程读取
            if (connection.getResponseCode() == 200) {

                is = connection.getInputStream();
                // 对输入流对象进行包装:charset根据工作项目组的要求来设置
                br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

                StringBuffer sbf = new StringBuffer();
                String temp = null;
                // 循环遍历一行一行读取数据
                while ((temp = br.readLine()) != null) {
                    //判断是否包含等号
                    if (!temp.contains("=")) {
                        loginToCollectDTO.setStatusCode(temp);
                    } else if (temp.contains("ADDR")) {
                        String[] strs = temp.split("=");
                        loginToCollectDTO.setCollectAddr(strs[1]);
                        sbf.append(temp);
                    } else {
                        String[] strs = temp.split("=");
                        loginToCollectDTO.setCollectSessionId(strs[1]);
                    }
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 断开与远程地址url的连接
            connection.disconnect();
        }
        return loginToCollectDTO;
    }

    /**
     * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
     *
     * @param params 需要排序并参与字符拼接的参数组
     * @return 拼接后字符串
     */
    public static String createLinkString(Map<String, String> params) {

        List<String> keys = new ArrayList<String>(params.keySet());
        Collections.sort(keys);

        StringBuilder prestr = new StringBuilder();
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            String value = params.get(key);
            if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符
                prestr.append(key).append("=").append(value);
            } else {
                prestr.append(key).append("=").append(value).append("&");
            }
        }

        return prestr.toString();
    }
}

以上http客户端非常全面,支持各种http调用,比如raw,或者body体的参数设置,返回我使用实体类接收,自行编写实体类,或者string格式输出

>代码测试,我这边截取了部分的代码,可自行仿照写法

@Component
@AllArgsConstructor
@Slf4j
public class CollectionDataTask {

    @Resource
    InfluxDBConnect influxDBConnect;

    // 定义每过10秒执行任务
    @Scheduled(fixedRate = 10000)
    public void pressureCollectionData() {
        try {
            Map<String, String> tagsMap = new HashMap<>();
            // 获取时间
            long recordTime = System.currentTimeMillis();
            String pressureTest = "pressureTest";
            log.info("========管道压力系统采集数据=============");
            CollectDataDTO collectDataDTO = new CollectDataDTO();
            try {
                Map<String, String> loginToCollectDTO = new HashMap<>();
                loginToCollectDTO.put("GRM", "23102649387");
                loginToCollectDTO.put("PASS", "SFJ123456");
                LoginToCollectDTO loginToCollectDTO1 = HttpPressureUtil.doPostForm("ip地址", loginToCollectDTO);
                System.out.println("返回值>>>:" + loginToCollectDTO1);
                //获取读取的数据
                String collectParamStr = "7\n" +
                        "$SIGNAL\n" +
                        "$ErrorCode\n" +
                        "$NetState\n" +
                        "$SIMERROR\n" +
                        "$POWERIN\n" +
                        "PV1_1\n" +
                        "PV1_2";
                //组装地址
                String collectAddress = "http://" + loginToCollectDTO1.getCollectAddr() + "/exdata?SID=" + loginToCollectDTO1.getCollectSessionId() + "&OP=R";
                List<String> collectDataList = HttpPressureUtil.doPost(collectAddress, collectParamStr);
                collectDataDTO.setStatusCode(collectDataList.get(0));
                collectDataDTO.setNumberType(Float.parseFloat(collectDataList.get(1)));
                collectDataDTO.setSignal(Float.parseFloat(collectDataList.get(2)));
                collectDataDTO.setErrorCode(Float.parseFloat(collectDataList.get(3)));
                collectDataDTO.setNetState(Float.parseFloat(collectDataList.get(4)));
                collectDataDTO.setSimError(Float.parseFloat(collectDataList.get(5)));
                collectDataDTO.setPowerIn(Float.parseFloat(collectDataList.get(6)));
                collectDataDTO.setPvOne(Float.parseFloat(collectDataList.get(7)));
                collectDataDTO.setPvTwo(Float.parseFloat(collectDataList.get(8)));
                System.out.println("返回值>>>:" + collectDataDTO);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //设备数据map
            Map<String, Object> pointDataMap = JSONObject.parseObject(JSON.toJSONString(collectDataDTO));
            //保存的字段对应值
            Map<String, Object> fieldsMap = new HashMap<>();
            String k = null;
            Object v = null;
            for (Map.Entry<String, Object> entry : pointDataMap.entrySet()) {
                k = entry.getKey();
                v = entry.getValue();
                // 判断处理值
                if (v instanceof String) {
                    //若发过来的是0处理填上一个值
                    log.info("k的值" + k);
                    fieldsMap.put(k, v.toString());
                }
                if(!(v instanceof String)){
                if (v.toString().length() > 1 && v.toString().length() < 20) {
                    //若发过来的是0处理填上一个值
                    log.info("k的值" + k);
                    fieldsMap.put(k, Double.valueOf(v.toString()));
                }
                if (v.toString().length() == 1) {
                    fieldsMap.put(k, Integer.valueOf(entry.getValue().toString()));
                }}
                // 保存数据
                influxDBConnect.insert(pressureTest, influxDBConnect.getRetentionPolicy(), tagsMap, fieldsMap, recordTime);
            }
        } catch (Exception e) {
            log.error("管道压力系统采集数据数据任务执行异常: " + e);
        }
    }
}

以上代码第一个是表单的,第二个里面有参数拼接,和raw传参,自行可以根据http调用规则调用。

posted @ 2022-08-11 18:49  码海兴辰  阅读(116)  评论(0编辑  收藏  举报