@wuseal
2019-03-21T05:07:42.000000Z
字数 5649
阅读 636
工具 叮咚
先修改TpClient类,添加一个执行API请求的入口方法,如下
public final void doApiRequest(RequestCmd requestCmd) {CommonRestCallManager.commonRestCall(CommonRestCallType.RequestType, requestCmd);}
修改CommonRestCallType类添加一个请求API的类型整型常量,且注意不能与之前已经有类型的值重复
public static final int RequestType = 3205;
想像下,如果常量类型已经有很多,且值的定义并没有明确的规定和范围限定,那么定义这个类型值冲突的可能性还是有的,而且每次都得过滤下之前定义过的类型,保证唯一才行,费心有费心
定义并实现RequestCmd类,其实这个类型的定义是请求参数的代表类,但是在这里,每一个API请求都得定义一个这样的类
public class RequestCmd extends DTRestCallBase {private String paramKey1 = "key1";private String paramKey2 = "key2";private String paramValue1 = "value1";private String paramValue2 = "value2";public String getParamKey1() {return paramKey1;}public void setParamKey1(String paramKey1) {this.paramKey1 = paramKey1;}public String getParamKey2() {return paramKey2;}public void setParamKey2(String paramKey2) {this.paramKey2 = paramKey2;}public String getParamValue1() {return paramValue1;}public void setParamValue1(String paramValue1) {this.paramValue1 = paramValue1;}public String getParamValue2() {return paramValue2;}public void setParamValue2(String paramValue2) {this.paramValue2 = paramValue2;}}
修改RestCallEncoderFactory类,并在如下方法体里进行修改
public static RestCallEncoder createRestCallEncoder(int commonRestCallType, DTRestCallBase restCallBase) {switch (commonRestCallType) {case CommonRestCallType.CREATE_GIAP_ORDER:return new CreateGIAPOrderEncoder(restCallBase);case CommonRestCallType.GET_INVITE_LINK:return new GetInviteLinkEncoder(restCallBase);...
在switch case条件判断里添加如下代码
case CommonRestCallType.RequestType:return new RequestCmdEncode(restCallBase);
定义并实现RequestCmdEncode类
class RequestCmdEncode extends RestCallEncoder {private RequestCmd requestCmd;public RequestCmdEncode(DTRestCallBase restCallCmd) {super(restCallCmd);requestCmd = (RequestCmd) restCallCmd;}@Overridepublic DTCommonRestCallCmd encode() {DTCommonRestCallCmd cmd = super.encode();cmd.setCommandTag(CommonRestCallType.RequestType);cmd.setApiName("/router/path");StringBuffer sb = new StringBuffer();sb.append("&");sb.append(requestCmd.getParamKey1());sb.append("=");sb.append(requestCmd.getParamValue1());sb.append("&");sb.append(requestCmd.getParamKey2());sb.append("=");sb.append(requestCmd.getParamValue2());cmd.setApiParams(sb.toString());return cmd;}}
修改RestCallDecoderFactory类,并在createRestCallDecoder方法体的switch case条件判断里再增加如下代码:
...case CommonRestCallType.RequestType:return new RequestCmdDecoder(commonRestCallBase.responseData, commonRestCallBase.getCommandCookie());...
定义并实现RequestCmdDecoder类型
class RequestCmdDecoder extends RestCallDecoder {public RequestCmdDecoder(String responseData, int commandCookie) {super(responseData, commandCookie);mRestCallResponse=new RequestResponse();}@Overrideprotected void decodeResponseData(JSONObject jsonObj) {try {if (mRestCallResponse.getErrCode() == 0) {mRestCallResponse.setResult(jsonObj.getInt("Result"));((RequestResponse)mRestCallResponse).data1=jsonObj.optString("data1");((RequestResponse)mRestCallResponse).data2=jsonObj.optInt("data2");((RequestResponse)mRestCallResponse).data3=jsonObj.optString("data3");} else {mRestCallResponse.setResult(jsonObj.optInt("Result"));mRestCallResponse.setErrorCode(jsonObj.optInt("ErrCode"));mRestCallResponse.setReason(jsonObj.optString("Reason"));}} catch (JSONException e) {e.printStackTrace();}}@Overridepublic void onRestCallResponse() {TpClient.getInstance().onRequestDemoResponse((RequestResponse)mRestCallResponse);}}
定义并实现RequestResponse类型
class RequestResponse extends me.dingtone.app.im.datatype.DTRestCallBase {public String data1;public int data2;public String data3;}
再次修改TpClient类,添加onRequestDemoResponse方法
public void onRequestDemoResponse(RequestResponse mRestCallResponse) {mTpEventHandler.onRequestDemoResponse(response);}
修改TpEventHandler类,并添加onRequestDemoResponse方法
public void onRequestDemoResponse(RequestResponse mRestCallResponse) {ServiceMgr.getInstance().handleResponse(DTRESTCALL_TYPE.DTRESTCALL_TYPE_DEMO_REQUEST, mRestCallResponse);}
修改DTRESTCALL_TYPE类并添加DTRESTCALL_TYPE_DEMO_REQUEST常量类,并保证其值为唯一性
public final static int DTRESTCALL_TYPE_WALLET_POINT_ADD = 0x1520;public static final int DTRESTCALL_TYPE_DEMO_REQUEST = 0x1521;
好了,十一步完成,我们现在可以开始正式去使用这个接口请求返回数据的功能了
在要使用API请求的在地方,调用之前声明的调用API请求执行的触发方法,一般在Activity里的onCreate()方法里里执行如下代码
RequestCmd cmd = new RequestCmd();cmd.setParamKey1("key1");cmd.setParamKey2("key2");cmd.setParamValue1("value1");cmd.setParamValue2("value2");TpClient.getInstance().doApiRequest(cmd);
请求了API,总要的回调的地方吧,在要使用API请求的在地方,比如在Activity内去请求一个接口的数据,那需要在Activity内去注册一下当前的请求响应回调的实例。
UIMgr.getInstance().registerActivityEvent(DTRESTCALL_TYPE.DTRESTCALL_TYPE_DEMO_REQUEST, this);
让当前的Activity实现me.dingtone.app.im.manager.Event接口,记住,实现的接口只有handleEvent可用,另一个接口方法handleRefreshUI暂时没有用。handleEvent方法就是表示后台API接口请求完成后会回调的方法。
@Overridepublic void handleEvent(int evtType, Object obj) {if (evtType == DTRESTCALL_TYPE.DTRESTCALL_TYPE_DEMO_REQUEST) {RequestResponse response = (RequestResponse) obj;//r接下来就可以使用API返回的数据进行界面的渲染等工作了String data1 = response.data1;}...
好了,现有的RestCall请求就是这样添加一个新的接口的使用的,我的一句感受,WTF,这能忍受?Oh, I can't!
接下来,看看改造后的样子。
改造后的请求方式非常简单,只需要使用一个工具类即可:DtHttpUtil, 新功能在dev_4_6_0分支后可用
public void testDtHttpUtil() {DtRequestParams params = new DtRequestParams();params.add("key1", "value1");params.add("key2", "value2");DtHttpUtil.INSTANCE.edgeRequest("/router/path1", params, new DtRequestCallBack<DtBaseModel<MyData>>() {@Overridepublic void onRequestSuccessful(DtBaseModel<MyData> response) {MyData myData = response.getData();//接下来去使用数据进行界面的渲染等工作了String data1 = myData.data1;}});}
用到的类都是现有的,除了要返回的MyData这个数据类,需要自己定义实现
定义实现如下:
class MyData {public String data1;public String data2;public String data3;}
DtBaseModel<MyData>类型的数据序列化JSON后是对应的是服务端接口返回的JSON整体数据,大致如下:
{"ErrCode":0,"Reason":"","Result":1,"data":{"data1":"111","data2":"111","data3":"111"}}
如有疑问请@seal.wu@dingtone.me