首页 > 学院 > 开发设计 > 正文

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

2019-11-14 22:02:43
字体:
来源:转载
供稿:网友
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 = 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();}}}}
 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表