package com.rrtx.services.common.utils;
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
 
public class HttpUtil {
    //private static final Log logger = Logs.get();  
       private final static int CONNECT_TIMEOUT = 5000; // in milliseconds  
       private final static String DEFAULT_ENCODING = "UTF-8";  
       private static int socketTimeout = 10000;// 连接超时时间，默认10秒
       private static int connectTimeout = 30000;// 传输超时时间，默认30秒
       
       private static RequestConfig requestConfig;// 请求器的配置
       private static CloseableHttpClient httpClient;// HTTP请求器
       
       public static String postData(String urlStr, String data){  
           return postData(urlStr, data, null);  
       }  
 
       public static String postData(String urlStr, String data, String contentType){  
           BufferedReader reader = null;  
           try {  
               URL url = new URL(urlStr);  
               URLConnection conn = url.openConnection();  
               conn.setDoOutput(true);  
               conn.setConnectTimeout(CONNECT_TIMEOUT);  
               conn.setReadTimeout(CONNECT_TIMEOUT);  
               if(contentType != null)  
                   conn.setRequestProperty("content-type", contentType);  
               OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);  
               if(data == null)  
                   data = "";  
               writer.write(data);   
               writer.flush();  
               writer.close();    
 
               reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));  
               StringBuilder sb = new StringBuilder();  
               String line = null;  
               while ((line = reader.readLine()) != null) {  
                   sb.append(line);  
                   sb.append("\r\n");  
               }  
               return sb.toString();  
           } catch (IOException e) {  
        	   e.printStackTrace();
               //logger.error("Error connecting to " + urlStr + ": " + e.getMessage());  
           } finally {  
               try {  
                   if (reader != null)  
                       reader.close();  
               } catch (IOException e) {  
               }  
           }  
           return null;  
       }  
       
       /**
        * 通过Https往API post xml数据
        *
        * @param url API地址
        * @param xmlObj 要提交的XML数据对象
       * @param mchId 商户ID
       * @param certPath 证书位置
        * @return
        */
       public static String postData(String url, String xmlObj, String mchId, String certPath) {
           // 加载证书
           try {
               initCert(mchId, certPath);
           } catch (Exception e) {
               e.printStackTrace();
           }
           String result = null;
           HttpPost httpPost = new HttpPost(url);
           // 得指明使用UTF-8编码，否则到API服务器XML的中文不能被成功识别
           StringEntity postEntity = new StringEntity(xmlObj, "UTF-8");
           httpPost.addHeader("Content-Type", "text/xml");
           httpPost.setEntity(postEntity);
           // 根据默认超时限制初始化requestConfig
           requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();
           // 设置请求器的配置
           httpPost.setConfig(requestConfig);
           try {
               HttpResponse response = null;
               try {
                   response = httpClient.execute(httpPost);
               } catch (IOException e) {
                   e.printStackTrace();
               }
               HttpEntity entity = response.getEntity();
               try {
                   result = EntityUtils.toString(entity, "UTF-8");
               } catch (IOException e) {
                   e.printStackTrace();
               }
           } finally {
               httpPost.abort();
           }
           return result;
       }
    
       /**
        * 加载证书
        *
        * @param mchId 商户ID
        * @param certPath 证书位置
        * @throws Exception
        */
       private static void initCert(String mchId, String certPath) throws Exception {
           // 证书密码，默认为商户ID
           String key = mchId;
           // 证书的路径
           String path = certPath;
           // 指定读取证书格式为PKCS12
           KeyStore keyStore = KeyStore.getInstance("PKCS12");
           // 读取本机存放的PKCS12证书文件
           FileInputStream instream = new FileInputStream(new File(path));
           try {
               // 指定PKCS12的密码(商户ID)
               keyStore.load(instream, key.toCharArray());
           } finally {
               instream.close();
           }
           SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, key.toCharArray()).build();
           SSLConnectionSocketFactory sslsf =
                   new SSLConnectionSocketFactory(sslcontext, new String[] {"TLSv1"}, null,
                           SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
           httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
       }

       /**
        * 发起http请求获取返回结果
        *
        * @param req_url 请求地址
        * @return
        */
       public static String httpRequest(String req_url) {
           StringBuffer buffer = new StringBuffer();
           try {
               URL url = new URL(req_url);
               HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();

               httpUrlConn.setDoOutput(false);
               httpUrlConn.setDoInput(true);
               httpUrlConn.setUseCaches(false);

               httpUrlConn.setRequestMethod("GET");
               httpUrlConn.connect();

               // 将返回的输入流转换成字符串
               InputStream inputStream = httpUrlConn.getInputStream();
               InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
               BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

               String str = null;
               while ((str = bufferedReader.readLine()) != null) {
                   buffer.append(str);
               }
               bufferedReader.close();
               inputStreamReader.close();
               // 释放资源
               inputStream.close();
               inputStream = null;
               httpUrlConn.disconnect();

           } catch (Exception e) {
               System.out.println(e.getStackTrace());
           }
           return buffer.toString();
       }
}
