AsyncHttpClient的数据请求使用的封装
来源:互联网 发布:mac免费软件 编辑:程序博客网 时间:2024/05/29 12:41
近期干了一件非常蛋疼的事情,就是在整个项目的数据请求中添加参数,实现起来倒是简单,但是项目中的涉及到的网络请求没有封装,导致要改的话就要所有的网络请求以及接口都是要改动的,真心是无语。没办法,当时刚接手这个项目的时候就想过要封装一个网络请求的框架,但是又觉得工作量太大,而且自己擅自改动后还要再走测试流程也就想想就放弃了。没想到到今天还是要动工,哎没办法只能加班加点。
先给大家展现下原来的接口请求是什么样的:
http://192.168.2.157:9090/getAdConfigureList?body={"params":{"terminalCode":"868403025191716|1|6.0|20170605154050","merchantId":"1","version":"25"}}这是项目中的原来的接口,现在的需求是这样的:
http://192.168.2.157:9090/getAdConfigureList? monitor={"userId":"8765009300000000065","token":"1545471319684"} &body={"params":{"terminalCode":"868403025191716|1|6.0|20170605154050","merchantId":"1","version":"25"}}
我们项目额请求都是用的post,仔细分析下就会看见现在的需求的请求参数就是在原来的基础上相当于又加上一个body,那应该怎么实现呢?
其实很简单:
private void postGetPaymentChannel() {String str = BaseActivity.urlString + "getPaymentChannel";Map<String, Object> mapStart = new HashMap<String, Object>();mapStart.put("token", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_TOKEN) + "");mapStart.put("userId", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_USER_ID)+ ""); JSONObject mapStartJson = new JSONObject(mapStart);RequestParams params = new RequestParams();params.put("body", mapStartJson.toString());AsyncHttpClient asyncHttpClient = new AsyncHttpClient();asyncHttpClient.post(str, params, new AsyncHttpResponseHandler() {@Overridepublic void onFailure(Throwable error, String content) {super.onFailure(error, content);} @Override public void onStart() { super.onStart(); }@Overridepublic void onSuccess(String content) {}});}原来的方法里面只放了body,那么现在要求放入monitor,可以这样做:
private void postGetPaymentChannel() {String str = BaseActivity.urlString + "getPaymentChannel";Map<String, Object> mapStart = new HashMap<String, Object>();mapStart.put("token", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_TOKEN) + "");mapStart.put("userId", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_USER_ID)+ ""); JSONObject mapStartJson = new JSONObject(mapStart);RequestParams params = new RequestParams();params.put("body", mapStartJson.toString()); Map<String, Object> mapEnd = new HashMap<String, Object>();mapEnd.put("token", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_TOKEN) + "");mapEnd.put("userId", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_USER_ID)+ "");JSONObject jsonlAST = new JSONObject(mapEnd);params.put("monitor", jsonlAST.toString());AsyncHttpClient asyncHttpClient = new AsyncHttpClient();asyncHttpClient.post(str, params, new AsyncHttpResponseHandler() {@Overridepublic void onFailure(Throwable error, String content) {super.onFailure(error, content);} @Override public void onStart() { super.onStart(); }@Overridepublic void onSuccess(String content) {}});}其实值改一个接口的话这样做确实是很简单的,但是项目中这么多的接口都要修改怎么办呢?
这一次没办法,只能一个个找到一个个改,单这一次必须吸取教训,抽出来,然后下次需要加参数的时候就可以只动一个地方就ok了,怎么抽呢?
public class HttpClientPostUtils {private static String TAG = "postData";/** * * @param mapHead * body里面的参数 * @param mapEnd * 后面追加的一个body * @param tag * 打印日志用的标志 * @param headUrl * 请求的地址头 * @param internetResultListener * 请求的接口回调 */public static void postForDatas(Map<String, Object> mapHead, String tag, String headUrl,final InternetResultListener internetResultListener) {String urlStr = BaseActivity.urlString + headUrl;RequestParams params = new RequestParams();Map<String, Object> paramsMap = new HashMap<String, Object>();paramsMap.put("params", mapHead);JSONObject json = new JSONObject(paramsMap);params.put("body", json.toString()); Map<String, Object> mapEnd = new HashMap<String, Object>();mapEnd.put("token", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_TOKEN) + "");mapEnd.put("userId", BaseActivity.baseParams().get(BaseActivity.PRE_KEY_USER_ID) + "");JSONObject jsonlAST = new JSONObject(mapEnd);params.put("monitor", jsonlAST.toString());Logger.i(TAG, tag + urlStr + "?" + params.toString());AsyncHttpClient asyncHttpClient = new AsyncHttpClient();asyncHttpClient.post(urlStr, params, new AsyncHttpResponseHandler() {@Overridepublic void onStart() {super.onStart();internetResultListener.onPostStart();}@Overridepublic void onSuccess(int statusCode, String content) {super.onSuccess(statusCode, content);if (200 == statusCode) {internetResultListener.onPostSuccess(statusCode, content);} else {Throwable error = new Throwable("失败了");internetResultListener.onPostFailure(error, "状态码 = " + statusCode + "content = " + content);}}@Overridepublic void onFailure(Throwable error, String content) {super.onFailure(error, content);internetResultListener.onPostFailure(error, content);}});}}
封装以后只需要传入map集合以及请求地址和回调的listener即可。
其中回调的listener:
public interface InternetResultListener { void onPostStart(); void onPostFailure(Throwable error, String content); void onPostSuccess(int statusCode, String content);}
那么现在想要进行网络请求的时候只需要调用这个方法就行:
public void Check_login_Post(String userId, String token, final int type) {Map<String, Object> map = new HashMap<String, Object>();map.put("userId", userId);map.put("token", token);String headUrl = "seachToken"; HttpClientPostUtils.postForDatas(map, "检查是被登录接口", headUrl, new InternetResultListener() {@Overridepublic void onPostSuccess(int statusCode, String content) { //成功的回调}@Overridepublic void onPostStart() {//开始的回调}@Overridepublic void onPostFailure(Throwable error, String content) {//失败的回调}});}
而且封装的接口请求有统一的日志打印,看起来也很整洁不会很凌乱,只要进行日志过滤就会知道哪一步进行了那些接口的请求。当然如果项目之前就这样封装的话,我今天的工作量就小多了,但是没办法,只能一个个去改了,已经做好加班的准备了!
阅读全文
0 0
- AsyncHttpClient的数据请求使用的封装
- Asynchttpclient的使用及请求与响应封装
- 使用AsyncHttpClient框架来完成网络数据的请求
- 网络请求框架AsyncHttpclient的简单使用
- Android网络请求---AsyncHttpClient的使用
- 使用开源框架AsyncHttpClient进行Json的Post请求
- AsyncHttpClient异步请求工具箱/简单使用(异步的同步支持)
- AsyncHttpClient的使用
- 关于AsyncHttpClient的使用
- HttpClient请求数据的封装
- 请求数据的封装类
- Android网络框架AsyncHttpClient的二次封装
- android网络框架asyncHttpClient 的二次封装
- Android网络请求的第三库AsyncHttpclient
- 异步的AsyncHttpClient使用详解
- AsyncHttpClient的介绍和使用
- AsyncHttpClient请求网络数据小节!
- struts1自动封装用户的请求数据
- EChart 3.0 设置Y轴反转
- react生命周期概括
- sudo和su命令简介
- centos上的多路车牌、人脸识别
- 基于DotNetBar的UI布局
- AsyncHttpClient的数据请求使用的封装
- 数位DP入门 BZOJ 1833 题解(需要复习)
- RSA算法原理(一)
- 如何在UE4 C++中进行按键绑定
- USACO section 1.3 Combination Lock
- mysql与jsp时间不对应
- shell脚本的简单学习
- 线段树相关
- Android Studio Error:null value in entry: outputDirectory=null编译报错问题