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 service(EmayHttpRequest request, EmayHttpResponsePraser 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 headers = null; List 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 getHeaders(HttpURLConnection conn, String charSet) throws UnsupportedEncodingException { Map resultHeaders = new HashMap(); Map> header = conn.getHeaderFields(); if (header != null && header.size() > 0) { for (Entry> 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 getCookies(HttpURLConnection conn, String charSet) throws UnsupportedEncodingException { List resultC = new ArrayList(); List cookies = null; Map> 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 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; } }