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,废话不多了,网上也有很多的资料,我将其最常用的两个函数整理了一下,提供了一个 ...
随机推荐
- Cloud Design Patterns: Prescriptive Architecture Guidance for Cloud Applications 云设计模式:云应用的规范架构指导
1.Cache-aside Pattern 缓存模式 Load data on demand into a cache from a data store. This pattern can impr ...
- mybatis入门基础(七)----延迟加载
一.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...
- Java 多线程 自定义线程辅助
之前的文章我介绍了C#版本的多线程和自定义线程处理器. 接下来我们来看看Java版本的呢 java 的线程和C#的线程有点区别,java的线程没有是否是后台线程一说,具体原因是java的线程是jvm的 ...
- TCP的定时器
TCP的定时器 在TCP协议中有的时候需要定期或者按照某个算法对某个事件进行触发,那么这个时候,TCP协议是使用定时器进行实现的.在TCP中,会有四种定时器: 重传定时器 坚持定时器 保活定时器 2M ...
- sql语句优化SQL Server
MS SQL Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了 ...
- Git合并分支操作
1. 添加自己的文件 git add .; 2. 缓存自己的文件 git stash; 3. 查看状态 git status; 4. 获取别的分支 git pull origin master(分支名 ...
- php中导入导出excel的原理
在php中我们要经常导入导出excel文件,方便后台管理.那么php导入和导出excel的原理到底是什么呢?excel分为两大版本excel2007(后缀.xlsx).excel2003(后缀.xls ...
- 51nod 算法马拉松18 A 染色问题
染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...
- 【英语学习】2016.09.11 Culture Insider: Teacher's Day in ancient China
Culture Insider: Teacher's Day in ancient China 2016-09-10 CHINADAILY Today is the 32nd Chinese Te ...
- tomcat 自定义classpath(亲自测试)
因为一直以来使用tomcat和weblogic作为应用服务器为主,最近在升级新中间件的过程中遇到一个问题,我们的web前端应用现在升级是进行全量包升级的,因为现在的系统架构为前端和后端通过rpc框架交 ...