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类
- 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();
- }
- }
- }
- }
java http工具类和HttpUrlConnection上传文件分析的更多相关文章
- Android端通过HttpURLConnection上传文件到服务器
Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...
- Android端通过HttpURLConnection上传文件到server
Android端通过HttpURLConnection上传文件到server 一:实现原理 近期在做Androidclient的应用开发,涉及到要把图片上传到后台server中.自己选择了做Sprin ...
- HttpURLConnection上传文件
HttpURLConnection上传文件 import java.io.BufferedReader; import java.io.DataInputStream; import java.io. ...
- Java使用HttpURLConnection上传文件
从普通Web页面上传文件非常easy.仅仅须要在form标签叫上enctype="multipart/form-data"就可以,剩余工作便都交给浏览器去完毕数据收集并发送Http ...
- Java使用HttpURLConnection上传文件(转)
从普通Web页面上传文件很简单,只需要在form标签叫上enctype="multipart/form-data"即可,剩余工作便都交给浏览器去完成数据收集并发送Http请求.但是 ...
- Java EE之通过表单上传文件
public class Ticket { private String customerName; private String subject; private String body; priv ...
- Java如何解决form表单上传文件,以及页面返回处理结果通知!
前端JSP代码 <form id='formSumbit' class='form-horizontal' action='/ncpay/route/chlsubmcht/batchImpor' ...
- java 模拟表单方式提交上传文件
/** * 模拟form表单的形式 ,上传文件 以输出流的形式把文件写入到url中,然后用输入流来获取url的响应 * * @param url 请求地址 form表单url地址 * @param f ...
- C# ICSharpCode.SharpZipLib.dll文件压缩和解压功能类整理,上传文件或下载文件很常用
工作中我们很多时候需要进行对文件进行压缩,比较通用的压缩的dll就是ICSharpCode.SharpZipLib.dll,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...
随机推荐
- 使用Apache Server 的ab进行web请求压力测试
参考:http://www.cnblogs.com/spring3mvc/archive/2010/11/23/2414741.html 自己写代码经常是顺着逻辑写下去,写完后run一下,ok就玩完事 ...
- “全能”选手—Django 1.10文档中文版Part3
Django 1.10官方文档的入门教程已经翻译完毕,后续的部分将不会按照顺序进行翻译,而是挑重点的先翻译. 有兴趣的可以关注我的博客. 第一部分传送门 第二部分传送门 第四部分传送门 3.2 模型和 ...
- Struts2 源码分析——Result类实例
本章简言 上一章笔者讲到关于DefaultActionInvocation类执行action的相关知识.我们清楚的知道在执行action类实例之后会相关处理返回的结果.而这章笔者将对处理结果相关的内容 ...
- Net设计模式实例之建造者模式(Builder Pattern)
一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...
- Linux基础知识之文件和目录的权限机制
Linux中的用户 Linux中的用户有三类,分别是: 所有者(u) 同组用户(g) 其他人(o) 如下图所示,假设存在两个组:groupA和groupB,rachel和ross属于组groupA,m ...
- Composer根据Name显示与隐藏
//主要设置 模型的显示与隐藏 private void TransmissionByData_AxSendSelectionChange(string domName, bool isVisible ...
- C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》
说到数组,大家应该都很熟悉,在C.Pascal.Java等语言中,都有数组的概念.在C++中也提供了对数组的支持.数组简单来说就是一堆相同 数据类型对象的集合. 这里要把握住两个要点: 相同的数据类型 ...
- Intellij IDEA 导入 eclipese项目之后,中文注释乱码解决方案
首先,看导入后整个IJ界面: 可以看到注释是乱码,要解决问题就跟我开始做吧,看右下角有个"UTF-8",点一下选择"GBk",选择"Reload&qu ...
- 从零开始学Python08作业思路:开发简单的FTP
一,作业要求 开发简单的FTP 1,用户登录 2,上传/下载文件 3,不同用户家目录不同 4,查看当前目录下文件 5,充分使用面向对象 二,程序文件清单 Folder目录:用户上传文件家目录 db目录 ...
- No.022:Generate Parentheses
问题: Given n pairs of parentheses, write a function to generate all combinations of well-formed paren ...