package com.netease.nim.uikit.common.http; import com.netease.nim.uikit.common.util.log.LogUtil; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; /** * Created by huangjun on 2016/11/21. */ public class HttpClientWrapper { private static final String TAG = "http"; private static final int TIMEOUT = 30 * 1000; private static final int BUFFER_SIZE = 1024; private static final int RES_CODE_SUCCESS = 200; private static final String CHARSET = "UTF-8"; private static final String HTTP_GET = "GET"; private static final String HTTP_POST = "POST"; public static class HttpResult<T> { public int code; public Throwable e; public T obj; public HttpResult() { this.code = 0; e = null; obj = null; } } public static HttpResult<String> get(final String urlStr, final Map<String, String> headers) { LogUtil.d(TAG, "http get url=" + urlStr); HttpResult<String> result = new HttpResult<>(); HttpURLConnection urlConnection = null; try { // conn urlConnection = buildGet(urlStr, headers); // request int resCode = result.code = urlConnection.getResponseCode(); // 开始连接并发送数据 // response if (resCode == RES_CODE_SUCCESS) { result.obj = buildString(urlConnection.getInputStream()); LogUtil.d(TAG, "http get success, result=" + result.obj + ", url=" + urlStr); } else { LogUtil.e(TAG, "http get failed, code=" + resCode + ", url=" + urlStr); } } catch (IOException e) { e.printStackTrace(); result.e = e; LogUtil.e(TAG, "http get error, e=" + e.getMessage() + ", url=" + urlStr); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } return result; } public static <T> HttpResult<String> post(final String urlStr, final Map<String, String> headers, T body) { LogUtil.d(TAG, "http post url=" + urlStr); HttpResult<String> result = new HttpResult<>(); HttpURLConnection urlConnection = null; try { // conn urlConnection = buildPost(urlStr, headers, body); // os.flush 开始建立连接 // request int resCode = result.code = urlConnection.getResponseCode(); // 开始发送数据 // response if (resCode == RES_CODE_SUCCESS) { result.obj = buildString(urlConnection.getInputStream()); LogUtil.d(TAG, "http post success, result=" + result + ", url=" + urlStr); } else { LogUtil.e(TAG, "http post failed, code=" + resCode + ", url=" + urlStr); } } catch (IOException e) { e.printStackTrace(); result.e = e; LogUtil.e(TAG, "http post error, e=" + e.getMessage() + ", url=" + urlStr); } finally { if (urlConnection != null) { urlConnection.disconnect(); } } return result; } private static HttpURLConnection buildGet(String urlStr, final Map<String, String> headers) throws IOException { URL url = new URL(urlStr); // URLEncoder.encode(param, "UTF-8") // conn HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); configUrlConnection(urlConnection); urlConnection.setRequestMethod(HTTP_GET); // headers buildHeaders(urlConnection, headers); return urlConnection; } private static <T> HttpURLConnection buildPost(String urlStr, final Map<String, String> headers, T body) throws IOException { URL url = new URL(urlStr); // conn HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); configUrlConnection(urlConnection); urlConnection.setRequestMethod(HTTP_POST); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); // headers buildHeaders(urlConnection, headers); // body OutputStream os = urlConnection.getOutputStream(); DataOutputStream out = new DataOutputStream(os); IOException exception = null; try { if (body instanceof String) { out.write(((String) body).getBytes(CHARSET)); } else if (body instanceof byte[]) { out.write((byte[]) body); } os.flush(); // 开始与对方建立三次握手。 } catch (IOException e) { exception = e; } finally { out.close(); os.close(); } if (exception != null) { throw exception; } return urlConnection; } private static void configUrlConnection(HttpURLConnection urlConnection) { urlConnection.setReadTimeout(TIMEOUT); urlConnection.setConnectTimeout(TIMEOUT); urlConnection.setUseCaches(false); } private static void buildHeaders(HttpURLConnection urlConnection, final Map<String, String> headers) { // common urlConnection.setRequestProperty("charset", CHARSET); // custom if (headers != null) { for (String key : headers.keySet()) { urlConnection.setRequestProperty(key, headers.get(key)); } } } private static String buildString(final InputStream is) throws IOException { if (is == null) { return null; } ByteArrayOutputStream os = new ByteArrayOutputStream(); try { int len; byte buffer[] = new byte[BUFFER_SIZE]; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } } catch (IOException e) { throw e; } finally { is.close(); os.close(); } return new String(os.toByteArray(), CHARSET); } }