zoukankan      html  css  js  c++  java
  • HttpClient封装

    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<String, String> 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<String, String> 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<String, String> 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;
        }
    
    }
  • 相关阅读:
    数据库反范式~认识三大范式
    王家林的“云计算分布式大数据Hadoop实战高手之路从零开始”的第五讲Hadoop图文训练课程:解决典型Hadoop分布式集群环境搭建问题
    linux网络编程之System V 信号量(三):基于生产者消费者模型实现先进先出的共享内存段
    html知识点总结
    [置顶] HTML5开源RPG游戏引擎lufylegendRPG 1.0.0发布
    通过Android trace文件分析死锁ANR
    黄金连分数 蓝桥杯
    vxworks 6.9.3.1
    poj 3468 A Simple Problem with Integers(线段树区区)
    关于Java序列化的一些高级用法
  • 原文地址:https://www.cnblogs.com/exmyth/p/4566665.html
Copyright © 2011-2022 走看看