jdk 调用http https/请求

来源:互联网 发布:分销系统源码 编辑:程序博客网 时间:2024/06/15 05:22
package cn.com.glxt.http;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;


import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


import cn.com.glxt.common.ResultVO;


import com.alibaba.fastjson.JSONObject;


public class HttpClientUtil {
private static final Log LOGGER = LogFactory.getFactory().getInstance(HttpClientUtil.class);

public static void main(String[] args) {
String url = "https://domain/services/oauth2/token";
String charset = "UTF-8";
        Map<String,String> params = new HashMap<String,String>();  
        
        Map<String,String> header = new HashMap<String, String>();
        header.put("Content-Type", "application/x-www-form-urlencoded");
        ResultVO resultVO = sendHttps(url,null,null,params,header,charset);
        if(resultVO.isSuccess()){
        JSONObject json = JSONObject.parseObject(resultVO.getData().toString());
        String data = "{\"key\":\"value\"}";
        header.put("Content-Type", "application/json");
        resultVO = sendHttps(json.getString("instance_url"), null,data,null, header, charset);
        if(resultVO.isSuccess()){
        System.out.println(resultVO.getData().toString());
        }else{
        System.out.println(resultVO.getMessage());
        }
        }else{
        System.out.println(resultVO.getMessage());
        }
}
/**
* http请求
* @param url
* @param method
* @param body
* @param params
* @param header
* @param charset
* @return
*/
public static ResultVO sendHttp(String url,String method,String body,Map<String, String> params,Map<String, String> header,String charset){
if(null == method || "".equals(method)){
method ="POST";
}
if(null == charset || "".equals(charset)){
charset = "UTF-8";
}
OutputStreamWriter out = null;
        BufferedReader in = null;
        HttpURLConnection conn = null;
        String result = null; 
        try {
            URL realUrl = new URL(url);
            conn =(HttpURLConnection) realUrl.openConnection();
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // POST方法
            conn.setRequestMethod(method);
            conn.setUseCaches(false);
            conn.setConnectTimeout(10 * 1000);
            if(header != null){
            for (Map.Entry<String, String> entry : header.entrySet()) {
            conn.setRequestProperty(entry.getKey(), entry.getValue());
            }
            }else{
            conn.setRequestProperty("Content-Type", "application/json");
            }
            conn.connect();
            // 获取URLConnection对象对应的输出流
            out = new OutputStreamWriter(conn.getOutputStream(), charset);
            // 发送请求参数            
            if (params != null) {
         StringBuilder param = new StringBuilder(); 
         for (Map.Entry<String, String> entry : params.entrySet()) {
         if(param.length()>0){
         param.append("&");
         }          
         param.append(entry.getKey());
         param.append("=");
         param.append(entry.getValue());         
         }
         out.write(param.toString());
            }
            if(body != null){
            out.write(body);
            }
            out.flush();
            if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
            result = getInputPutStreamReader(conn.getInputStream(), charset);
            }else{
            return ResultVO.setFail(null, getInputPutStreamReader(conn.getErrorStream(), charset));
            }
        } catch (ProtocolException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "网络异常");
} catch (MalformedURLException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "网络异常");
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "网络异常");
}catch(Exception e){
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "出现未知异常");
}
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
                if(conn != null){
                conn.disconnect();
                }
            }
            catch(IOException e){
                LOGGER.error(e.getMessage(), e);
                return ResultVO.setFail(null, "网络异常");
            }
        }
        return ResultVO.setSuccess(result, "");
}

/**
* https请求
* @param url
* @param method
* @param body
* @param params
* @param header
* @param charset
* @return
*/
public static ResultVO sendHttps(String url,String method,String body,Map<String, String> params,Map<String, String> header,String charset){
if(null == method || "".equals(method)){
method ="POST";
}
if(null == charset || "".equals(charset)){
charset = "UTF-8";
}
OutputStreamWriter out = null;
        BufferedReader in = null;
        HttpsURLConnection conn = null;
        String result = null; 
        try {
            URL realUrl = new URL(url);
            conn =(HttpsURLConnection) realUrl.openConnection();
            //支持https请求
            conn.setSSLSocketFactory(createSSL());
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // POST方法
            conn.setRequestMethod(method);
            conn.setUseCaches(false);
            conn.setConnectTimeout(10 * 1000);
            if(header != null){
            for (Map.Entry<String, String> entry : header.entrySet()) {
            conn.setRequestProperty(entry.getKey(), entry.getValue());
            }
            }else{
            conn.setRequestProperty("Content-Type", "application/json");
            }
            conn.connect();
            // 获取URLConnection对象对应的输出流
            out = new OutputStreamWriter(conn.getOutputStream(), charset);
            // 发送请求参数            
            if (params != null) {
         StringBuilder param = new StringBuilder(); 
         for (Map.Entry<String, String> entry : params.entrySet()) {
         if(param.length()>0){
         param.append("&");
         }          
         param.append(entry.getKey());
         param.append("=");
         param.append(entry.getValue());         
         }
         out.write(param.toString());
            }
            if(body != null){
            out.write(body);
            }
            out.flush();
            if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
            result = getInputPutStreamReader(conn.getInputStream(), charset);
            }else{
            return ResultVO.setFail(null, getInputPutStreamReader(conn.getErrorStream(), charset));
            }
        } catch (ProtocolException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "网络异常");
} catch (MalformedURLException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "网络异常");
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "网络异常");
} catch (KeyManagementException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "创建SSL失败");
} catch (NoSuchAlgorithmException e) {
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "创建SSL失败");
} catch(Exception e){
LOGGER.error(e.getMessage(), e);
return ResultVO.setFail(null, "出现未知异常");
}
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
                if(conn != null){
                conn.disconnect();
                }
            }
            catch(IOException e){
                LOGGER.error(e.getMessage(), e);
                return ResultVO.setFail(null, "网络异常");
            }
        }
        return ResultVO.setSuccess(result, "");
}

private static String getInputPutStreamReader(InputStream inputStream,String charset) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,charset));
        String line = null;
        StringBuffer sb = new StringBuffer();
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        reader.close();
        return sb.toString();
    }

private static javax.net.ssl.SSLSocketFactory createSSL() throws NoSuchAlgorithmException, KeyManagementException {
        TrustManager[] tm = new TrustManager[]{myX509TrustManager};
        //TLSv1.1以及以上的需要JDK1.7以上
        SSLContext sslContext = SSLContext.getInstance("TLSv1.1");
        sslContext.init(null, tm, null);
        javax.net.ssl.SSLSocketFactory ssf = sslContext.getSocketFactory();
        return ssf;
    }

private static TrustManager myX509TrustManager = new X509TrustManager() {


        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }


        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }


        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
        }
    };
}