文档章节

Android Retrofit介绍

紫韵
 紫韵
发布于 2016/03/30 21:48
字数 2388
阅读 497
收藏 5

一、Retrofit简介

    Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库,这个库为网络认证、API请求以及用OkHttp发送网络请求提供了强大的框架 。Retrofit 库使得从web api下载JSON 或者xml数据变的非常简单直接,一旦数据下载完成即将其解析成普通java类(POJO)。
    Retrofit支持Java 7 或 Android 2.3及以上版本。

    注:Rest API是一种软件设计风格,服务器作为资源存放地。客户端去请求GET,PUT, POST,DELETE资源。并且是无状态的,没有session的参与。

     Retrofit使用的最核心的两个技术:动态代理和Java反射。Retrofit非常巧妙的用注解来描述一个HTTP请求,将一个HTTP请求抽象成一个Java接口,然后用了Java动态代理的方式,动态的将这个接口的注解“翻译”成一个HTTP请求,最后再执行这个HTTP请求。

    Retrofit无非就是让用户创建接口,并在接口中指定网络访问路径、规则,把接口传入Retrofit,Retrofit进行层层解析,然后调用OkHttp完成实际的网络请求并将请求结果处理后返回给用户。

二、Retrofit特点

  • 底层使用OkHttp进行网络传输,性能好,速度快;

  • 拥有出色的API文档和社区支持

  • 可以自动将REST API返回的数据转化为Java对象,且支持多种数据转换格式(如json、xml等)

  • 使用Java注解声明HTTP请求

  • 支持 Multipart请求和文件上传

三、Android中Retrofit的使用流程

    下面通过一个实际的例子介绍Retrofit的使用流程。该示例程序通过使用Retrofit向https://api.github.com/  获取指定github用户的相关信息。目前Retrofit的最新版本为2.0版,与此前的1.9有比较大的不同,该示例代码是基于Retrofit2.0实现的。

    注:在浏览器输入网址https://api.github.com/users/"想要查询的github用户名",服务器便会返回一个包含该用户信息的json字符串,如输入https://api.github.com/users/littleshuang ,所得到的json字符串为

    

    第一步:添加依赖(gradle)

//retrofit底层网络框架为OkHttp,所以必须添加OkHttp的依赖包
compile 'com.squareup.okhttp3:okhttp:3.2.0'  
  
//retrofit的依赖包
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
//添加了一个官方提供的json  conventer
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

    第二步:构建返回数据对应的实体类

    注:Retrofit可以自动根据我们提供的conventer将返回数据转化为JOPO,所以我们需要创建一个返回数据的实体类

    本实例中根据前述json数据格式创建了一个User类

    

    第三步:定义一个请求数据的接口,该接口中包含用于请求数据的方法定义(此例中定义了一个名为ServiceInterface的接口,其中包含一个获取用户信息的get请求)

    

  1. @GET:retrofit提供的一个用于定义请求方法的注解,retrofit会根据该注解将该方法解析为一个相应请求类型的http请求

  2. users/{user}:http请求的相对路径,该路径为相对于自定义的BaseURL的路径,该示例中的BaseURL为:https://api.github.com/ ;大括号包裹的{user}是retrofit提供的一种动态生成URL地址的方式,大括号中包含的内容的具体类型和数据需要通过注解@Path后面的参数获得,此例中为一个String类型变量,具体值由user变量提供

    注:此处也可以使用绝对路径,但一般来说,同一项目中的绝大部分网络请求都是基于同一服务器基址,变化的只是后面的相对路径,所以推荐使用BaseURL + 相对路径的方式,这种方式既能减少不必要的冗余代码,使代码更加简洁,又能减少出错概率、提高重构效率。

  3. Call<T>:retrofit中定义的一个接口,该接口中主要定义了同步请求(execute)、异步请求(enqueue)、取消请求(cancle)等方法,该接口的实现类通过实现这些方法执行具体的网络请求操作;虽然Retrofit默认使用OkHttp执行具体的网络请求操作,但是,我们可以通过自己实现该接口而采用自己的逻辑来执行网络请求,这种方式非常插件化,从而非常灵活

    第四步:使用Retrofit对象执行网络请求

// 获取一个Retrofit对象,并设置该对象的BaseURL和conventer 
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
// service实际上是create方法返回的一个ServiceInterface接口的动态代理
ServiceInterface service = retrofit.create(ServiceInterface.class);
// 通过下面这个语句就创建了一个向获取数据的get请求
Call<User> call = service.getUser("littleshuang");
// enqueue是一个异步请求方法
call.enqueue(new Callback<User>() {
    @Override
    public void onResponse(Call<User> call, Response<User> response) {
        if (response.isSuccess()){
        // isSuccess()函数的处理逻辑非常简单,只是判断了下response的返回码是否为200,是即true,否则false
        // 所以可以自己根据自己的需要进行处理
            User user = response.body();
            if (user != null){
                etRetrofitGetUser.setText("User login: " + user.getLogin());
            }
        }
    }
    @Override
    public void onFailure(Call<User> call, Throwable t) {
        etRetrofitGetUser.setText("Sth wrong!");
    }
});

    结果展示:左右两图分别展示的是网络请求成功和失败两种情况下的结果

    

四、Retrofit注解

    Retrofit源码下面的http包中包含了Retrofit中定义的全部22中注解类型,这些注解都是用于控制HTTP请求的一些接口方法,下面对这些注解进行简单的介绍,便于以后的使用

  1. 请求方法类:@GET @HEAD @POST @DELETE @PUT @OPTIONS @PATCH,这几个注解分别表示定义一个get、head、post、delete、put、options或patch请求;

  2. HTTP请求体:@BODY,该注解适用于在使用post或put请求时想要直接控制HTTP请求体的情况,此注解参数不能为空;

  3. 定义一个表单形式的请求:@FormUrlEncoded及@Field(或@FieldMap),该注解适用于需要使用表单形式提交一个名值对的表单数据的情形,@FormUrlEncoded声明该请求的请求体为表单形式,@Field定义请求体中的一组名值对,而@FieldMap定义多个名值对的组合

    For example:

  4. @FormUrlEncoded
    @POST("users/{user}")
    User updateUser(@Field("id") int id, @Field("name") String name);
    @FormUrlEncoded
    @POST("users/")
    Call<User> add(@FieldMap Map<String, String> fields);

    使用 service.updateUser(1, "Bob")时,请求体为id=1&name=Bob

    使用service.add("name", "Bob", "nickname", "LittleBob")时,请求体为name=Bob&nickname=LittleBob

  5.  HTTP请求头:@HEADER 和@HEADERS,注意这两者的区别,两者均可以用于定义请求头部信息,但是前者会覆盖之前定义的头部信息,而后者不会,只会在后面进行追加;所以当多次对同一名称的头域进行赋值时,使用前者只会保留最后一次的赋值,即一个头域至多只有一个赋值,而使用后者则会保留所有的赋值,即一个头域对应多个取值;

  6. 自定义HTTP请求客户端:@HTTP

  7. 定义一个Multi-part类型的请求:@Multipart和@Part(或@PartMap),该注解适用于请求体为Multi-part类型的请求,@Multipart声明一个Multi-part类型的请求,@Part定义一个Multi-part类型请求的一个单一部分,@PartMap定义一个一个Multi-part类型请求的名值对,用法类似于表单形式的请求的用法,就不详细介绍了

  8. @Path:该注解后面的参数用于替换url中{}包含的部分内容

  9. 查询参数:@Query和@QueryMap分别定义一个查询参数和一个查询参数键值对

  10. @Streaming:定义该注解表示将请求方法的返回值直接以流的形式返回,而不解析为Java实体类

  11. @Url:该Url是一个相对于BaseURL的一个路径,定义该参数就表示该请求方法的相对地址为参数后面的内容

五、Retrofit & OkHttp

    Retrofit和OkHttp同属于Square公司的开源项目,这两者是互补的关系,OkHttp是一个实现了HTTP协议的客户端,类似于HttpClient,而Retrofit是一个基于OkHttp的封装库,该库主要简化了http请求的实现过程,使得开发者只需关注自身功能的实现,而不必书写那些比较冗余的代码。但也正是由于Retrofit的高度封装性,其扩展性就相对比较弱,某些比较灵活的功能还需要开发者自己通过OkHttp来实现。

六、Retrofit VS Volley

    Retrofit和Volley两者均是目前比较受开发者喜欢的两个网络库,不过这两者还是有比较大的差异。

  • Retrofit的底层实现是OkHttp,Volley的底层实现的是HttpClient和HttpUrlConnection;

  • Retrofit的返回可以自动解析为Java实体类,而Volley的返回数据类型根据请求类型而定(StringRequeset、ImageRequest、JsonObjectRequest或JsonArrayRequest),同时需要自己进行解析;

  • Retrofit拥有比较详细的API文档和比较活跃的社区支持,而google貌似并未给Volley提供开发文档,只是在Android developers中的网络部分有所提及,所以在易用性方面,感觉Retrofit更胜一筹;

  • Retrofit支持动态生成URL,Volley好像并不支持;

  • 两者均异步请求方式,这在Android应用中是非常重要的,因为Android程序中不允许在Home线程中执行网络操作;

© 著作权归作者所有

上一篇: jdk容器之HashMap
下一篇: Android 网络(二)
紫韵
粉丝 4
博文 21
码字总数 34323
作品 0
武汉
私信 提问
加载中

评论(4)

紫韵
紫韵 博主

引用来自“牛仔面包”的评论

太感谢了楼主,文章简单易懂0
可能因为自己也还处于学习阶段,所以写的东西比较通俗易懂,希望能够给更多人提供帮助
牛仔面包
太感谢了楼主,文章简单易懂0
紫韵
紫韵 博主

引用来自“heart162”的评论

后面可以自己用起来,然后可以考虑一些情况该怎么处理
1、已发出的请求如果需要cancel怎么做比较好
2、请求失败怎么做一些基本处理
等,可以结合业务情况详细讨论
是的,感觉还是要自己在具体场景中使用才会有比较深的认识
h
heart162
后面可以自己用起来,然后可以考虑一些情况该怎么处理
1、已发出的请求如果需要cancel怎么做比较好
2、请求失败怎么做一些基本处理
等,可以结合业务情况详细讨论
Android 开发程序员必备网站

开发必备网站: Android 开发各种工具下载 Android 开发国内大牛集合 Android 开发技术博客周刊 Android 开发技术周报中文版 Android 优秀开源项目集合以及源码分析 Android 万能的技术交流社...

白jian
2016/11/25
691
1
ARetrofit组建化最佳路由

Android组件化超级路由,为简单而生。 Github 源码: ARetrofit 原文 demo demo apk 下载 一 介绍 从命名来看,做Android开发的小伙伴们感觉是不是似曾相识…是的,Retrofit,一款优秀的网络框...

CharlesZhu
2018/06/05
0
0
android电子书App、自定义图表、仿腾讯漫画App、仿淘宝优惠券、3D选择容器等源码

Android精选源码 仿支付宝记账本功能,饼状图;数字键盘(http://www.apkbus.com/thread-602144-1-1.html) android一款功能完善的电子书应用源码(http://www.apkbus.com/thread-602145-1-1.ht...

逆鳞龙
2018/08/07
21
0
Android 开发程序员必备网站

开发必备网站: Android 开发各种工具下载 Android 开发国内大牛集合 Android 开发技术博客周刊 Android 开发技术周报中文版 Android 优秀开源项目集合以及源码分析 Android 万能的技术交流社...

api接口设计
2016/11/08
210
0
使用Android Architecture Component开发应用(附demo)

相关文章: 【翻译】安卓架构组件(1)-App架构指导 【翻译】安卓架构组件(2)-添加组件到你的项目中 【翻译】安卓架构组件(3)-处理生命周期 【翻译】安卓架构组件(4)-LiveData 【翻译】安卓架构...

Chuckiefan
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安全组和云防火墙的区别

前言 熟悉云平台的朋友可能都会注意到这样一个事情:无论公有云还是私有云,创建虚拟机的时候都需要选择安全组,来对虚拟机进行安全防护;有的云平台在VPC里,还能选择防火墙,ZStack在3.6版...

ZStack社区版
18分钟前
1
0
教育性app开发的重要性和好处

在这个精通技术的世界中,流行的app主导着无聊的教育系统。当我们将技术和教育结合在一起时,它将带来当代以及强大的学习资源。因此,将教育移动app集成到您的学习过程中,并根据自己的信念把...

a429011717
19分钟前
2
0
IE6/7/8如何兼容CSS3属性

本文转载于:专业的前端网站➩IE6/7/8如何兼容CSS3属性 最近在工作中总是要求IE8兼容CSS3属性,在网上搜了搜主要是引入了一个htc文件(ie-css3.htc或者PIE.htc。个人认为这两个文件的作用差不...

前端老手
34分钟前
2
0
手把手教你ALLEGRO的约束规则的设置教程!

约束规则的设置 分三步, 定义规则(一、基本约束规则设置:1、线间距设置;2、线宽设置;3、设置过孔;4、区域约束规则设置;5、设置阻抗;6、设置走线的长度范围;7、设置等长:7.1、不过电阻的NET 等...

demyar
36分钟前
3
0
完美解决H5滚动滑动穿透方案:不使用系统滚动

网上有很多黑科技解决这个问题,都不是从根本去解决,例如通过js控制弹出时html加上position:fixed; 弹窗关闭后再去掉该样式,总觉得不太对,像是打补丁。 今天终于找到了滚动穿透的原因和完...

未来cc
41分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部