赞
踩
网络请求学习目标:
在项目中创建一个sdk的module,然后
开发步骤:
一、利用okhttp提供的api去发送最基本的请求
创建一个OkHttpClient,创建一个Request,通过OkHttpClient将request发送出去,然后在onFailure()和onResponse()回调中进行处理。这样就可以通过OkHttp发送一个最简单的网络请求了。但是在实际开发中,是不会这样使用的。首先,只发送一个请求,就创建了这么多行代码,很冗余。发一个请求,创建一个OkHttpClient,创建一个Request,创建一个Call,创建一个Callback(),而这仅仅是一个最简单的get请求,如果是post()请求,如果是文件下载,则更加麻烦,这是第一点,代码冗余,几乎不可复用。第二点是,如果不使用okhttp而使用其它的网络请求框架,则每个使用该网络请求的地方都需要修改。第三点是,高级程序员受不了如此冗余的代码,肯定要对其进行封装,而且网络请求逻辑完全暴露在activity里是不合理的。
二、网络请求组件---封装思路
三、基于okhttp封装我们的网络请求组件
okhttp这个包,这个包中我们分了这几个包,cookie包,exception包,https包,listener包,request包,response包,和一个CommonOkHttpClient。从封装完的整个包结构可以看出支持cookie、支持exception、支持https等等。
1、RequestParams
作用是封装所有的请求参数到HashMap中
创建线程安全的hashmap,并通过put方法,将key和value保存到数据结构中去
注:在实际开发中,无论是新建类还是新建接口,一定要把类或接口的方法或者作用和作者写上
2、CommonRequest
作用是接收请求参数,为我们生成Request对象,该类类似于一个工具类。工具类只需要提供static方法即可
注:在写公共组件的时候,每个方法一定要加注释。因为自己写的,可能自己知道,但是别人必需得看懂代码才知道该方法是什么作用
创建post请求:
创建post Request需要三部曲:
①创建FormBody,然后向FormBody的构造体中添加参数
②添加完参数后,通过Formbody的构造体生成Formbody的对象
③然后通过Formbody生成Request对象
创建Get请求对象
直接就是字符串的拼接,将url和字符串拼接成一个字符串,通过字符串即可生成get类型的request
四、网络请求组件----Client封装
主要作用:请求的发送,请求参数的配置,https支持
1、进行配置
然后通过okhttpBuilder生成okhttpclient对象。到这里,okhttp的配置基本就完成了。
2、发送请求
在使用自己写的框架或者第三方框架时,在onCreate()中发送了一个请求,在请求还没有返回时就点了返回键或者activity直接被销毁了,大多数用户是没有再次处理这个请求的。但是在实际开发中,是需要处理这个请求的,因为每个request其实都是通过线程发送出去的,虽然界面已经被销毁了,但是最后请求如果会回来的话还是会回来。界面销毁了,用户看不见了,但其实它还是会占用一部分内存。所以,在返回Call对象以后,最终还是需要在onDestroy()方法中,调用call的cancel()方法取消我们这次请求,这样的话,就会提高我们页面的效率。
通过okhttpclient的newcall()方法创建一个call对象,然后调用call的enqueue()入队方法,将commCallback作为参数传进去,然后将callreturn回去。
这里用到了static关键字,会不会造成内存泄漏或者内存溢出?static关键字在正确使用的情况下,是不会造成任何内存泄漏或者内存溢出的。我们在使用Android源码或者第三方框架时,都是用static关键字进行修饰的。如果它会造成内存泄漏或者内存溢出的话,api早就造成很大的内存泄漏或者内存溢出的问题了。所以,在处理一些工具类的问题的时候,就可以使用static。
3、测试请求
只需要传入一个请求一个回调就可以了。但是callback中还需要处理很多东西,比如异常、数据解析、数据转发等
注:
通过以下两步设置Https的支持
getSslSocketFactory()这个方法是生成一个SSLSocketFactory。Https请求就是在http协议和tcp协议之间又加了一层SSL协议,就是这层加密协议。普通的http请求其实最后也是走的tcp请求,tcp请求需要建立一个socket连接,所以普通的http请求走的就是socketfactory获取到的普通的socket,而https请求获取到的就是SSLSocketFactory,这样就可以完成对SSL完成支持了。
X509就是https所使用到的一个协议。首先就是获取到一个Manager X509TrustManager。这个信任管理器类默认都是空实现
可以通过创建的上下文初始化SSLContext。初始化sslContext的时候,需要与服务器保持一致。如果服务器端用的是SSL算法,那么获取实例时也需要使用SSL算法,如果服务端用的是TSL算法,那么客户端也需要使用TSL算法,否则数据会不正常。
获取sslContext后,就需要根据X509TrustManager和随机数初始化sslContext。初始化好以后就根据sslContext来返回一个sslsocketFactory()。从名字上来看,它其实就是一个sslsocket的一个工厂类,通过它底层可以获取到sslsocket
下面这个方法是获取指定证书的Factory
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。