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

jopen 6年前

利用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();              }          }      }  }


作者:天魂地煞