首页 > 代码库 > java http工具类和HttpUrlConnection上传文件分析

java http工具类和HttpUrlConnection上传文件分析

利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式。那么就可以用任何一门语言来模拟浏览器上传文件。下面有几篇文章从http协议入手介绍了java中上传文件.

  • Java使用HttpURLConnection上传文件
  • 使用HttpUrlConnection进行post请求上传文件
  • 封装HttpClient4.3.x包括文件上传
  • 使用 HttpClient 4 进行文件上传
  • httpclient4教程

下面分享一个自己封装的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类
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 = http://www.mamicode.com/URLEncoder.encode(entry.getValue(), "UTF-8");>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();			}		}	}}
 

java http工具类和HttpUrlConnection上传文件分析