Activity


public class MainActivity extends Activity implements OnClickListener {
    private Context ctx;
    private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ctx = this;
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);
        findViewById(R.id.button4).setOnClickListener(this);
        tv = (TextView) findViewById(R.id.tv);
    }
    @Override
    public void onClick(View v) {
        tv.setText("");
        switch (v.getId()) {
        case R.id.button1:
            requestLogin();
            break;
        case R.id.button2:
            requestUserDetailInfo();
            break;
        case R.id.button3:
            requestUserWallet();
            break;
        case R.id.button4:
            requestUserBankCard();
            break;
        default:
            break;
        }
    }
    /**
     * 登录
     */
    private void requestLogin() {
        JSONObject obj = new JSONObject();
        try {
            obj.put("Mobile", "13412341234");
            obj.put("Password", "12341234");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        BcbJsonRequest jsonRequest = new BcbJsonRequest(Urls.UserDoLogin, obj, null, new BcbRequest.BcbCallBack<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i("bqt", "登录后返回的数据:" + response.toString());
                if (HttpCallBackUtils.getRequestStatus(response, ctx)) {
                    JSONObject data = HttpCallBackUtils.getResultObject(response);
                    if (data != null) {
                        App.instance.setAccessToken(data.optString("Access_Token"));
                        tv.setText(JsonFormatTool.formatJson(data.toString()));
                    }
                }
            }
            @Override
            public void onErrorResponse(Exception error) {
            }
        });
        App.instance.getRequestQueue().add(jsonRequest);
    }
    /**
     * 用户信息
     */
    private void requestUserDetailInfo() {
        BcbJsonRequest jsonRequest = new BcbJsonRequest(Urls.UserMessage, null, App.instance.getAccessToken(), new BcbRequest.BcbCallBack<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i("bqt", "用户信息:" + response.toString());
                if (HttpCallBackUtils.getRequestStatus(response, ctx)) {
                    JSONObject data = HttpCallBackUtils.getResultObject(response);
                    if (data != null) {
                        tv.setText(JsonFormatTool.formatJson(data.toString()));
                    }
                }
            }
            @Override
            public void onErrorResponse(Exception error) {
            }
        });
        App.instance.getRequestQueue().add(jsonRequest);
    }
    /**
     * 用户钱包
     */
    private void requestUserWallet() {
        BcbJsonRequest jsonRequest = new BcbJsonRequest(Urls.UserWallet, null, App.instance.getAccessToken(), new BcbRequest.BcbCallBack<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i("bqt", "用户钱包:" + response.toString());
                if (HttpCallBackUtils.getRequestStatus(response, ctx)) {
                    JSONObject data = HttpCallBackUtils.getResultObject(response);
                    if (data != null) {
                        tv.setText(JsonFormatTool.formatJson(data.toString()));
                    }
                }
            }
            @Override
            public void onErrorResponse(Exception error) {
            }
        });
        App.instance.getRequestQueue().add(jsonRequest);
    }
    /**
     * 用户银行卡
     */
    private void requestUserBankCard() {
        BcbJsonRequest jsonRequest = new BcbJsonRequest(Urls.UrlUserBand, null, App.instance.getAccessToken(), new BcbRequest.BcbCallBack<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                Log.i("bqt", "用户银行卡:" + response.toString());
                if (HttpCallBackUtils.getRequestStatus(response, ctx)) {
                    JSONObject data = HttpCallBackUtils.getResultObject(response);
                    if (data != null) {
                        tv.setText(JsonFormatTool.formatJson(data.toString()));
                    }
                }
            }
            @Override
            public void onErrorResponse(Exception error) {
            }
        });
        App.instance.getRequestQueue().add(jsonRequest);
    }
}

全局Application

public class App extends Application {
    public static App instance;
    private RequestQueue requestQueue;
    private String accessToken;
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }
    public RequestQueue getRequestQueue() {
        if (null == requestQueue) requestQueue = Volley.newRequestQueue(this);
        return requestQueue;
    }
    public String getAccessToken() {
        return accessToken;
    }
    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }
}

加密解密工具

public class DESUtil {
    /**
     * 从加密了的token中获取key
     */
    public static String decodeKey(String encodeToken) {
        try {
            byte[] baseDecodeResult = Base64.decode(encodeToken, Base64.DEFAULT);
            byte[] keybyte = MyConstants.KEY.getBytes();
            byte[] decodeByte_ECB = ees3DecodeECB(keybyte, baseDecodeResult);
            String decodeString_ECB = new String(decodeByte_ECB, "UTF-8");
            // 从已加密的token中解析key
            // 先解密token为铭文,再解析字符串        {usertoken}|{secutiryKey}
            if (null != decodeString_ECB && decodeString_ECB.contains("|")) return decodeString_ECB.substring(decodeString_ECB.indexOf("|") + 1);
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 加密数据
     */
    @SuppressLint("TrulyRandom")
    public static byte[] des3EncodeECB(byte[] key, byte[] data) throws Exception {
        DESedeKeySpec spec = new DESedeKeySpec(key);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
        Key deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS7Padding");
        cipher.init(Cipher.ENCRYPT_MODE, deskey);
        byte[] bOut = cipher.doFinal(data);
        return bOut;
    }
    /**
     * 解密数据
     */
    public static byte[] ees3DecodeECB(byte[] key, byte[] data) throws Exception {
        DESedeKeySpec spec = new DESedeKeySpec(key);
        SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
        Key deskey = keyfactory.generateSecret(spec);
        Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS7Padding");
        cipher.init(Cipher.DECRYPT_MODE, deskey);
        byte[] bOut = cipher.doFinal(data);
        return bOut;
    }
}

请求Request

public abstract class BcbRequest<T> extends Request<T> {
    protected static final String PROTOCOL_CHARSET = "utf-8";
    protected static final String CONTENT_TYPE = "application/json; charset=utf-8";
    //自定义监听器
    private BcbCallBack<T> mBcbCallBack;
    private BcbIndexCallBack<T> mBcbIndexCallBack;
    //Post请求的实体,如果为 null,则为GET请求,否则为POST请求
    private String mRequestBody;
    //已加密的token,没有为null
    private String mEncodeToken;
    private String key;
    //位置参数,默认为 -1,表示不使用位置参数回调
    private int index = -1;
    //是否添加设备信息
    private boolean isAddDevInfo = true;
    //************************************************        重写请求头,请求头是不用加密的        ******************************************
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = new HashMap<String, String>();
        try {
            if (mEncodeToken != null) headers.put("access-token", mEncodeToken);
            String pkName = App.instance.getPackageName();//包名
            String version = App.instance.getPackageManager().getPackageInfo(pkName, 0).versionName;//清单文件中设置的版本号
            headers.put("version", version);
            headers.put("platform", "2");
            Log.i("bqt", "【请求头】" + headers.toString());
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return headers;
    }
    //************************************************        重写请求体,请求体中的数据都是加密的        ******************************************
    /**
     * 重写请求实体
     * @return 如果存在请求的参数,则需要返回加了密的请求实体
     */
    @Override
    public byte[] getBody() {
        try {
            // 检测传入的密文token是否为空,没有token参数,数据解密的key为默认的
            if (null == mEncodeToken) {
                Log.i("bqt", "【加密前的请求体】" + mRequestBody);
                key = MyConstants.KEY;
            } else key = DESUtil.decodeKey(mEncodeToken);
            // 如果传入参数不为空,则需要加密传入的数据
            if (null != mRequestBody) {
                byte[] data = mRequestBody.getBytes(PROTOCOL_CHARSET);
                byte[] encodeByte_ECB = DESUtil.des3EncodeECB(key.getBytes(), data);
                String body = Base64.encodeToString(encodeByte_ECB, Base64.DEFAULT);
                Log.i("bqt", "【加密后的请求体】" + body.toString());
                return body.getBytes();
            }
        } catch (Exception e) {
            VolleyLog.wtf("Unsupported DES3Encoding while trying to get the bytes of %s using %s", mRequestBody, PROTOCOL_CHARSET);
        }
        //返回为空
        return null;
    }
    //************************************************        构造函数        ******************************************
    /**
     * 构造函数
     * @param url         请求地址
     * @param requestBody 请求实体
     * @param encodeToken 已加密的token,没有就传null
     * @param bcbCallBack 请求结果回调
     */
    public BcbRequest(String url, String requestBody, String encodeToken, BcbCallBack<T> bcbCallBack) {
        this(requestBody == null ? Method.GET : Method.POST, url, requestBody, encodeToken, bcbCallBack);
    }
    /**
     * 构造函数
     * @param method      请求方式
     * @param url         请求地址
     * @param requestBody 请求实体
     * @param encodeToken 已加密的token,没有就传null
     * @param bcbCallBack 请求结果回调
     */
    public BcbRequest(int method, String url, String requestBody, String encodeToken, final BcbCallBack bcbCallBack) {
        //将出错信息用接口保存起来
        super(method, url, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                bcbCallBack.onErrorResponse(error);
            }
        });
        Log.i("url", "url = " + url + " requestBody = " + requestBody);
        mBcbCallBack = bcbCallBack;
        if (TextUtils.isEmpty(requestBody)) mRequestBody = null;
        else mRequestBody = requestBody;
        mEncodeToken = encodeToken;
    }
    /**
     * 构造函数
     * @param method       请求方式
     * @param url          请求接口
     * @param requestBody  请求实体
     * @param encodeToken  已加密的token,没有就传null
     * @param isAddDevInfo 是否添加设备信息
     * @param bcbCallBack  请求结果回调
     */
    public BcbRequest(int method, String url, String requestBody, String encodeToken, boolean isAddDevInfo, final BcbCallBack bcbCallBack) {
        //将出错信息用接口保存起来
        super(method, url, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                bcbCallBack.onErrorResponse(error);
                Log.d("url", "error = " + error.toString());
            }
        });
        Log.d("url", "url = " + url + " requestBody = " + requestBody);
        mBcbCallBack = bcbCallBack;
        if (TextUtils.isEmpty(requestBody)) mRequestBody = null;
        else mRequestBody = requestBody;
        mEncodeToken = encodeToken;
        this.isAddDevInfo = isAddDevInfo;
    }
    /**
     * 构造函数
     * @param method      请求方式
     * @param url         请求接口
     * @param requestBody 请求实体,没有就传null
     * @param encodeToken 已加密的token, 没有就传null
     * @param index       位置参数,主要用于记录列表某个位置请求
     * @param bcbCallBack 回调
     */
    public BcbRequest(int method, String url, String requestBody, String encodeToken, int index, final BcbIndexCallBack bcbCallBack) {
        //将出错信息用接口保存起来
        super(method, url, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                bcbCallBack.onErrorResponse(error);
            }
        });
        Log.i("bqt", "【url 】 " + url + " 【requestBody 】 " + requestBody);
        this.index = index;
        mBcbIndexCallBack = bcbCallBack;
        if (TextUtils.isEmpty(requestBody)) mRequestBody = null;
        else mRequestBody = requestBody;
        mEncodeToken = encodeToken;
    }
    //*********************************************        复写的函数        *********************************************
    @Override
    protected void deliverResponse(T response) {
        //如果不存在位置参数,则使用默认回调,否则使用位置回调
        if (index == -1) mBcbCallBack.onResponse(response);
        else mBcbIndexCallBack.onResponse(response, index);
    }
    /**
     * 子类必须实现该功能,对返回的回调响应数据 response.data 进行解码转成相应类型的数据
     */
    @Override
    abstract protected Response<T> parseNetworkResponse(NetworkResponse response);
    /**
     * @deprecated Use {@link #getBodyContentType()}.
     */
    @Override
    public String getPostBodyContentType() {
        return getBodyContentType();
    }
    /**
     * @deprecated Use {@link #getBody()}.
     */
    @Override
    public byte[] getPostBody() {
        return getBody();
    }
    @Override
    public String getBodyContentType() {
        return CONTENT_TYPE;
    }
    //************************************************        回调        ******************************************
    public interface BcbCallBack<T> {
        void onResponse(T response);
        void onErrorResponse(Exception error);
    }
    public interface BcbIndexCallBack<T> {
        void onResponse(T response, int index);
        void onErrorResponse(Exception error);
    }
}

请求封装Request

public class BcbJsonRequest extends BcbRequest<JSONObject> {
    private String mEncodeToken;
    /**
     * 服务器回调
     */
    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            //返回不成功,则提示是否成功
            if (response.statusCode != 200) {
                Log.i("bqt", "返回出错,状态码为:" + response.statusCode + " 请求链接:" + getUrl());
                return Response.error(new ParseError());
            }
            //获取解密的key,没有token参数,数据解密的key为默认的
            String key;
            if (null == mEncodeToken) key = MyConstants.KEY;
            else key = DESUtil.decodeKey(mEncodeToken);
            Log.i("bqt", "【加密的Token】" + mEncodeToken);
            Log.i("bqt", "【解密的Token】" + key);
            //解密数据
            String result = new String(response.data);
            byte[] baseDecodeResult = Base64.decode(result, Base64.DEFAULT);
            byte[] keybyte = key.getBytes();
            byte[] decodeByte_ECB = DESUtil.ees3DecodeECB(keybyte, baseDecodeResult);
            String decodeJsonString = new String(decodeByte_ECB, PROTOCOL_CHARSET);
            Log.i("bqt", "【加密的JSON串】" + result);
            Log.i("bqt", "【解密的JSON串】" + decodeJsonString);
            //返回解密后的对象
            return Response.success(new JSONObject(decodeJsonString), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        } catch (Exception ex) {
            return Response.error(new ParseError(ex));
        }
    }
    //*********************************************            构造函数            *********************************************
    /**
     * 构造函数,默认为POST请求
     * @param url           请求接口
     * @param jsonObject    JSONObject对象
     * @param encodeToken   Token
     * @param callBack      请求回调
     */
    public BcbJsonRequest(String url, JSONObject jsonObject, String encodeToken, BcbCallBack<JSONObject> callBack) {
        this(Method.POST, url, jsonObject, encodeToken, callBack);
    }
    /**
     * 构造函数,默认为POST请求
     * @param url           请求接口
     * @param jsonObject    JSONObject对象
     * @param encodeToken   Token
     * @param index         位置参数
     * @param callBack      请求回调
     */
    public BcbJsonRequest(String url, JSONObject jsonObject, String encodeToken, int index, BcbIndexCallBack<JSONObject> callBack) {
        this(Method.POST, url, jsonObject, encodeToken, index, callBack);
    }
    /**
     * 构造函数
     * @param url           请求接口
     * @param jsonObject    JSONObject对象
     * @param encodeToken   Token
     * @param isAddDevInfo  是否添加设备信息
     * @param callBack      请求回调
     */
    public BcbJsonRequest(String url, JSONObject jsonObject, String encodeToken, boolean isAddDevInfo, BcbCallBack<JSONObject> callBack) {
        super(Method.POST, url, jsonObject == null ? "" : jsonObject.toString(), encodeToken, isAddDevInfo, callBack);
        mEncodeToken = encodeToken;
    }
    /**
     * 构造函数
     * @param method        请求方式,GET ? POST 还是其他
     * @param url           请求接口
     * @param jsonObject    JSONObject对象
     * @param encodeToken   Token
     * @param callBack      请求回调
     */
    public BcbJsonRequest(int method, String url, JSONObject jsonObject, String encodeToken, BcbCallBack<JSONObject> callBack) {
        super(method, url, jsonObject == null ? "" : jsonObject.toString(), encodeToken, callBack);
        mEncodeToken = encodeToken;
    }
    /**
     * 构造函数
     * @param method        请求方式,GET ? POST 还是其他
     * @param url           请求接口
     * @param jsonObject    JSONObject对象
     * @param encodeToken   Token
     * @param index         位置参数
     * @param callBack      请求回调
     */
    public BcbJsonRequest(int method, String url, JSONObject jsonObject, String encodeToken, int index, BcbIndexCallBack<JSONObject> callBack) {
        super(method, url, jsonObject == null ? "" : jsonObject.toString(), encodeToken, index, callBack);
        mEncodeToken = encodeToken;
    }
}

Volley 百财帮封装的更多相关文章

  1. volley二次封装

    产品中使用Volley框架已有多时,本身已有良好封装的Volley确实给程序开发带来了很多便利与快捷.但随着产品功能的不断增加,服务器接口的不断复杂化,直接使用Volley原生的JSONObjectR ...

  2. 继续封装个 Volley 组件

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 前面已经封装了很多常用.基础的组件了:base-module, 包括了: crash 处理 常用工具类 apk 升级处理 log 组 ...

  3. volley全然解析

    一.volley是什么? 1.简单介绍   Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的.从名字由来和配图中无数急促的火箭能够看出 Volley ...

  4. Android网络框架源码分析一---Volley

    转载自 http://www.jianshu.com/p/9e17727f31a1?utm_campaign=maleskine&utm_content=note&utm_medium ...

  5. Volley框架的使用

    所谓Volley,它是2013年Google I/O上发布的一款网络框架,基于Android平台,能使网络通信更快,更简单,更健全. 它的优点:(1)默认Android2.3及以上基于HttpURLC ...

  6. 【开源项目13】Volley框架 以及 设置request超时时间

    Volley提供了优美的框架,使android程序网络访问更容易.更快. Volley抽象实现了底层的HTTP Client库,我们不需关注HTTP Client细节,专注于写出更加漂亮.干净的RES ...

  7. Volley源码学习笔记

    标签(空格分隔): Volley 创建RequestQueue 使用Volley的时候,我们首先需要创建一个RequestQueue对象,用于添加各种请求,创建的方法是Volley.newReques ...

  8. Volley解析之表单提交篇

    要实现表单的提交,就要知道表单提交的数据格式是怎么样,这里我从某知名网站抓了一条数据,先来分析别人提交表单的数据格式.  数据包: Connection: keep-alive Content-Len ...

  9. Xutils, OKhttp, Volley, Retrofit对比

    Xutils这个框架非常全面,可以进行网络请求,可以进行图片加载处理,可以数据储存,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显的,使用这个项目,会导致项目对这个框架依赖非常的 ...

随机推荐

  1. uva 11673 Garbage Remembering Exam (概率)

    题目链接: http://vjudge.net/problem/viewProblem.action?id=42000 该过程为随即过程,因此总期望值等于个单词对应的期望值,即它们wasted的概率 ...

  2. phpcms首页商机的调用,多种方式

    <hr /> {pc:get sql="select * from phpcms_yp_buy" order="updatetime DESC"} ...

  3. Razor引擎的转换数据类型

    AsInt() 把字符串转换为整数. if (myString.IsInt()) IsInt() {myInt=myString.AsInt();} AsFloat() 把字符串转换为浮点数. if ...

  4. [Python笔记]第四篇:内置函数

    本篇主要内容:内置函数 函数 参考:https://docs.python.org/3.5/library/functions.html 内置函数列表 一.数学运算类 abs(x)求绝对值 >& ...

  5. Seajs教程

    API 快速参考 该页面列举了 Sea.js 的常用 API.只要掌握这些用法,就可以娴熟地进行模块化开发. seajs.config 用来对 Sea.js 进行配置. seajs.config({ ...

  6. Quartz2D使用

    使用Quartz2D前  先导入QuartzCore.framework //划线 //1.获取图形上下文 CGContextRef ctx=UIGraphicsGetCurrentContext() ...

  7. .NET MVC执行过程

    1.网址路由比对 2.执行Controller与Action 3.执行View并返回结果 在使用MVC中是由IgnoreRoute()辅助方法对比成功的,会导致程序直接跳离MVC的执行生命周期,将程序 ...

  8. h.264参考图像列表、解码图像缓存

    1.参考图像列表(reference picture list) 一般来说,h.264会把需要编码的图像分为三种类型:I.P.B,其中的B.P类型的图像由于采用了帧间编码的这种编码方式,而帧间编码又是 ...

  9. Android入门之时间日期控件

    效果图: MainActivity.java package com.jkxqj.helloandroid; import android.app.Activity; import android.o ...

  10. Binary Tree Level Order Traversal II——LeetCode

    Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left ...