教你写Http框架(一)

大家都知道,从本质上来说app实际只是整个大系统当中的View层,因为设计优秀的系统中,app基本都不会承担任何实际的业务逻辑处理,只是负责向用户展示数据以及从用户端搜集用户数据。而这个数据的一来一去,自然离不开网络通信协议,而我们用得最多的,自然是这个http协议。目前优秀的第三方http框架有很多,例如volley,okHttp等,但是从我目前给一些开发者面试的结果来看,很多安卓开发者对http协议几乎一无所知,更不要说去深入理解一个http框架是如何构建的,虽然你会觉得这并不影响你完成你的工作,但如果你是一个有追求真正对技术感兴趣的开发者,只做api的搬运工我相信不是你的理想。所以自己花了将近一个月的业余时间,去深入学习http协议的一些核心内容,并设计编写这样一个底层框架,因为框架内容较多,这里大致会分成两到三篇来完成,希望对各位有所帮助。

今天第一篇我们先不写代码,先来分析一下http框架,大概要完成哪些工作。
一、我看过不少公司的代码,http协议的url信息都是在代码里写死的,这样做有什么坏处我想也不必赘述了。所以我们的第一个目标,就是实现url的动态配置,让url的修改完全和代码无关,一个配置文件就全部搞定。
二、根据配置文件自动处理get和post参数的添加以及加密。这个是每个框架必定要实现的功能。很多面试者连get和post的区别都不知道的原因也基于此,因为框架把这个细节进行了封装,让调用者只关注拼装参数而无需在意参数是如何发送到服务器的。
三、可自行配置httpHeader。很多公司都需要在http头中加入自己的字段并修改一些内容,所以框架必须有httpheader的修改能力。
四、缓存和缓存时间处理。为了提升用户体验,很多场景下并不是每次都需要重新请求服务器获取数据的,我们可以把上一次缓存的数据拿出来直接展示给用户,当缓存过期之后才重新请求服务器。所以我们的框架中要集成一个缓存能力,并且可以对配置的缓存时间进行处理。这里我们选择的缓存方案就是把服务器返回的response字符串进行缓存。
五、线程池和安卓端异步请求的处理。手机资源有限众所周知,如果任由客户端随意新建线程执行http请求,最极端情况就是一堆线程由于阻塞耗尽系统资源,所以必须通过线程池来管理所有的http请求。另外一个问题就是安卓是不允许UI线程直接进行http请求这类耗时操作的,所以框架中要把这件事也完成,让这件事对调用者也直接透明,省的handler弄得到处都是。
六、response的动态解析。通过配置文件,我们可以把response需要解析成的实体类直接配置在文件中,在调用者拿到的时候直接就是想要的class。同时通过何种方式解析也可以配置,xml,String,JSON,只要用户配置了,框架可以自动获得解析器并进行解析,向上层返回实体类。
七、请求可以发出,也必然可以取消,在用户主动退出程序或者某个Activity时框架必须提供请求取消的能力,否则将导致内存溢出或请求返回时的程序崩溃。
八、Cookie和Session的处理,cookie和session在框架中如何处理,一般要根据实际的业务需求来确定,这次就不在我们框架的重点之中,但是其原理,大家还是应该深入了解的。
九、Mock能力,也就是桩。很多客户端开发者都会有过这种经历,自己写代码都驾轻就熟,但是一碰到联调就肝颤,经常加班的原因是白天服务器都在开发,客户端到了晚上才有接口可以联调。这样搞就太不专业了,所以客户端自己要有mock能力,无非是假数据而已,所以框架中要提供接口,让我们可以自己配置假数据包括超时来确认各种场景下客户端的数据展示是否正确,这样联调的时候,我们早就把各种场景都测试OK,剩下的,无非是确认服务器的返回数据是否正确而已,效率高高,拒绝加班。
十、框架对外的接口,提供配置能力,所有框架都必须要有的东西。

囧rz,其实我之前也没想到居然总结出这么多玩意儿来,不过基本就这些整出来的话,这个框架已经很完善了,好,下一篇开始把这些需求一个一个用代码来完成。

简介: 本框架是在Netroid的基础之上进行了封装,节省了其中配置的过程和一些不必要的操作 主要进行文本请求和图片请求,图片请求都进行了缓存(内存缓存和sd卡缓存)的封装,sd卡缓存时间可自行更改. 文本请求可传入解析的泛型clazz,即可返回解析后的clazz对象进行数据 操作,如果不需要进行数据解析,可通过另一种方式获取原生的string; 单图请求,单图请求可执行对本地asset文件夹,sd卡,http三种请求模式.只需传入相应的路径即可; 多图请求,多图请求主要是针对listview这种图文混排模式而生,能快速加载图片并实现缓存,不需要考虑 图片错位问题.只需传入相应的url即可完成全部功能. 使用说明: 1:在新创建的Manifest.xml中application中申明: <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:name="com.aqs.application.UApplication" > 并初始化Const.init();此处的初始化主要是对内存缓存,SD卡缓存大小,缓存时间等进行设置,如果不初始化,则按使用默认配置; 2:依赖HttpAqs-library或者jar包 3:通过公有方法进行网络请求,示例如下: >文本请求: >解析后的文本请求: HttpRequest.reqquest(int,String,Parse,Class){....}; >原生string文本请求: HttpRequest.getString(String,AqsString){...} >单张图片请求: HttpRequest.setImage(ImageView,String,int,int){...} >多张图片请求: 可使用AQSImageView控件来加载图片;特别是针对listview图文混排 实现方法: >在布局中添加 >在代码中 av.setImageUrl(url);
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值