| package cn.emay.sdk.util.http.client; | 
|   | 
| import java.io.ByteArrayOutputStream; | 
| import java.io.DataOutputStream; | 
| import java.io.IOException; | 
| import java.io.InputStream; | 
| import java.io.UnsupportedEncodingException; | 
| 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.ArrayList; | 
| import java.util.HashMap; | 
| import java.util.List; | 
| import java.util.Map; | 
| import java.util.Map.Entry; | 
|   | 
| import javax.net.ssl.HostnameVerifier; | 
| import javax.net.ssl.HttpsURLConnection; | 
| import javax.net.ssl.SSLContext; | 
| import javax.net.ssl.SSLSession; | 
| import javax.net.ssl.TrustManager; | 
| import javax.net.ssl.X509TrustManager; | 
|   | 
| import cn.emay.sdk.util.http.common.EmayHttpResultCode; | 
| import cn.emay.sdk.util.http.request.EmayHttpRequest; | 
| import cn.emay.sdk.util.http.response.EmayHttpResponsePraser; | 
|   | 
| /** | 
|  * EMAY http客户端 | 
|  *  | 
|  * @author Frank | 
|  * | 
|  */ | 
| public class EmayHttpClient { | 
|   | 
|     /** | 
|      * 链接超时时间(s) | 
|      */ | 
|     private int httpConnectionTimeOut = 30; | 
|   | 
|     /** | 
|      * 数据传输超时时间(s) | 
|      */ | 
|     private int httpReadTimeOut = 30; | 
|   | 
|     public EmayHttpClient() { | 
|   | 
|     } | 
|   | 
|     /** | 
|      *  | 
|      * @param httpConnectionTimeOut | 
|      *            链接超时时间(s) | 
|      * @param httpReadTimeOut | 
|      *            数据传输超时时间(s) | 
|      */ | 
|     public EmayHttpClient(int httpConnectionTimeOut, int httpReadTimeOut) { | 
|         this.httpConnectionTimeOut = httpConnectionTimeOut; | 
|         this.httpReadTimeOut = httpReadTimeOut; | 
|     } | 
|   | 
|     /** | 
|      * 发送HTTP请求 | 
|      *  | 
|      * @param request | 
|      *            请求 | 
|      * @param praser | 
|      *            响应解析器 | 
|      * @return T 响应 | 
|      */ | 
|     public <T> T service(EmayHttpRequest<?> request, EmayHttpResponsePraser<T> praser) { | 
|         EmayHttpResultCode code = EmayHttpResultCode.SUCCESS; | 
|         if (request.getUrl() == null || request.getUrl().length() == 0) { | 
|             code = EmayHttpResultCode.ERROR_URL_NULL; | 
|             return praser.prase(request.getCharSet(), code, 0, null, null, null); | 
|         } | 
|         HttpURLConnection conn = null; | 
|         int httpCode = 0; | 
|         Map<String, String> headers = null; | 
|         List<String> cookies = null; | 
|         ByteArrayOutputStream outputStream = null; | 
|         try { | 
|             conn = this.createConnection(request); | 
|             this.fillConnection(conn, request); | 
|             this.request(conn, request); | 
|             httpCode = conn.getResponseCode(); | 
|             headers = this.getHeaders(conn, request.getCharSet()); | 
|             cookies = this.getCookies(conn, request.getCharSet()); | 
|             outputStream = this.getResultOutputStream(conn); | 
|         } catch (KeyManagementException e) { | 
|             code = EmayHttpResultCode.ERROR_HTTPS_SSL; | 
|             e.printStackTrace(); | 
|         } catch (NoSuchAlgorithmException e) { | 
|             code = EmayHttpResultCode.ERROR_HTTPS_SSL; | 
|             e.printStackTrace(); | 
|         } catch (ProtocolException e) { | 
|             code = EmayHttpResultCode.ERROR_METHOD; | 
|             e.printStackTrace(); | 
|         } catch (UnsupportedEncodingException e) { | 
|             code = EmayHttpResultCode.ERROR_CHARSET; | 
|             e.printStackTrace(); | 
|         } catch (MalformedURLException e) { | 
|             code = EmayHttpResultCode.ERROR_URL; | 
|             httpCode = 500; | 
|             e.printStackTrace(); | 
|         } catch (IOException e) { | 
|             code = EmayHttpResultCode.ERROR_CONNECT; | 
|             e.printStackTrace(); | 
|         } finally { | 
|             if (conn != null) { | 
|                 conn.disconnect(); | 
|             } | 
|         } | 
|         T t = null; | 
|         try { | 
|             t = praser.prase(request.getCharSet(), code, httpCode, headers, cookies, outputStream); | 
|         } catch (Exception e) { | 
|             e.printStackTrace(); | 
|         } finally { | 
|             if (outputStream != null) { | 
|                 try { | 
|                     outputStream.flush(); | 
|                     outputStream.close(); | 
|                 } catch (IOException e) { | 
|                     e.printStackTrace(); | 
|                 } | 
|             } | 
|         } | 
|         return t; | 
|     } | 
|   | 
|     /** | 
|      * 获取HTTP响应头 | 
|      *  | 
|      * @param conn | 
|      * @param charSet | 
|      * @return | 
|      * @throws UnsupportedEncodingException | 
|      */ | 
|     private Map<String, String> getHeaders(HttpURLConnection conn, String charSet) throws UnsupportedEncodingException { | 
|         Map<String, String> resultHeaders = new HashMap<String, String>(); | 
|         Map<String, List<String>> header = conn.getHeaderFields(); | 
|         if (header != null && header.size() > 0) { | 
|             for (Entry<String, List<String>> entry : header.entrySet()) { | 
|                 if (!"Set-Cookie".equalsIgnoreCase(entry.getKey())) { | 
|                     String valuer = ""; | 
|                     if (entry.getValue() != null && entry.getValue().size() > 0) { | 
|                         for (String value : entry.getValue()) { | 
|                             valuer += new String(value.getBytes("ISO-8859-1"), charSet) + ","; | 
|                         } | 
|                         valuer = valuer.substring(0, valuer.length() - 1); | 
|                     } | 
|                     resultHeaders.put(entry.getKey(), valuer); | 
|                 } | 
|             } | 
|         } | 
|         return resultHeaders; | 
|     } | 
|   | 
|     /** | 
|      * 获取HTTP响应Cookies | 
|      *  | 
|      * @param conn | 
|      * @param charSet | 
|      * @return | 
|      * @throws UnsupportedEncodingException | 
|      */ | 
|     private List<String> getCookies(HttpURLConnection conn, String charSet) throws UnsupportedEncodingException { | 
|         List<String> resultC = new ArrayList<String>(); | 
|         List<String> cookies = null; | 
|         Map<String, List<String>> header = conn.getHeaderFields(); | 
|         if (header != null && header.size() > 0) { | 
|             cookies = header.get("Set-Cookie"); | 
|         } | 
|         if (cookies != null) { | 
|             for (String cookie : cookies) { | 
|                 resultC.add(new String(cookie.getBytes("ISO-8859-1"), charSet)); | 
|             } | 
|         } | 
|         return cookies; | 
|     } | 
|   | 
|     /** | 
|      * 获取HTTP响应数据流 | 
|      *  | 
|      * @param conn | 
|      * @return | 
|      * @throws IOException | 
|      */ | 
|     private ByteArrayOutputStream getResultOutputStream(HttpURLConnection conn) throws IOException { | 
|         ByteArrayOutputStream outStream = new ByteArrayOutputStream(); | 
|         InputStream is = conn.getInputStream(); | 
|         try { | 
|             if (is != null) { | 
|                 byte[] buffer = new byte[1024]; | 
|                 int len = 0; | 
|                 while ((len = is.read(buffer)) != -1) { | 
|                     outStream.write(buffer, 0, len); | 
|                 } | 
|             } | 
|         } catch (IOException e) { | 
|             throw e; | 
|         } finally { | 
|             if (is != null) { | 
|                 is.close(); | 
|             } | 
|         } | 
|         return outStream; | 
|     } | 
|   | 
|     /** | 
|      * 发送Http请求 | 
|      *  | 
|      * @param conn | 
|      * @param request | 
|      * @throws IOException | 
|      */ | 
|     private void request(HttpURLConnection conn, EmayHttpRequest<?> request) throws IOException { | 
|         if (request.getMethod().equalsIgnoreCase("POST")) { | 
|             conn.setDoOutput(true); | 
|             // conn.connect(); | 
|             if (request.getParams() != null) { | 
|                 DataOutputStream out = new DataOutputStream(conn.getOutputStream()); | 
|                 out.write(request.paramsToBytesForPost()); | 
|                 out.flush(); | 
|                 out.close(); | 
|             } | 
|         } else { | 
|             conn.connect(); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 添加请求信息 | 
|      *  | 
|      * @param conn | 
|      * @param request | 
|      * @throws ProtocolException | 
|      */ | 
|     private void fillConnection(HttpURLConnection conn, EmayHttpRequest<?> request) throws ProtocolException { | 
|         this.fillTimeout(conn); | 
|         this.filleMethod(conn, request); | 
|         this.fillHeaders(conn, request); | 
|         this.fillCookies(conn, request); | 
|     } | 
|   | 
|     /** | 
|      * 添加超时时间 | 
|      *  | 
|      * @param conn | 
|      */ | 
|     private void fillTimeout(HttpURLConnection conn) { | 
|         if (httpConnectionTimeOut != 0) { | 
|             conn.setConnectTimeout(httpConnectionTimeOut * 1000); | 
|         } | 
|         if (httpReadTimeOut != 0) { | 
|             conn.setReadTimeout(httpReadTimeOut * 1000); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 指定HTTP方法 | 
|      *  | 
|      * @param conn | 
|      * @param request | 
|      * @throws ProtocolException | 
|      */ | 
|     private void filleMethod(HttpURLConnection conn, EmayHttpRequest<?> request) throws ProtocolException { | 
|         conn.setRequestMethod(request.getMethod().toUpperCase()); | 
|     } | 
|   | 
|     /** | 
|      * 添加头信息 | 
|      *  | 
|      * @param conn | 
|      * @param request | 
|      */ | 
|     private void fillHeaders(HttpURLConnection conn, EmayHttpRequest<?> request) { | 
|         if (request.getHeaders() != null) { | 
|             for (Map.Entry<String, String> entry : request.getHeaders().entrySet()) { | 
|                 conn.setRequestProperty(entry.getKey(), entry.getValue()); | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 添加Cookies | 
|      *  | 
|      * @param conn | 
|      * @param request | 
|      */ | 
|     private void fillCookies(HttpURLConnection conn, EmayHttpRequest<?> request) { | 
|         if (request.getCookies() != null) { | 
|             conn.setRequestProperty("Cookie", request.getCookies()); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 创建Http链接 | 
|      *  | 
|      * @param request | 
|      * @return | 
|      * @throws NoSuchAlgorithmException | 
|      * @throws KeyManagementException | 
|      * @throws MalformedURLException | 
|      * @throws IOException | 
|      */ | 
|     private HttpURLConnection createConnection(EmayHttpRequest<?> request) throws NoSuchAlgorithmException, KeyManagementException, MalformedURLException, IOException { | 
|         URL console = new URL(request.getUrl()); | 
|         HttpURLConnection conn; | 
|         if (request.isHttps()) { | 
|             SSLContext sc = SSLContext.getInstance("SSL"); | 
|             sc.init(null, new TrustManager[] { new X509TrustManager() { | 
|   | 
|                 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { | 
|   | 
|                 } | 
|   | 
|                 public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { | 
|   | 
|                 } | 
|   | 
|                 public X509Certificate[] getAcceptedIssuers() { | 
|                     return new X509Certificate[] {}; | 
|                 } | 
|   | 
|             } }, new java.security.SecureRandom()); | 
|             HttpsURLConnection sconn = (HttpsURLConnection) console.openConnection(); | 
|             sconn.setSSLSocketFactory(sc.getSocketFactory()); | 
|             sconn.setHostnameVerifier(new HostnameVerifier() { | 
|   | 
|                 public boolean verify(String hostname, SSLSession session) { | 
|                     return true; | 
|                 } | 
|   | 
|             }); | 
|             conn = sconn; | 
|         } else { | 
|             conn = (HttpURLConnection) console.openConnection(); | 
|         } | 
|         return conn; | 
|     } | 
|   | 
| } |