在开发android app时候,总会需要封装一些网络操作。
比如:如果服务器返回的是一个json格式数据,格式满足:{“ErrorCode”:XX, “ErrorMessage”:XXX,”Data”:XXXX}。其中XX是int类型数据,XXX是string类型数据,XXXX是一个满足json格式的字符串。
对于这样的需求,按照下面的思路来封装http请求是个不错的思路。
首先定义一个请求结果的封装类。
public class HttpResponse<T> {
public static final int RESPONSE_UNDEFINED = -1;
public static final int RESPONSE_OK = 0;
public int mErrorCode;
public String mErrorMessage;
public T mData;
public HttpResponse() {
mErrorCode = RESPONSE_UNDEFINED;
mErrorMessage = null;
mData = null;
}
public HttpResponse(int errorCode, Exception exception, String errorMessage) {
mErrorCode = errorCode;
mErrorMessage = errorMessage;
mData = null;
}
public HttpResponse(T data) {
mErrorCode = RESPONSE_OK;
mErrorMessage = null;
mData = data;
}
public boolean isSuccess() {
return RESPONSE_OK == mErrorCode;
}
}
然后定义处理http返回的json格式数据。
public class HttpJsonParser {
public static <T> HttpResponse<T> httpGetV1(final String url,
final List<NameValuePair> params, final JSONParser<T> parser) {
HttpRequest request = new HttpRequest() {
@Override
public String request() throws IOException {
// 具体的Get网络操作
return HttpHelper.doGet(context, url, params);
}
};
return httpRequest(request, parser);
}
public static <T> HttpResponse<T> httpPostV1(final String url,
final List<NameValuePair> params, final JSONParser<T> parser) {
HttpRequest request = new HttpRequest() {
@Override
public String request() throws IOException {
// 具体的Post网络操作
return HttpHelper.doPost(context, url, params);
}
};
return httpRequest(request, parser);
}
private static <T> HttpResponse<T> httpRequest(HttpRequest request,
JSONParser<T> parser) {
HttpResponse<T> response = new HttpResponse<T>();
try {
String result = request.request();
parseResult(result, response, parser);
} catch (IOException e) {
MyLog.e(e);
response.mErrorCode = -1;
} catch (JSONException e) {
MyLog.e(e);
// json 错误一般是解析出错了,标记成错误
response.mErrorCode = -2;
} catch (NullPointerException e) {
MyLog.e(e);
response.mErrorCode = -3;
}
return response;
}
public static <T> void parseResult(String result, HttpResponse<T> response, JSONParser<T> parser) throws JSONException {
if (!TextUtils.isEmpty(result)) {
JSONObject json = new JSONObject(result);
response.mErrorCode = json.getInt("ErrorCode");
response.mErrorMessage = json.optString("ErrorMessage");
if (!TextUtils.isEmpty(json.optString("Data")) && parser != null) {
response.mData = parser.parse(json.optString("Data"));
}
if (!response.isSuccess()) {
MyLog.v("Http request fail. " + result);
}
}
}
public static interface HttpRequest {
public String request() throws IOException;
}
public static interface JSONParser<T> {
/**
* @param response
* 此部分是api中需要解析的部分。
* @return
*/
public T parse(String response) throws JSONException;
}
}
最后定义跟业务相关的的http接口。
public class HttpApi {
public static HttpResponse<Object> http1() {
List<NameValuePair> params = new ArrayList<NameValuePair>();
// 添加相应的request param到list中
//.....
return HttpJsonParser.httpPostV1("http url1", params, null);
}
public static HttpResponse<String> http2() {
List<NameValuePair> params = new ArrayList<NameValuePair>();
// 添加相应的request param到list中
//.....
HttpJsonParser.JSONParser<String> parser = new HttpJsonParser.JSONParser<String>() {
@Override
public String parse(String response) throws JSONException {
// 解析Data对应的json数据
return null;
}
};
return HttpJsonParser.httpGetV1("http url2", params, parser);
}
public static HttpResponse<ArrayList<String>> http3() {
List<NameValuePair> params = new ArrayList<NameValuePair>();
// 添加相应的request param到list中
//.....
HttpJsonParser.JSONParser<ArrayList<String>> parser = new HttpJsonParser.JSONParser<ArrayList<String>>() {
@Override
public ArrayList<String> parse(String response) throws JSONException {
// 解析Data对应的json数据
return null;
}
};
return HttpJsonParser.httpGetV1("http url3", params, parser);
}
}