安卓高效的HTTP请求框架HTTPRequest
来源:互联网 发布:北京电脑编程培训班 编辑:程序博客网 时间:2024/05/11 02:34
废话不多说 说天发布的版本有些小问题 今天主要是修复了一些问题。加入了数据字典序签名。支持二次封装的JSON格式。支持缓存。
1.1修复 加入了复用参数
package com.hengyi.util;import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import org.json.JSONException;import org.json.JSONObject;import android.os.AsyncTask;/* *恒易数据请求框架封装 */public class HTTPRequest{private static Map<String,String> param = null;private static Map<String,CacheBody> cache = null;private static final int TIME_OUT = 1000 * 5;private static int maxCacheCount = 100;//只能缓存100个。private static final int HTTP_OK = 200;private static HTTPRequest instance = null;public static final String POST = "POST";public static final String GET = "GET";private AsyncRequestListener async = null;private String server = null;//可以直接设置请求服务器private String url = null;private String method = GET;private int expire_time = 10;//秒private boolean useCache = true;private int totalLength = 0;//线程安全public static synchronized HTTPRequest getInstance(){if(instance == null) {cache = new HashMap<String,CacheBody>();instance = new HTTPRequest();}return instance;}public void SendRequest(AsyncRequestListener async) {this.async = async;AsyncDown as1 = new AsyncDown();String http = server + url;//如果存在缓存if(useCache && cache.containsKey(http)){CacheBody body = cache.get(http);long cha = System.currentTimeMillis() - body.getStampTime();if(body.getExpireTime()*1000 > cha){as1.onPostExecute(body.getContent());}else{cache.remove(http);as1.execute(http);}}else{as1.execute(http);}}public Map<String,String> getParamMap(){if(param == null){param = new HashMap<String,String>();}else{param.clear();}return param;}public void setParamMap(Map<String,String> p){param = p;}public void clearCache(){cache.clear();}public void removeCache(String http){cache.remove(http);}public void setUrl(String url) {this.url = url;} public void setMethod(String method) {this.method = method;}public void setServer(String server){this.server = server;}public void setExpireTime(int expire_time){this.expire_time = expire_time;}public void setUseCache(boolean useCache) {this.useCache = useCache;}/** * */public String httpGet(String urlStr){URL url = null;HttpURLConnection conn = null;InputStream inStream = null;String response = "";try{url = new URL(urlStr);conn = (HttpURLConnection) url.openConnection();conn.setDoInput(true);conn.setConnectTimeout(TIME_OUT);conn.setRequestProperty("Charset", "UTF-8");conn.setRequestMethod(GET);conn.setRequestProperty("accept", "*/*");conn.connect();int responseCode = conn.getResponseCode();if (responseCode == HTTP_OK){totalLength = conn.getContentLength();inStream = conn.getInputStream();response = getResponse(inStream);inStream.close();}else{response = null;}} catch (Exception e){response = null;}finally{conn.disconnect();}return response;}public String httpPost(String urlStr, String params){byte[] data = params.getBytes();URL url = null;HttpURLConnection conn = null;InputStream inStream = null;String response = null;try{url = new URL(urlStr);conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(TIME_OUT);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);conn.setRequestMethod(POST);conn.setRequestProperty("Connection", "Keep-Alive");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Content-Length",String.valueOf(data.length));conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");conn.connect();DataOutputStream outputStream = new DataOutputStream(conn.getOutputStream());outputStream.write(data);outputStream.flush();outputStream.close();int responseCode = conn.getResponseCode();if (responseCode == HTTP_OK){totalLength = conn.getContentLength();inStream = conn.getInputStream();response = getResponse(inStream);inStream.close();}else{response = null;}} catch (Exception e){response = null;}finally{conn.disconnect();}return response;}private String getResponse(InputStream inStream) throws IOException{ByteArrayOutputStream outputStream = new ByteArrayOutputStream();int readLength = 0;int len = -1;byte[] buffer = new byte[1024];while((len=inStream.read(buffer))!=-1){outputStream.write(buffer, 0, len);readLength+=len;int progress = (int) (((float) readLength / totalLength) * 100);async.UpdateProgress(progress);}byte[] data = outputStream.toByteArray();outputStream.close();return new String(data).trim();}class AsyncDown extends AsyncTask<String, Float, String> {@Overrideprotected String doInBackground(String... arg0) {String res = null;String path = arg0[0];String formatMap = formatUrlMap(param,false,false); String mParam = "sign="+MD5.md5(formatMap)+"&"+formatMap;try {if (method.equals(POST)) {res = httpPost(path,mParam);} else {res = httpGet(path + "?" + mParam);}} catch (Exception e) {async.LoadException(e.getMessage());}return res;}@Overrideprotected void onPreExecute() {async.PreRequest();}@Overrideprotected void onPostExecute(String result) {try {if(result == null) {async.LoadException("请求发起失败,服务器未响应。");return;} JSONObject object = new JSONObject(result);String http = server + url;if(useCache) {if(cache.size() < maxCacheCount){if (!cache.containsKey(http)) {CacheBody c = new CacheBody();c.setContent(result);c.setExpireTime(expire_time);c.setStampTime(System.currentTimeMillis());cache.put(http, c);}}} async.LoadObjectRequest(object);} catch (JSONException e) {async.ParseException(e.getMessage());}}}/** * * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序),并且生成url参数串<br> * 实现步骤: <br> * * @param paraMap 要排序的Map对象 * @param urlEncode 是否需要URLENCODE * @param keyToLower 是否需要将Key转换为全小写 * true:key转化成小写,false:不转化 * @return */public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower){ if(paraMap == null){ return ""; }String buff = "";Map<String, String> tmpMap = paraMap;try{List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>(){@Overridepublic int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2){return (o1.getKey()).toString().compareTo(o2.getKey());}});// 构造URL 键值对的格式StringBuilder buf = new StringBuilder();for (Map.Entry<String, String> item : infoIds){String key = item.getKey();String val = item.getValue();if (urlEncode){val = URLEncoder.encode(val, "utf-8");}if (keyToLower){buf.append(key.toLowerCase() + "=" + val);} else{buf.append(key + "=" + val);}buf.append("&");}buff = buf.toString();if (buff.equals("") == false){buff = buff.substring(0, buff.length() - 1);}} catch (Exception e){return null;}return buff;}public interface AsyncRequestListener {public void LoadObjectRequest(JSONObject object);public void UpdateProgress(int progress);public void LoadException(String errorMessage);public void ParseException(String errorMessage);public void PreRequest();}class CacheBody{private String content;private long stampTime;private int expireTime;private void setExpireTime(int expireTime){this.expireTime = expireTime;}private int getExpireTime(){return expireTime;}public void setContent(String content){this.content = content;}public String getContent(){return this.content;}public void setStampTime(long stampTime){this.stampTime = stampTime;}public long getStampTime(){return stampTime;}}}
0 0
- 安卓高效的HTTP请求框架HTTPRequest
- HttpRequest(联网 http请求)
- HttpComponents —— HTTP请求(HttpRequest)
- 安卓数据请求框架
- 安卓高效框架简单使用
- 安卓工具类------->Http请求的工具类
- .net平台HttpRequest请求超时的问题
- 安卓网络请求框架okHttp的使用与封装
- 安卓Http Post请求封装类
- 安卓开发:Volley发送Http请求
- 安卓网络请求http协议
- HttpRequest网络编程的实现框架
- HttpRequest网络编程的实现框架
- 安卓网络请求框架对比
- 安卓常用网络请求框架总结
- 安卓应用的HTTP请求方式:Apache HTTP Client和HttpURLConnection
- netty整合springMVC,实现高效的HTTP服务请求
- 迄今最好的Http请求框架
- TuYYo
- 蓝桥杯算法提高 快乐司机
- 【JZOJ 3892】 放棋子
- 第一次使用Lubuntu遇到的问题
- ubuntu安装jdk
- 安卓高效的HTTP请求框架HTTPRequest
- KVM热迁移Live Migration
- 动画的学习
- 深刻理解HDFS工作机制
- ereg函数截断
- 【数据库开发】C++测试redis中的publish/subscribe
- KVM常用操作
- 应用的版本号和版本名的获取
- HDU-3652 B-number (数位DP+模运算)