说明:
网络框架使用了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