博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpClient封装
阅读量:5167 次
发布时间:2019-06-13

本文共 12751 字,大约阅读时间需要 42 分钟。

 

 

package com.exmyth.net;public interface KeyLoadListener {    public void onSuccess(byte[] key);//    public void onFailure(int statusCode, String content);}

 

 

package com.exmyth.net;public abstract class LoadDataHandler {    /**     * 加载数据时调用     */    public void onStart() {};    /**     * 加载数据调用,得到缓存数据     *      * @param data     *///    protected void onLoadCaches(String data) {};    /**     * 当调用服务器接口成功获取数据时,调用这个方法     *      * @param data     */    public abstract void onSuccess(String data);    /**     * 当调用服务器接口获取数据失败时,调用这个方法     *      * @param statusCode     *            出错原因     * @param message     *            出错原因描述     */    public void onFailure(int statusCode, String message) {    };    /**     * 加载完成时调用     */    public void onFinish() {            }    protected void onSuccess(byte[] content) {        this.onSuccess(new String(content));    }    protected void onFailure(int statusCode, byte[] content) {        this.onFailure(statusCode,new String(content));    }}

 

 

package com.exmyth.net;import org.apache.http.Header;import com.loopj.android.http.AsyncHttpResponseHandler;  public class WPHttpResponseHandler extends AsyncHttpResponseHandler {      private LoadDataHandler mHandler;        public WPHttpResponseHandler(LoadDataHandler mHandler) {          this.mHandler = mHandler;      }      @Override      public void onStart() {          super.onStart();        mHandler.onStart();      }          @Override    public void onFailure(int statusCode, Header[] headers, byte[] content, Throwable error) {        // TODO Auto-generated method stub        super.onFailure(statusCode, headers, content, error);//        if (content != null && 0 < content.length ) {             mHandler.onFailure(statusCode, content);  //        }    }        @Override      public void onFinish() {        super.onFinish();          mHandler.onFinish();      }        @Override    public void onSuccess(int statusCode, Header[] headers, byte[] content) {        super.onSuccess(statusCode, headers, content);        switch (statusCode) {          case 200:  //            if (content != null && 0 < content.length ) {                 mHandler.onSuccess(content);//            }            break;          case 401:              mHandler.onFailure(401, "没有登录");            break;          case 403:            mHandler.onFailure(403, "没有权限");            break;          default:              break;          }            }}

 

 

package com.exmyth.utils;import com.exmyth.net.KeyLoadListener;import com.exmyth.net.LoadDataHandler;import com.exmyth.net.WPHttpResponseHandler;public class HttpUtils{        private static String versionId = "24";    private static String appVersion = "24";//当前的appVersion,如果版本过低,会有强制更新提示    private static final String CLIENT_KEY_STORE_PASSWORD = "198345";      private static Context mContext;    private static AsyncHttpClient client =new AsyncHttpClient();    //实例话对象    public static byte[] key = null;    public static boolean encrypt = false;        public HttpUtils(Context context){        mContext = context;        client.setTimeout(10000);   //设置链接超时,如果不设置,默认为10s        PersistentCookieStore myCookieStore = new PersistentCookieStore(mContext);         BasicClientCookie newCookie = new BasicClientCookie("name", CommonUtil.mac);         newCookie.setVersion(1);         newCookie.setDomain("mydomain.com");         newCookie.setPath("/");         myCookieStore.addCookie(newCookie);         client.setCookieStore(myCookieStore);            try {                                                KeyStore keystore = KeyStore.getInstance("BKS");                keystore.load(mContext.getResources().openRawResource(                    R.raw.client), CLIENT_KEY_STORE_PASSWORD.toCharArray());                KeyStore trustkeystore = KeyStore.getInstance("BKS");                trustkeystore.load(mContext.getResources().openRawResource(                    R.raw.server_trust), CLIENT_KEY_STORE_PASSWORD.toCharArray());                                SSLSocketFactory factory = new SSLSocketFactory(keystore, CLIENT_KEY_STORE_PASSWORD, trustkeystore);                Scheme sch = new Scheme("https", factory, 443);                client.getHttpClient().getConnectionManager().getSchemeRegistry().register(sch);            }catch(Exception e){                e.printStackTrace();            }    }        public static void post(final String url, final Map
param,final LoadDataHandler callback) { if(encrypt && null != param && 0 < param.keySet().size()){ if (key == null) { getKey(0, callback, new KeyLoadListener() { @Override public void onSuccess(byte[] key) { doPost(0, url, key,param, callback); } }); } else{ doPost(0, url, key,param, callback); } }else{ doPost(0, url, null,param, callback); } } //3000 获取key的接口失败(onFailure) //4000 app问题,请求失败 //5000 获取key的接口不能顺利请求(statusCode != 200) //5100 服务器端getKey异常 //5200 服务器端返回结果不合法,或者APP解析结果异常 //5300 从服务端获取的key是空的(TextUtils.isEmpty(key)==true) //6000 第一次请求获取key失败 //7000 获取到key后,第二请求后仍然失效 //8000 {success:false}正常aes加密/非加密请求,但是success为false //8100 第二次请求aes加密请求仍然失败 //8200 服务器端返回结果不合法,或者APP解析结果异常 private static void doPost(final int index, final String url, byte[] key, final Map
param , final LoadDataHandler callback) { if (1 < index) { callback.onFailure(7000, "获取到key后,第二请求后仍然失效"); } RequestParams requestParams = new RequestParams(); if(null != param && 0 < param.keySet().size()&& null != key && 0 < key.length){ AESUtil aes = new AESUtil(key); for (Map.Entry
entry : param.entrySet()) { requestParams.put(entry.getKey(), defaultEncodeBase64String(aes, entry.getValue())); } } //无参数,不需要做aes加密 requestParams.put("versionId", versionId); client.post(url, requestParams, new WPHttpResponseHandler( new LoadDataHandler() { @Override public void onSuccess(String data) { try { JSONObject result = new JSONObject(data); if("true".equals(result.optString("success"))){ callback.onSuccess(data); } else{ //{"errMsg":"Aes Decode error","errorCode":"255","success":false} if ("255".equals(result.optString("errorCode"))) { if(0 < index){ callback.onFailure(8100, "第二次请求aes加密请求仍然失败"); } else{ //第一次请求aes加密请求失败,就请求获取key继续调用接口 getKey(0, callback,new KeyLoadListener() { @Override public void onSuccess(byte[] key) { doPost((index+1), url, key, param, callback); } }); } } else{ //{success:false}正常aes加密/非加密请求,但是success为false callback.onFailure(8000, data); } } } catch (JSONException e) {// e.printStackTrace(); callback.onFailure(8200, data); } } @Override public void onFailure(int statusCode, String message) { super.onFailure(statusCode, message); callback.onFailure(4000, message); } })); } //获得key private static void getKey(final int index, final LoadDataHandler callback, final KeyLoadListener listener) { if (0 < index) { callback.onFailure(6000, "第一次请求获取key失败"); } else{ client.post(RequestConfig.Key_URL, null, new AsyncHttpResponseHandler(){ @Override public void onSuccess(int statusCode,Header[] headers, byte[] content) { if(200 == statusCode){ try { JSONObject jsonObject = new JSONObject(new String(content)); String success = jsonObject.optString("success"); //{"data":"1234567890ABCDEF1234567890ABCDEF","success":true} if("true".equals(success)){ String data = jsonObject.optString("data"); if (!TextUtils.isEmpty(data)) { key = Base64.decodeBase64(data.getBytes()); listener.onSuccess(key); } else{// getKey((index + 1), callback,listener);// listener.onFailure(5300,"从服务端获取的key是空的(TextUtils.isEmpty(key)==true)"); callback.onFailure(5300, "从服务端获取的key是空的(TextUtils.isEmpty(key)==true)"); } } else{ //{"errMsg":"errorCode","success":false} callback.onFailure(5100, "服务器端getKey异常"); //getKey((index + 1), callback,listener); } } catch (JSONException e) {// e.printStackTrace(); callback.onFailure(5200, "服务器端返回结果不合法,或者APP解析结果异常"); } } else{ callback.onFailure(5000, "获取key的接口不能顺利请求(statusCode != 200)"); } } @Override public void onFailure(int statusCode, Header[] headers, byte[] content, Throwable error) { super.onFailure(statusCode, headers, content, error);// getKey((index + 1), callback,listener); callback.onFailure(3000, "获取key的接口失败(onFailure)"); } }); } } // 加密密码 public static String md5(String str) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("MD5"); messageDigest.reset(); messageDigest.update(str.getBytes("UTF-8")); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } byte[] byteArray = messageDigest.digest(); StringBuffer md5StrBuff = new StringBuffer(); for (int i = 0; i < byteArray.length; i++) { if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) md5StrBuff.append("0").append( Integer.toHexString(0xFF & byteArray[i])); else md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); } return md5StrBuff.toString(); } //获取默认请求参数字节 private static String defaultEncodeBase64String(AESUtil aes, String param){ //如果是加密请求,调动此方法 return encodeBase64String(true,aes,param); //如果是非加密请求,调动此方法// return encodeBase64String(false,null,param); } private static String encodeBase64String(boolean encrypt,AESUtil aes, String param){ if(null == param){ return null; } if(encrypt){ if(null == aes){ if (null == key){ key = "123456789001234567891234567890CD".getBytes(); } aes = new AESUtil(key); } return Base64.encodeBase64String(aes.aesEncrypt(param.getBytes())); }// return Base64.encodeBase64String(param.getBytes()); return param; }}

 

转载于:https://www.cnblogs.com/exmyth/p/4566665.html

你可能感兴趣的文章
onlevelwasloaded的调用时机
查看>>
求出斐波那契数组
查看>>
lr_start_transaction/lr_end_transaction事物组合
查看>>
CodeIgniter学习笔记(四)——CI超级对象中的load装载器
查看>>
.NET CLR基本术语
查看>>
ubuntu的home目录下,Desktop等目录消失不见
查看>>
建立,查询二叉树 hdu 5444
查看>>
[Spring框架]Spring 事务管理基础入门总结.
查看>>
2017.3.24上午
查看>>
Python-常用模块及简单的案列
查看>>
LeetCode 159. Longest Substring with At Most Two Distinct Characters
查看>>
基本算法概论
查看>>
jquery动态移除/增加onclick属性详解
查看>>
JavaScript---Promise
查看>>
暖暖的感动
查看>>
Java中的日期和时间
查看>>
Django基于admin的stark组件创建(一)
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
springboot jar包运行中获取资源文件
查看>>