Android:网络层的封装(使用OkHttp)

本文介绍如何在Android应用中使用OkHttp进行网络层的封装,以简化调用并支持HTTPS请求。通过创建AccountAPI接口类、BaseAPI抽象类、Connector封装类以及自定义的SslSocketFactory来管理HTTPS证书,实现安全且便捷的网络通信。
摘要由CSDN通过智能技术生成

说明:

网络框架使用了OkHttp,对OkHttp进行了适当的封装,调用更方便,支持HTTPS请求。


使用:

1.AccountAPI类,实现API使用类,在此写具体的网络接口方法,需要继承BaseAPI类:

public class AccountAPI extends BaseAPI {
    private final String URL_LOGIN = Contants.BASE_URL + "/";

    public <T> AccountAPI(Context context, APICallback<T> callback) {
        super(context, callback);
    }

    /**
     * 登录
     */
    public void login(int apiId, String username, String pwd) {
        requestData(apiId, URL_LOGIN, genLoginBody(username, pwd));
    }

    private byte[] genLoginBody(String username, String pwd) {
        //生成body数据,并加密
        return encrypt(null);
    }

    @Override
    protected <T> T parseData(ResponseInfo info) throws Exception {
        switch (info.apiId) {
            case Contants.API_ID_LOGIN:
                parseLoginInfo(info.data);
        }
        return null;
    }

    private void parseLoginInfo(byte[] data) {
        if (data != null) {
            //解析登录后的数据并保存
        }
    }

}


2.BaseAPI类,对一些逻辑进行了抽取封装,方便子类直接使用请求方法:

public abstract class BaseAPI implements Connector.RequestCallback {
    protected final int FAILURE = -1;
    protected final int SUCCESS = 0;
    protected APICallback callback;
    protected Connector connector;
    protected Context context;

    public BaseAPI(Context context, APICallback callback) {
        this.callback = callback;
        this.context = context.getApplicationContext();
        connector = Connector.getConnector(this.context);
    }

    /**
     * get方式,子类直接调用此方法请求服务器数据
     *
     * @param apiId 接口编号
     * @param url   接口url
     */
    protected final void requestData(int apiId, String url) {
        connector.doGet(apiId, url, getHeaders(), this);
    }

    /**
     * post方式,子类直接调用此方法请求服务器数据
     *
     * @param apiId 接口编号
     * @param url   接口url
     * @param body  数据
     */
    protected final void requestData(int apiId, String url, byte[] body) {
        connector.doPost(apiId, url, getHeaders(), Connector.BODY_TYPE_DEFAULT, body, this);
    }

    /**
     * 子类直接调用此方法上传文件
     *
     * @param url  接口url
     * @param file 需上传的文件File对象
     */
    protected final void uploadFile(int apiId, String url, File file) {
        connector.doPostFile(apiId, url, getHeaders(), file, this);
    }

    private HashMap<String, String> getHeaders() {
        HashMap<String, String> headers = new HashMap<>();
        String sessionToken = SharedPrefUtil.getState(context, String.class, Contants.SESSION_TOKEN);
        if (!TextUtils.isEmpty(sessionToken)) {
            headers.put("SessionToken", sessionToken);
        }
        headers.put("ChannelId", "1");
        String appVersion = CommonUtil.getVersionName(context);
        if (!TextUtils.isEmpty(appVersion)) {
            headers.put("AppVersion", appVersion);
        }
        headers.put("Platform", "8");

        String pushToken = SharedPrefUtil.getState(context, String.class, "device_token");
        if (!TextUtils.isEmpty(pushToken)) {
            headers.put("DeviceToken", pushToken);
        }
        return headers;
    }

    /**
     * 子类重写此方法,解析服务器返回的数据: info.data
     *
     * @param info 返回的信息
     * @return
     * @throws Exception
     */
    protected abstract <T> T parseData(ResponseInfo info) throws Exception;

    /**
     * 取消请求
     */
    public final void cancelRequest() {
        connector.cancel(this.getClass().getSimpleName());
    }

    @Override
    public final void onResponse(ResponseInfo resp) {
        boolean isEncrypt = resp.isEncrypt;
        if (callback
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值