封装http请求返回统一json格式数据的网络操作

来源:互联网 发布:25端口是什么 编辑:程序博客网 时间:2024/05/16 16:38

在开发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);    }}
0 0