Retrofit2 再研究

Retrofit2 再研究及与Volley对比

1.特性

  • retrofit2.Call<T>

    代表了一种方法的调用,发送请求给服务器,并返回相应结果,可取消,可同步请求,也可异步请求。类似于Volley中的RequestQueue。它是类型安全的,每个Call只能调一次, request 和 response 都是一一对应的,通过clone可以执行相同的请求。

  • 可插拔的序列化机制:

    目前已实现多种协议,包括Json,Jackson,Xml,Prorobuf等,且很容易自定义,只需要实现Converter接口即可。一个REST adapter 可以绑定多个Converter,采取查询的策略决定使用哪一种Converter。

    Note:因为 JSON 并没有什么继承上的约束。所以我们无法通过什么确切的条件来判断一个对象是否是 JSON 对象。以至于 JSON 的 converters 会对任何数据都回复说:我可以处理!这个一定要记住, JSON converter 一定要放在最后,不然会和你的预期不符

  • 灵活的CallAdapter,实现可替换的执行机制,可以将Call适配成任何你需要的类型:

    简单说你可以通过实现CallAdapter定制Service接口的返回类型,默认是Call<T>,目前已有的实现:

    • RxJava-Adapter(适配Observable)
    • Guava-Adapter(适配ListenableFuture)
    • Java8-Adapter(适配CompletableFuture)

    需要注意的是:这三种实现内部自动调用了Call的execute()或者equeue()方法。

  • 参数化响应对象:Response<T>

    Response持有转换后的对象。通过Response.body()可以获得T 类型的返回数据。Response 对象还包含一些重要元数据:响应码(the reponse code),响应消息(the response message),以及响应头(headers)。

  • post请求可传对象作为参数

    @POST("users/new")
    Call<User> createUser(@Body User user);
  • @Url,允许直接传入一个请求的url:

    Example:

    interface GitHubService {
    @GET("/repos/{owner}/{repo}/contributors")
    Call<List<Contributor>> repoContributors(
      @Path("owner") String owner,
      @Path("repo") String repo);
    
    @GET
    Call<List<Contributor>> repoContributorsPaginate(
      @Url String url);
    }
  • 绝对地址与相对地址

    Service接口方法的请求方式注解中,”/”开始为绝对地址,生成完整url时,接在host后面,否则为相对地址,接在baseUrl后面。

  • 解析响应头,实现连续请求,要的就是流畅

    Example:

    解析请求头中的分页数据,实现分页功能

    Response<List<Contributor>> response = call.execute();
    // HTTP/1.1 200 OK
    // Link: <https://api.github.com/repositories/892275/contributors?
    page=2>; rel="next", <https://api.github.com/repositories/892275/
    contributors?page=3>; rel="last"
    // ...
    String links = response.headers().get("Link");
    String nextLink = nextFromGitHubLinks(links);
    // https://api.github.com/repositories/892275/contributors?page=2
    Call<List<Contributor>> nextCall =
    gitHubService.repoContributorsPaginate(nextLink);
  • 集成OkHttp中已有的优秀API,减小Retrofit 2 的体积

    OkHttp 现在很小而且很聚焦,有很多好用的 API 接口。在 Retrofit 2 里都有对 OkHttp 的接口映射,也基本具备了我们需要的所有的特性,这些可以压缩 Retrofit 库大小。我们最终减小了Retrofit 60% 的体积(只有85k),同时又具有了更多的特性。

  • Okio

    OkHttp的实现使用了高性能的IO库Okio

  • 拦截器

    通过配置拦截器,实现日志,加解密,动态添加Header,修改请求(Url)等功能。

    机制:

    请求->拦截器1->拦截器2->拦截器3->…拦截器n->通过HttpEngine请求服务器,返回响应

    ->拦截器n->…->拦截器3->拦截器2->拦截器1->响应

  • 超时机制

    OkHttp 有默认的超时机制,如果你不需要自定义,实际上不必进行任何设置。

  • Error Body converter

    // Look up a converter for the Error type on the Retrofit instance.
    Converter<ResponseBody, Error> errorConverter =
        retrofit.responseBodyConverter(Error.class, new Annotation[0]);
    // Convert the error body into our Error type.
    Error error = errorConverter.convert(response.errorBody());
    System.out.println("ERROR: " + error.message);
    
  • 可自定义 Gson 对象,可设置TypeAdapter等

    Example

    Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd‘T‘HH:mm:ssZ")
        .create();
    
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://api.nuuneoi.com/base/")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();
    
    service = retrofit.create(APIService.class);
  • Response parsing failure case

    On Retrofit 1.9, if the fetched response couldn’t be parsed into the defined Object, failure will be called. But in Retrofit 2.0, whether the response is be able to parse or not, onResponse will be always called. But in the case the result couldn’t be parsed into the Object, response.body() will return as null. Don’t forget to handle for the case.

  • Certificate Pinning(证书链)

    Https 证书

    HSTS:HTTP Strict Transport Security

  • Mock response

    OkHttp 提供了 MockWebServer extension,使用它可以做本地调试。

  • 向后兼容性

    2.0以后采取新的版本策略,大版本缓慢缓慢,包名带版本号,artifactId 带版本号。

  • 实现方式

    按调用栈顺序:

    adapt-适配

    call Service method- >serviceMethod.callAdapter.adapt(okHttpCall);

    retrofit2.Call.execute()

    执行Call的方法,发请求

    convert-转换

    retrofit2.OkHttpCall.execute()->parseResponse(rawCall.execute())

    rawCall.execute()-执行

    okhttp3.RealCall.execute()

    intercept-拦截

    sendRequest-请求

    ApplicationInterceptorChain.proceed() // in RealCall class

    先后顺序:适配-执行-拦截-请求-拦截-转换

  • proguard

    -dontwarn retrofit2.**

    -keep class retrofit2.* { ; }

    -keepattributes Signature

    -keepattributes Exceptions

Volley vs Retrofit2

Features Volley Retrofit2
上传
下载 ×
同步
请求优先级 ×
重试
可封装性及扩展性
易用性
Response string/iamge/jsonobject 对象
Header操作
文档
jar包大小 92k 85k
API 丰富
样板代码
Okhttp
Http Cache
Okhttp
动态Url
Restful Api ×
拦截器 ×
rxjava/guava/java8 ×
版本更新 慢(已停更)
最新版本 1.0.19(2015/9) 2.0.2(2016/4/11)
平台 android java/android
Restful API 可支持 已支持

关于Retrofit基本的封装方案:

https://github.com/simplify20/RetrofitDemos

参考:

https://realm.io/news/droidcon-jake-wharton-simple-http-retrofit-2/

https://inthecheesefactory.com/blog/retrofit-2.0/en

http://riggaroo.co.za/retrofit-2-mocking-http-responses/

http://vickychijwani.me/retrofit-vs-volley/

http://stackoverflow.com/questions/29119253/retrofit-okhttp-client-how-to-cache-the-response/31097050#31097050https://github.com/square/retrofit/issues/820

http://stackoverflow.com/questions/32579754/retrying-the-request-using-retrofit-2/32840088#32840088

时间: 2024-08-03 22:35:02

Retrofit2 再研究的相关文章

Scratch高阶编程之克隆技术再研究

一.引言 克隆技术是时下热门的Scratch少儿编程考试或者竞赛必须面对的重点与难点之一.本文试图从较高的层面探讨Scratch编程中克隆技术的本质,并进一步把克隆技术的应用划分为两大类型--共享数据克隆体和非共享数据克隆体,最后给出各自的应用举例. 对于初.高中对面向对象编程概念没有基础的小朋友,可以略过本注释的阅读转而进行第二小节的阅读.熟悉其他高级编程语言的朋友都了解面向对象编程,其三种特征(封装.继承与多态)都在Scratch中得到非常自然与形象的体现.在此暂不赘述,有兴趣的朋友可多多联

dns服务 很多问题,后续再研究

慕课网:http://www.imooc.com/video/5220 参考:http://jingyan.baidu.com/article/870c6fc32c028eb03fe4be30.html http://www.tuicool.com/articles/aUNzMfi http://www.07net01.com/linux/dnszhucongfuzhijiquyuchuansong_505144_1373161402.html http://wenku.baidu.com/vi

javascript arguments对象研究--针对jquery源码研究再研究

外部插件: $.fn.tinytip = function(text, customOptions) { debugger; if (text && typeof text === 'object'){ customOptions = text; text = customOptions.tooltip; } var options = $.extend({}, tooltip_options, customOptions); options.tooltip = text; if (typ

需要再研究的题目

--40.以班号和年龄从大到小的顺序查询Student表中的全部记录.select sno,sname,ssex,class,YEAR(GETDATE())-YEAR(sbirthday) from stu order by class desc,YEAR(GETDATE())-YEAR(sbirthday) desc --28.查询"计算机系"与"电子工程系"不同职称的教师的Tname和Prof.select * from Teacher where (Depar

CSS3系列之3D制作 再研究

水平翻转效果: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <style type="text/css"> .stage { width: 140px; height: 200px; perspective: 800px; } .container { position: relative;

switch留个爪,之后还需要再研究下

1 public class SwitchDemo 2 { 3 public static void main (String [] args) 4 { 5 for(int i = 0; i < 10; i++) 6 { 7 char c = (char) (Math.random() * 26 + 'a'); 8 System.out.print (c + ": "); 9 switch (c) 10 { 11 case 'a': 12 case 'e': 13 case 'i

Unity3d插件研究之Easytouch

但我们开发移动端的游戏时,发现使用Input.GetMouseButtonDown的方法不可用,怎么办? 虽然unity3d也有自带触屏的方法,但是使用起来代价太高,什么单击,双击这些功能都要自己封装. 下面我们来讲下EasyTouch这个插件,它将所有触屏的手势,都已经写好了. 而且Easytouch也支持NGUI,使用起来十分的方便. 接下来,我们详细地学习这个插件改如何运用到我们的项目中来. 首先,我们导入easytouch插件,这里我是用3.0版本的,可能有些老了,我都没更新,但是大致的

前端编程提高之旅(十八)----移动端web流行交互技术方案研究

   在停止实习后,生活最大变化在于没有项目的压力,可以根据兴趣场景,探索技术实现.这个过程对于个人来说,动力自内而外,需求自上而下,都由个人把握.    生活在移动互联网井喷的今天,同时又关注前端技术,平常对微信端流行的交互(或者说玩法)有着特殊的敏感性.如果说之前接触MVC框架还是对单页面网站.CSS3前沿特效有一个概念的话,微信朋友圈及好友分享网页,则把国内网页构建的流行趋势,从幕后推向前台.    乐帝通过研究移动端web流行交互,构建起了一个初步可行的技术方案,用来实现单页面与DOM动

深入研究Block捕获外部变量和__block实现原理

Blocks是C语言的扩充功能,而Apple 在OS X Snow Leopard 和 iOS 4中引入了这个新功能“Blocks”.从那开始,Block就出现在iOS和Mac系统各个API中,并被大家广泛使用.一句话来形容Blocks,带有自动变量(局部变量)的匿名函数. Block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Bl