由于2.0的需求还没确定,最近的主要工作就是对程序优化和重构;今天想对网络层重构工作的一些想法记录下来,以便以后查看;
最初的网络层采用的是开源框架ASIHttpRequest,后来改用了AFNetworking,基于AFNetworking自己简单的封装了一下,这里只有简单的http请求,代码如下:
然而初看起来,如果事先跟服务端有统一规范也没什么,比如图中红色部分里面的retcode,服务端如果有多人开发,而且他们没有规范好返回值是什么时才正常,什么值时不正常,有人以0为正常,有人以1为正常,好,如果是这样,没问题,因为我可以用retcode>=0来判断是否正常,但是如果异常呢?有人以小于0为异常,有的以大于0为异常,该怎么办?说了这么多,估计都讲懵了,好吧,我以我们项目来说。A:retcode==0时为正常,retcode>0为异常;B:retcode==1时为正常,retcode<0为异常,好,这时如果有个接口返回retcode==1,对A来说这是正常的,对B来说这是异常,这时怎么判断?遇到这种情况最简单的办法,两者分开呗,再封装一个接口,专门针对这种情况,是不是好笑?你可以叫后台统一啊,但事实上谁都不肯让步,只能让我来让步呗,我再加一个接口呗,把调用AB的接口各用一套,其实里面只有很少的变化,就是红色框的那一部分有点变化,真是操蛋!
然而细看起来,这么封装,在遇到稍微复杂的情况下,就显得非常脆弱。然而还不止是刚提到的问题,还有传输数据的时候,服务端A要求你只传一个值json_data,就是要传的参数先把它转成json字符串,很多人是这样做的,但也有要求你分开传,这种情况,这么封装的话又要改了,还有涉及到编码的事,有的要求只urlEncode一次,有的要求两次,更多的情况就不一一举了,反正这么弄会有很大的局限性。
那么怎么封装会好呢,我参考了唐巧的猿题库网络开源库,把我不要用到的东西给删了,又根据自己的业务做了一些修改,因为后续AFNetworking版本不再更新AFHTTPRequestOperation的版本了,故将用AFHTTPRequestOperation实现的方式换成了用AFHTTPSessionManager实现;代码就不贴出来了;
简单思路就是将每个网络接口以一个单独的类去实现,基类提供一些基本的接口,具体的接口类根据自己的业务需求可覆盖基类的方法,如(检查retcode正常异常,编码类型,传参方式,是否urlCoode,参数序列化类型,返回值序列化类型等),这样业务需求改动,改起来也比较方便;
在重构的过程中,也遇到过一些问题,比如一些编码的问题,还有网络上经常有些人问为什么从ASI切换到AFNetworking时传输中文时不正常了或者服务端收不到数据呢?大家首先要有解决问题的思路,该怎么解决?我来简单说一下,服务端收不到数据,是什么原因,照这样说应该不是网络的问题,你可以用抓包工具看看你到底发了什么东西出去了,推荐一个工具(Charles),这个工具还挺好用的,如果有东西发出去了,说明就是服务端那边的问题了;服务端接收的东西有乱码?乱码的情况一般是在传中文的情况下出现的,这个时候你就要弄清楚服务端那边是怎么解码的,我的项目这边,服务端那边要求客户端两次urlEncode,而我只是做了一次,这个时候对要传的参数再urlEncode一次不就解决了;为什么呢?AFNetworking对参数只做了一次urlEncode,而ASI作了两次;那为什么纯英文不会呢?因为英文urlEncode后还是一致的。