Retrofit的浅析 —— 针对面试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit的浅析 —— 针对面试相关的知识,希望对你有一定的参考价值。
参考技术A 1.近两年Retrofit非常热门,特别是结合Rxjava运用到项目中。Retrofit一个RESTful的Http网络请求框架的封装,内部封装了Okhttp网络请求框架,对网络请求做了大量优化。Retrofit其最大特点就是解耦,要解耦就需要大量的设计模式,内部使用了外观模式、构建模式、观察者模式、动态代理模式、策略模式、适配器模式和装饰模式等等;实际上分析Retrofit需要熟悉Okhttp才能深入分析Retrofit,Retrofit不止使用okhttp的内核,它还封装了CallAdapter-请求适配器:可以实现多种请求响应形式:同步方式、异步回调方式、RxJava方式;封装了Converter-数据转换器:可以自己定义responseBodyConverter和requestBodyConverter,实现加密功能和各种数据格式的解析;
retrofit 结合 okhttp 的原因就是retrofit使用了代理模式,默认代理走的就是okhttp,okhttp 负责网络请求, retrofit 负责对网络的处理,包括gson解析都是封装在retrofit里面的,如果哪天okttp不流行了是可以切换到别的网络框架的
Retrofit(改良)框架是Square公司出品的目前非常流行的网络框架,效率高,实现简单,运用注解和动态代理设计模式,极大的简化了网络请求的繁琐步骤,非常适合处理REST ful(一种风格)网络请求.目前Retrofit版本是2(可以说是Square公司之前出品okhttp的升级版)
性能好,处理快,使用简单.(速度比Volley更快)
使用REST API非常方便
支持NIO(新的IO API,可以替代标准的Java IO API)
Retrofit默认使用okhttp处理网络请求;
默认使用Gson解析
1.在项目的build.gradle中添加依赖后一个依赖比前一个多了个Gson解析的功能,看需求,二者依赖一个即可, 一 般依赖带Gson解析的依赖
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
<uses-permission android:name="android.permission.INTERNET" />
@GET GET网络请求方式
@POST POST网络请求方式
@Headers 头信息参数
@Path 路径参数.替换url地址中 "" 和 ""所包括的部分
@Query 查询参数.将在url地址中追加类似"page = 1"的字符串,形成提交给服务器端的请求参数
@QueryMap 查询参数集合.在url地址中追加类似"type = text & count = 30 & page = 1 " 的字符串
@FormUrlEncoded 对表单域中填写内存进行编码处理,避免乱码
@Field 指定from表单域中每个控件的name及相应数值
@FieldMap 表单域集合
@Multipart Post提交分块请求.如果上传文件,必须指定Multipart
@Part Post提交分块请求
@Body Post提交分块请求
1.设置请求方式是注解的形式
2.接口拼接字符串更灵活
3.异步响应回调方法在主线程
/**
* 作用:GET请求最简单的写法,无Path参数和Query参数
* article/list/latest?page=%d实际是Constant下的URL_LATEST地址
* @GET()里的东西是要拼接的网址,注意直接把page=1了
*/
@GET("article/list/latest?page=1")
Call<ResponseBody> getLatestJsonString();
/**
* 其中注解中的变量用 变量名自定义 在方法参数中
* 格式:@Path("上面定义的变量名") 类型 定义的变量名 作用:替换url地址中""和""所包括的部分
* 格式:@Query("参数名") 类型 定义的参数名 作用:会拼接在URL的最后部分,类似追加了"page = 1"的字符串,最后提交给服务器
*/
@GET("article/list/type?")
Call<QiushiModel> getInfoList(@Path("type") String type, @Query("page") int page);
/**
* @QueryMap参数将在url地址中追加类似"type = text & count = 30 & page = 1 " 的字符串
*/
@GET("web/LoginServlet")
Call<ResponseBody> getRegInfo(@QueryMap Map<String, String> map);
/**
* 静态的URL地址
*/
@GET("http://img.265g.com/userup/1201/201201071126534773.jpg")
Call<ResponseBody> getNetworkData();
/////////////////////////////////////////////////// Post ////////////////////////////////////////////////
/**
* 作用:post网络请求,向服务器提交表单域数据
* @FormUrlEncoded:解决编码乱码问题,
*/
@FormUrlEncoded
@POST("web/LoginServlet")
Call<ResponseBody> postFormFields(@Field("username") String username,@Field("password") String password);
/**
* 作用:post网络请求,向服务器提交表单域数据
* @FormUrlEncoded:解决编码乱码问题,
*/
@FormUrlEncoded
@POST("web/LoginServlet")
Call<ResponseBody> postFormFieldMap(@FieldMap Map<String , String> map);
/**
* 上传单个文件,必须加上 @Multipart 注解
*/
@Multipart
@POST("web/UploadServlet")
Call<ResponseBody> postUploadFile(@Part("uploadfile\";filename=\"myuploadimg.png") RequestBody requestBody);
Retrofit2中Base Url与@Url不是简单的组合,而是和<a href = "...">的处理方式一样
提示:Base URL: 以"/"结尾 @Url:不要以"/"开头
面试系列——Retrofit 框架分析使用总结
Retrofit 框架分析
介绍
利用各种精巧的设计模式 ,以一种优雅的方式构造网络请求,内部还是利用OkHttp发送网络请求,而不是重写了一个套网络框架。
请求过程
定义获取Retrofit 实例 ,创建网络接口实例,发送网络请求,获取返回结果。
各种设计模式
构造者模式
Retrofit 实例创建利用Builder模式,简化构建方法。
外观模式
对外只提供Retrofit 实例 避免对系统的直接访问。
代理模式
网络接口到实现类的利用到动态代理,简化调用。
适配器模式
CallAdapter adapt 的实现 提供不同的Adapter实现来转化Call 请求。
工厂模式
CallAdapter.Fatory 对外屏蔽获取CallAdapter实现细节
策略模式
不同平台Platform 返回不同的callbackExecutor。
如何改变BaseUrl
1. 方案一 多Retrofit 实例
适用于baseUrl 不是很多,注意 可以通过 Retrofit 构造器Builder client(OkHttpClient ) 共享OkHttp 实例,否则会创建多个OkHttpClient ,不推荐使用。
2. 方案二 拦截器
拦截器 中重新构造请求。
3. 方案三 利用Path 参数覆写路径
静态方案,接口太多时,每个接口都要覆写path 不够优雅。
以上是关于Retrofit的浅析 —— 针对面试的主要内容,如果未能解决你的问题,请参考以下文章