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调用规则调用。