java http工具类和HttpUrlConnection上传文件分析
利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式。那么就可以用任何一门语言来模拟浏览器上传文件。下面有几篇文章从http协议入手介绍了java中上传文件.
下面分享一个自己封装的http工具类(暂不直接支持文件上传)------没有引入任何地三方jar包
1 HttpRequest类
package com.yy.game.risecloud.sdk.common.model; import java.util.Map; /** * http请求类 * * @author zhuhui * */ public class HttpRequest { /** * http请求编码,默认UTF-8 */ public String charsetName = RisecloudSdkConstant.CHARSET_NAME; /** * HTTP请求超时时间,默认5000ms */ public int timeout = RisecloudSdkConstant.HTTP_REQUEST_TIMEOUT; /*** * http请求url地址 */ public String url; /*** * http请求方法,只支持GET,POST,PUT,DELETE */ public HttpMethod method; /*** * http请求消息报头 */ public Map<String, String> headers; /** * http请求url参数 */ public Map<String, String> params; /*** * http请求正文内容 */ public String content; public HttpRequest() { } public HttpRequest(String url, HttpMethod method) { this.url = url; this.method = method; } public HttpRequest(String url, HttpMethod method, Map<String, String> headers) { this(url, method); this.headers = headers; } public HttpRequest(String url, HttpMethod method, Map<String, String> headers, Map<String, String> params) { this(url, method, headers); this.params = params; } public HttpRequest(String url, HttpMethod method, Map<String, String> headers, String content) { this(url, method, headers); this.content = content; } } 2. HttpResponse类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package com.yy.game.risecloud.sdk.common.model; /** * http响应类 * @author zhuhui * */ public class HttpResponse { /** * http响应状态码 */ public int code; /** * 与响应代码一起返回的 HTTP 响应消息 */ public String message; /** * 响应正文内容 */ public String content; public HttpResponse(int code, String message, String content) { this.code = code; this.message = message; this.content = content; } }
2. HttpResponse类
package com.yy.game.risecloud.sdk.common.model; /** * http响应类 * @author zhuhui * */ public class HttpResponse { /** * http响应状态码 */ public int code; /** * 与响应代码一起返回的 HTTP 响应消息 */ public String message; /** * 响应正文内容 */ public String content; public HttpResponse(int code, String message, String content) { this.code = code; this.message = message; this.content = content; } }
3.用到的工具方法(可能直接拷贝有问题,去掉出错的代码就可以了)package com.yy.game.risecloud.sdk.common.internal; import java.net.URLEncoder; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; import com.yy.game.risecloud.sdk.common.model.RisecloudSdkConstant; /** * 常用工具类 * * @author zhuhui */ public class CommonUtil { private CommonUtil() { } /** * 判断字符串是否为空 * * @param s * @return 如果字符串为空或者字符串去除首尾空格为空字符串则返回true,反之返回false */ public static boolean isEmpty(String s) { if (s == null || s.trim().length() == 0) { return true; } return false; } /** * 判断map是否为空 * * @param map * map对象 * @return 如果map==null或者map.size()==0则返回true,反之返回false */ @SuppressWarnings("all") public static boolean isEmpty(Map map) { if (map == null || map.size() == 0) { return true; } return false; } /*** * 判断list是否为空 * * @param list * list对象 * @return 如果list==null或者list.size==则返回true,反之返回false */ @SuppressWarnings("all") public static boolean isEmpty(List list) { if (list == null || list.size() == 0) { return true; } return false; } /** * 将map转成http url请求参数的格式 * * @param map * @return map为空返回null,反之返回类似name=zhangsan&age=14的这样的格式 */ public static String map2UrlParams(Map<String, String> map) { if (isEmpty(map)) { return null; } StringBuilder sb = new StringBuilder(); for (Entry<String, String> entry : map.entrySet()) { if (!isEmpty(entry.getValue())) { String key = entry.getKey(); try { String value = URLEncoder.encode(entry.getValue(), "UTF-8"); sb.append("&" + key + "=" + value); } catch (Exception e) { e.printStackTrace(); } } } if (sb.length() > 0) { return sb.substring(1); } return null; } public static String uuid() { return UUID.randomUUID().toString(); } public static String deleteWhitespace(String str) { if (isEmpty(str)) { return str; } int sz = str.length(); char[] chs = new char[sz]; int count = 0; for (int i = 0; i < sz; i++) { if (!Character.isWhitespace(str.charAt(i))) { chs[count++] = str.charAt(i); } } if (count == sz) { return str; } return new String(chs, 0, count); } public static Map<String, String> auth(String token) { Map<String, String> header = new HashMap<String, String>(); header.put(RisecloudSdkConstant.HEAD_X_AUTH_TOKEN, token); return header; } }
4 HttpMethod
package com.yy.game.risecloud.sdk.common.model; /** * http请求方法枚举类 * * @author zhuhui * */ public enum HttpMethod { GET, POST, PUT, DELETE; }5 HttpUtil类
package com.yy.game.risecloud.sdk.common.internal; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import com.yy.game.risecloud.sdk.common.model.HttpMethod; import com.yy.game.risecloud.sdk.common.model.HttpRequest; import com.yy.game.risecloud.sdk.common.model.HttpResponse; public class HttpUtil { private HttpUtil() { } static HostnameVerifier sslHostnameVerifier; static synchronized void initSslHostnameVerifier() { if (sslHostnameVerifier != null) { return; } sslHostnameVerifier = new HostnameVerifier() { public boolean verify(String urlHostName, SSLSession session) { return urlHostName != null && urlHostName.equals(session.getPeerHost()); } }; } static SSLSocketFactory sslSocketFactory; /** * 忽略SSL证书 */ static synchronized void initSslSocketFactory() { if (sslSocketFactory != null) { return; } InputStream in = null; try { SSLContext context = SSLContext.getInstance("TLS"); final X509TrustManager trustManager = new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } }; context.init(null, new TrustManager[] { trustManager }, null); sslSocketFactory = context.getSocketFactory(); } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } } private static HttpURLConnection createConnection(String url) throws Exception { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); if ("https".equalsIgnoreCase(url.substring(0, 5))) { if (sslSocketFactory == null) { initSslSocketFactory(); } ((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory); if (sslHostnameVerifier == null) { initSslHostnameVerifier(); } ((HttpsURLConnection) conn).setHostnameVerifier(sslHostnameVerifier); } conn.setUseCaches(false); conn.setInstanceFollowRedirects(true); conn.setRequestProperty("Connection", "close"); return conn; } public static HttpResponse execute(HttpRequest request) throws Exception { /* 参数检查 */ if (request == null) { throw new IllegalArgumentException("HttpRequest must be not null"); } if (CommonUtil.isEmpty(request.url)) { throw new IllegalArgumentException("HttpRequest url must be not null"); } if (request.timeout < 0) { throw new IllegalArgumentException(String.format("timeout=[%s],HttpRequest timeout must be Greater than zero", request.timeout + "")); } if (request.method == HttpMethod.GET && !CommonUtil.isEmpty(request.content)) { throw new IllegalArgumentException("When Http Method is GET,the HttpRquest content must be null"); } HttpURLConnection connection = null; String url = request.url; try { // 设置url传递参数 if (!CommonUtil.isEmpty(request.params)) { String queryString = CommonUtil.map2UrlParams(request.params); if (!CommonUtil.isEmpty(queryString)) { url = url + "?" + queryString; } } // 获取连接 connection = createConnection(url); connection.setRequestMethod(request.method.toString()); connection.setConnectTimeout(request.timeout); connection.setDoOutput(true); connection.setDoInput(true); // 设置请求头 if (!CommonUtil.isEmpty(request.headers)) { for (Map.Entry<String, String> entry : request.headers.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } } connection.connect(); // 设置请求正文 if (!CommonUtil.isEmpty(request.content)) { DataOutputStream out = new DataOutputStream(connection.getOutputStream()); out.write(request.content.getBytes(request.charsetName)); out.close(); } int code = connection.getResponseCode(); String message = connection.getResponseMessage(); StringBuilder result = new StringBuilder(); InputStream in = connection.getErrorStream(); if (in == null) { in = connection.getInputStream(); } if (in != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); char[] cbuf = new char[4096]; while (true) { int len = reader.read(cbuf); if (len < 0) { break; } result.append(cbuf, 0, len); } } return new HttpResponse(code, message, result.toString()); } catch (Exception e) { throw e; } finally { if (connection != null) { connection.disconnect(); } } } }