android app中少不了要用到网络请求。网上已经有很多优秀的网络请求框架,谷歌推荐的okhttp、齐射并发的volley 、异步请求的asynchttp。
但是我要说的并不是重新设计网络请求框架,而是基于所有优秀网络请求框架进行的二次封装,成为一个为自己项目所用的网络请求。
不要问为什么这么做,只要你使用到了网络请求,不管有没有用第三方请求框架都必须为它(网络请求流程处理)再次设计一个简单易用的框架,我们把这个过程叫做网络请求的二次封装。
先来看看一个网络请求的流程:
1,get,post请求数据
请求数据需要url,如果是post请求还需要一个map集合在存储请求参数;
那么就可以把请求数据看作:
String url="http://192.168.1.1:8080/websservice/index/selectindex.action?";
Map<String,Object> parameters=new HashMap();
parameters.put("userinfo.name","admin");
parameters.put("userinfo.password","admins1");
这么一个数据结构。
2,发出请求
private void sendPostRequest(String url, Map<String, Object> params) {
//首先判断是否有网络
if (!NetWorkUtil.isNetworkConnected(mContext)) return;
HttpClient.post(Context, url, params, new HttpBack() {
@Override
public void onSuccess(int statusCode, byte[] responseBody) {
try {
String jsonSuccess = new String(responseBody, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(int statusCode, byte[] responseBody, Message error) {
try {
String jsonFinal = new String(responseBody, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
}
});
这段代码只是模拟一个post网络请求,并且经过一系列的处理返回成功或者失败到相应的接口。
3,处理结果
拿到结果后 我们一般会根据服务器返回的固定字段来解析json数据:
//状态码
String TAG_STATUS_CODE = "statusCode";
//请求失败后的失败内容
String TAG_MESSAGE = "message";
//json对象
String TAG_OBJECT = "object";
//json集合
String TAG_OBJECTS = "objects";
通过和服务器返回数据相匹配来解析json并保存到相应的实体类中。
4,显示结果
当我们拿到处理后的结果后要发送给相应的页面用于显示。这时候的处理就“八仙过海各显神通”了。不过最常见的就是通过观察者模式,让结果进入发送者内,然后给所有观察者发送网络请求的处理结果。
这就是一个网络请求的大致流程。其中具体的网络请求网上就有很多优秀的处理框架了。我们也没有必要再去自己写,况且自己写的不一定完美。
所以,我们要做的就是既要用别人的框架也要将别人的框架和自己app的耦合性降到最低。
那么我们应该从什么地方入手呢?
先看一张图:
这就是大概的一个接口对接的示意图。
而我们要做的部分就是将红色框,即app内部请求和解析进行二次封装。
—————————————————分割线———————————————–
那么我要说的就是为网络请求流程处理设计的框架。
先来看一张我要讲的网络请求二次封装的框架结构示意图:
得到处理过的结果的ResponseResult类(也就是图中的ResponseSuccess等类)可以使用观察者模式向所有的观察者发出请求返回结果。
接下来我们就一步一步的实现这个二次封装的框架。等到成品出来后,各位看客就能感受到它的简单和易用是多么的强大。
1,准备工作
/**
* 请求的url
*/
public class RequestUrls {
public static final String IP = "http://192.168.1.1:8080/";//url
public static final String ROOT_URL = IP + "HttpService/";//项目名
/**
* 获取首页数据的URL
*/
public static final String GET_INDEX_CONTENT_URL = ROOT_URL + "index/selectIndexContent.action";
}
/**
* 服务器返回状态吗
*/
public class StatusCode {
/**
* 状态码:请求成功
*/
public static final int REQUEST_SUCCESS = 200;
/**
* 状态码:没有更多数据
*/
public static final int NOT_MORE_DATA = 201;
/**
* 状态码:服务器繁忙
*/
public static final int SERVER_BUSY = 300;
/**
* 状态码:未知错误
*/
public static final int SERVER_ERROR =