安卓高效的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