Android Http 助手类(麻雀虽小),实现文件上/传下载,Cookie机制
2016-03-08 11:11
441 查看
Android的学习快一段时间了,不知道以后用不用的得上,用了一晚时间集自己风格封装的Http助手类,未经过实战检验,自我测试通过,功能一般凑合着用吧。
感觉不如自己封的.net的http助手类强大(毕竟.net自己本来就有不少API,呵呵),使用的事HttpURLConnection,据说是Android上推荐的类额
贴上源码,基本常用功能都实现了额,转载注明额呵呵
使用方法那是Easyway
UtilsHttpHelper helper = new UtilsHttpHelper();
//GET请求
String res=helper.get(testURL);
//POST请求
String res=helper.post(testURL, "abc=ddd&kkk=fff");
//文件下载
helper.downfile(downURL, new File(Environment.getExternalStorageDirectory().toString()+"/download/123456.jpg"))
//提交Form,且带文件上传
Map<String, String> datas = new HashMap<String, String>();
datas.put("abc", "ogeg");
datas.put("ert", "gg");
Map<String, InputStream> files = new HashMap<String, InputStream>();
files.put("abc", self.getResources().getAssets().open("test.jpg"));
String result = helper.submitformWidthResult(testURL, datas, files);
感觉不如自己封的.net的http助手类强大(毕竟.net自己本来就有不少API,呵呵),使用的事HttpURLConnection,据说是Android上推荐的类额
贴上源码,基本常用功能都实现了额,转载注明额呵呵
package com.android.pblib; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.*; import java.nio.charset.Charset; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.Map.Entry; import java.util.Set; import org.apache.http.util.ByteArrayBuffer; import com.java.pblib.UtilsStream; import com.third.pblib.UtilsJodaTime; import android.graphics.Color; import android.util.Log; public class UtilsHttpHelper { public final static String TAG = "MyHttpHelper"; private final static String CONTENT_TYPE = "application/x-www-form-urlencoded"; private final static String ACCEPT = "*/*"; private final static String USER_AGENT = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5"; private final static int BUFFER_LENGTH = 1024; private String referer; private Map<String, String> cookieMap; private int timeout = 300000; private String encoding = "utf-8"; public UtilsHttpHelper() { cookieMap = new HashMap<String, String>(); } String getCookie() { if (cookieMap.isEmpty()) return ""; Set<Entry<String, String>> set = cookieMap.entrySet(); StringBuilder sb = new StringBuilder(set.size() * 50); for (Entry<String, String> entry : set) { sb.append(String.format("%s=%s;", entry.getKey(), entry.getValue())); } sb.delete(sb.length() - 1, sb.length()); return sb.toString(); } public void putCookies(String cookies) { if (cookies == null) return; String[] strCookies = cookies.split(";"); for (int i = 0; i < strCookies.length; i++) { for (int j = 0; j < strCookies[i].length(); j++) { if (strCookies[i].charAt(j) == '=') { putCookie(strCookies[i].substring(0, j), strCookies[i].substring(j + 1, strCookies[i].length())); } } } } public void putCookie(String key, String value) { cookieMap.put(key, value); } HttpURLConnection getHttpResponse(String strUrl, String strPost, String method, String encoding) throws Exception { URL url = new URL(strUrl); HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); httpCon.setReadTimeout(timeout); httpCon.setConnectTimeout(timeout); httpCon.setUseCaches(false); //httpCon.setInstanceFollowRedirects(true); //httpCon.setRequestProperty("Referer", referer); httpCon.setRequestProperty("Content-Type", CONTENT_TYPE); httpCon.setRequestProperty("Accept", ACCEPT); httpCon.setRequestProperty("User-Agent", USER_AGENT); httpCon.setRequestProperty("Cookie", getCookie()); httpCon.setRequestProperty("Connection", "Keep-Alive"); if (method.equals("POST")) { httpCon.setDoOutput(true); httpCon.setDoInput(true); httpCon.setRequestMethod("POST"); OutputStream os = httpCon.getOutputStream(); os.write(strPost.getBytes(Charset.forName(encoding))); os.flush(); os.close(); } // 获取数据 return httpCon; } byte[] getRemoteBytes(String strUrl, String strPost, String method, String encoding) throws Exception { byte[] ret = null; InputStream is = null; HttpURLConnection httpCon = null; try { httpCon = getHttpResponse(strUrl, strPost, method, encoding); is = httpCon.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[BUFFER_LENGTH]; int n = 0; while ((n = is.read(buffer)) != -1) { out.write(buffer, 0, n); } ret = out.toByteArray(); } finally { try { if (is != null) is.close(); } catch (Exception e) { // TODO: handle exception } if (httpCon != null) { putCookies(httpCon.getHeaderField("Set-Cookie")); // 更新 referer //referer = strUrl; httpCon.disconnect(); } } return ret; } public String get(String strUrl) throws Exception { byte[] buff = getRemoteBytes(strUrl, null, "GET", encoding); return new String(buff, Charset.forName(encoding)); } public String post(String strUrl, String postdata) throws Exception { byte[] buff = getRemoteBytes(strUrl, postdata, "POST", encoding); return new String(buff, Charset.forName(encoding)); } public void downfile(String strUrl, String strPost, String method, File file) throws Exception { byte[] ret = null; InputStream is = null; HttpURLConnection httpCon = null; httpCon = getHttpResponse(strUrl, strPost, method, encoding); is = httpCon.getInputStream(); UtilsStream.InputStreamToFile(is, file); } public void downfile(String strUrl, File file) throws Exception { byte[] ret = null; InputStream is = null; HttpURLConnection httpCon = null; httpCon = getHttpResponse(strUrl, "", "POST", encoding); is = httpCon.getInputStream(); UtilsStream.InputStreamToFile(is, file); } HttpURLConnection submitform(String strUrl, Map<String, String> data, Map<String, InputStream> files) throws Exception { String BOUNDARY = UUID.randomUUID().toString(); String CONTENT_TYPE = "multipart/form-data"; //内容类型 String PREFIX = "--", LINE_END = "\r\n"; String __BOUNDARY = "--" + BOUNDARY + "\r\n"; //数据分隔线 String endline = "--" + BOUNDARY + "--\r\n";//数据结束标志 URL url = new URL(strUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setReadTimeout(10 * 10000000); conn.setConnectTimeout(10 * 10000000); conn.setDoInput(true);//允许输入流 conn.setDoOutput(true);//允许输出流 conn.setUseCaches(false);//不允许使用缓存 conn.setRequestMethod("POST");//请求方式 conn.setRequestProperty("Charset", encoding);//设置编码 conn.setRequestProperty("Connection", "keep-alive"); conn.setRequestProperty("Content-Type", CONTENT_TYPE + ";boundary=" + BOUNDARY); conn.setRequestProperty("Cookie", "now=" + UtilsJodaTime.Format(new Date(), "yyyyMMddHHmmss") + ";"); OutputStream outputSteam = conn.getOutputStream(); DataOutputStream dos = new DataOutputStream(outputSteam); //formdata for (Entry<String, String> entry : data.entrySet()) { StringBuffer sb = new StringBuffer(); //键值对一 sb.append(__BOUNDARY); sb.append("Content-Disposition: form-data;name=\"" + entry.getKey() + "\"\r\n\r\n" + entry.getValue() + "" + LINE_END); dos.write(sb.toString().getBytes()); } //files int index = 0; for (Entry<String, InputStream> entry : files.entrySet()) { index++; String filekey = String.format("uploadfile%d", index); //文件一 StringBuffer sb = new StringBuffer(); sb.append(__BOUNDARY); sb.append("Content-Disposition: form-data; name=\"" + filekey + "\"; filename=\"" + entry.getKey() + "\"" + LINE_END); sb.append("Content-Type: application/octet-stream; charset=" + encoding + LINE_END); sb.append(LINE_END); dos.write(sb.toString().getBytes()); InputStream is = entry.getValue(); byte[] bytes = new byte[1024]; int len = 0; while ((len = is.read(bytes)) != -1) { dos.write(bytes, 0, len); } is.close(); dos.write(LINE_END.getBytes()); } dos.write(endline.getBytes()); dos.flush(); return conn; } public String submitformWidthResult(String strUrl, Map<String, String> data, Map<String, InputStream> files) throws Exception { byte[] ret = null; InputStream is = null; HttpURLConnection httpCon = null; try { httpCon = submitform(strUrl, data, files); is = httpCon.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[BUFFER_LENGTH]; int n = 0; while ((n = is.read(buffer)) != -1) { out.write(buffer, 0, n); } ret = out.toByteArray(); return new String(ret, Charset.forName(encoding)); } finally { try { if (is != null) is.close(); } catch (Exception e) { // TODO: handle exception } if (httpCon != null) { putCookies(httpCon.getHeaderField("Set-Cookie")); // 更新 referer //referer = strUrl; httpCon.disconnect(); } } } }
使用方法那是Easyway
UtilsHttpHelper helper = new UtilsHttpHelper();
//GET请求
String res=helper.get(testURL);
//POST请求
String res=helper.post(testURL, "abc=ddd&kkk=fff");
//文件下载
helper.downfile(downURL, new File(Environment.getExternalStorageDirectory().toString()+"/download/123456.jpg"))
//提交Form,且带文件上传
Map<String, String> datas = new HashMap<String, String>();
datas.put("abc", "ogeg");
datas.put("ert", "gg");
Map<String, InputStream> files = new HashMap<String, InputStream>();
files.put("abc", self.getResources().getAssets().open("test.jpg"));
String result = helper.submitformWidthResult(testURL, datas, files);
相关文章推荐
- HTTP的长连接和短连接
- Java https服务器认证问题的解决方法
- AFHTTPSessionManager
- 安卓Service组件使用系列3:使用IntentService下载网络图片
- httpd2.2.3+SVN1.4.6 (一)
- httpd2.2.3+SVN1.4.6(二)
- SvnManager1.0.5+httpd2.2.3+SVN1.4.6+PHP5.2.8+MySQL5.1.51
- TCP连接建立断开
- HttpClient 大量连接等待异常的处理
- 安卓Service组件使用系列2:使用Service下载网络图片并存储于sdCard卡上
- TCP状态学习
- HTTP Status Code [RFC]
- iOS AFN 封装POST网络请求(AFURLSessionManager)
- 下载网络文件HttpURLConnection.getContentLength()大小为 -1
- 无法访问HttpRequestBase 找不到org.apache.http.client.methods.HttpRequestBase的类文件
- 【小镇的技术天梯】理解VMware WorkStation的虚拟网络
- 计算机网络——6.局域网交换技术
- android 网络判断是否可用
- JAVA利用HttpClient进行POST请求(HTTPS)
- 【bzoj1834】[ZJOI2010]network 网络扩容 费用流