| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- package com.tzy.util;
- import com.tzy.common.utils.MyX509TrustManager;
- import lombok.Data;
- import lombok.extern.slf4j.Slf4j;
- import javax.net.ssl.HttpsURLConnection;
- import javax.net.ssl.SSLContext;
- import javax.net.ssl.SSLSocketFactory;
- import javax.net.ssl.TrustManager;
- import java.io.*;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.security.KeyManagementException;
- import java.security.NoSuchAlgorithmException;
- import java.util.*;
- /**
- * httpclient
- */
- @Slf4j
- @Data
- public class HttpClientUtil {
- private String contentType;
- private String authorization;
- public HttpClientUtil(){}
- public HttpClientUtil(String contentType,String authorization){
- this.contentType = contentType;
- this.authorization = authorization;
- }
- /**
- *
- * @param httpUrl 请求的url
- * @param param form表单的参数(key,value形式)
- * @return
- */
- @SuppressWarnings("resource")
- public String doPostForm(String httpUrl, Map param) {
- HttpsURLConnection connection = null;
- InputStream is = null;
- OutputStream os = null;
- BufferedReader br = null;
- String result = null;
- try {
- //创建SSLContext
- SSLContext sslContext=SSLContext.getInstance("SSL");
- TrustManager[] tm={new MyX509TrustManager()};
- //初始化
- sslContext.init(null, tm, new java.security.SecureRandom());;
- //获取SSLSocketFactory对象
- SSLSocketFactory ssf=sslContext.getSocketFactory();
- URL url = new URL(httpUrl);
- // 通过远程url连接对象打开连接
- connection = (HttpsURLConnection) url.openConnection();
- // 设置连接请求方式
- connection.setRequestMethod("POST");
- // 设置连接主机服务器超时时间:15000毫秒
- connection.setConnectTimeout(150000);
- // 设置读取主机服务器返回数据超时时间:60000毫秒
- connection.setReadTimeout(600000);
- // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
- connection.setDoOutput(true);
- // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
- connection.setDoInput(true);
- // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
- connection.setRequestProperty("Content-Type", contentType);
- // 设置鉴权信息:Authorization:
- connection.setRequestProperty("Authorization", authorization);
- //设置当前实例使用的SSLSoctetFactory
- connection.setSSLSocketFactory(ssf);
- // 通过连接对象获取一个输出流
- os = connection.getOutputStream();
- // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的(form表单形式的参数实质也是key,value值的拼接,类似于get请求参数的拼接)
- os.write(createLinkString(param).getBytes("utf-8"));
- // 通过连接对象获取一个输入流,向远程读取
- 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) {
- sbf.append(temp);
- sbf.append("\r\n");
- }
- result = sbf.toString();
- }
- } catch (MalformedURLException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- } catch (KeyManagementException 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 result;
- }
- /*
- * 处理https GET/POST请求
- * @param requestUrl 请求地址、
- * @param method 请求方法[GET/POST]
- * @param param 参数
- * @return 返回值
- * */
- public static String httpsRequest(String requestUrl,String method,String param , Map<String ,String> header){
- StringBuffer buffer=null;
- try{
- //创建SSLContext
- SSLContext sslContext=SSLContext.getInstance("SSL");
- TrustManager[] tm={new MyX509TrustManager()};
- //初始化
- sslContext.init(null, tm, new java.security.SecureRandom());
- //获取SSLSocketFactory对象
- SSLSocketFactory ssf=sslContext.getSocketFactory();
- URL url=new URL(requestUrl);
- HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
- conn.setDoOutput(true);
- conn.setDoInput(true);
- conn.setUseCaches(false);
- conn.setRequestMethod(method);
- if(null != header && !header.isEmpty()){
- Set set = header.keySet();
- Iterator<String> iterator = set.iterator();
- while (iterator.hasNext()){
- String key = iterator.next();
- conn.setRequestProperty(key, header.get(key));
- }
- }
- //设置当前实例使用的SSLSoctetFactory
- conn.setSSLSocketFactory(ssf);
- conn.connect();
- //往服务器端写内容
- if(null!=param){
- OutputStream os=conn.getOutputStream();
- os.write(param.getBytes("utf-8"));
- os.close();
- }
- //读取服务器端返回的内容
- InputStream is=conn.getInputStream();
- InputStreamReader isr=new InputStreamReader(is,"utf-8");
- BufferedReader br=new BufferedReader(isr);
- buffer=new StringBuffer();
- String line=null;
- while((line=br.readLine())!=null){
- buffer.append(line);
- }
- }catch(Exception e){
- log.error(e.getMessage());
- e.printStackTrace();
- }
- return buffer.toString();
- }
- /**
- * http 请求
- * @param requestUrl
- * @param method
- * @param param
- * @param header
- * @return
- */
- public static String httpRequest(String requestUrl,String method,String param , Map<String ,String> header){
- StringBuffer buffer=null;
- try{
- TrustManager[] tm={new MyX509TrustManager()};
- //初始化
- URL url=new URL(requestUrl);
- sun.net.www.protocol.http.HttpURLConnection conn = (sun.net.www.protocol.http.HttpURLConnection) url.openConnection();
- // HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();
- conn.setDoOutput(true);
- conn.setDoInput(true);
- conn.setUseCaches(false);
- conn.setRequestMethod(method);
- if(null != header && !header.isEmpty()){
- Set set = header.keySet();
- Iterator<String> iterator = set.iterator();
- while (iterator.hasNext()){
- String key = iterator.next();
- conn.setRequestProperty(key, header.get(key));
- }
- }
- conn.connect();
- //往服务器端写内容
- if(null!=param){
- OutputStream os=conn.getOutputStream();
- os.write(param.getBytes("utf-8"));
- os.close();
- }
- log.debug("http请求code:{},msg:{}", conn.getResponseCode(), conn.getResponseMessage());
- //读取服务器端返回的内容
- InputStream is=conn.getInputStream();
- InputStreamReader isr=new InputStreamReader(is,"utf-8");
- BufferedReader br=new BufferedReader(isr);
- buffer=new StringBuffer();
- String line=null;
- while((line=br.readLine())!=null){
- buffer.append(line);
- }
- }catch(Exception e){
- log.error("http请求失败:{}",e);
- }
- return buffer.toString();
- }
- /**
- * 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
- * @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();
- }
- }
|