黑马程序员技术交流社区

标题: 网络框架-Retrofit 2.0 [打印本页]

作者: 唐杨老师    时间: 2016-2-23 13:06
标题: 网络框架-Retrofit 2.0
本帖最后由 唐杨老师 于 2016-2-23 13:08 编辑


Square 开源的项目. 是一套RESTful架构的Android(Java)客户端实现,基于注解,提供JSON to POJO(Plain Ordinary Java Object,简单Java对象),POJO to JSON,网络请求(POST,GET,PUT,DELETE等)封装。

同类技术:
RoboSpice, OkHttp, Volley, Android-Async-Http

解决什么问题:
给服务器上传数据, 获取服务器数据, 解析数据。

官方地址:
http://square.github.io/retrofit/

当前的需求是:
通过GET方式获取软件版本是否需要更新, 并把当前版本2.3.0传给服务器。
请求地址: http://news-at.zhihu.com/api/4/version/android/2.3.0
根据返回的json转换得到的bean对象, 判断是否需要下载更新应用版本。

响应结果:

当前软件为最新版本时返回:
{
    "status": 0,
    "latest": "2.3.0"
}

当前软件为较老版本时返回:
{
    "status": 1,
    "msg": "【更新内容】(后略)",
    "latest": "2.5.0"
}

使用准备:
在自己的项目中使用Retrofit 2.0,在build.gradle的依赖中添加:
  1. // retrofit 2.0的依赖库
  2. compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'

  3. // 使用gson转换获取到的数据
  4. compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
复制代码

使用步骤:
1. 创建Retrofit对象, 用于配置网络协议,主机名, 数据转换器等信息
  1. Retrofit retrofit = new Retrofit.Builder()
  2.         .baseUrl("http://news-at.zhihu.com/api/4/") // 配置网络协议和跟路径
  3.         .addConverterFactory(GsonConverterFactory.create())// 添加数据转换工厂
  4.         .build();// 构建
复制代码
2. 定义一个RSET API接口函数, 执行此函数表示请求方式为GET, 获取服务器路径为version/android/2.3.0数据, 并将返回的json结果转换成VersionInfoDTO对象。
此处的接口声明的方式更多详情参见底部 备注1:
  1. public interface ApiService {

  2.         @GET("version/android/2.3.0")
  3.         Call<VersionInfoDTO> loadVersionInfo();

  4. }
复制代码



3.创建接口的动态代理类, 调用接口函数获得 调用对象Call
  1. // 通过retrofit生成接口实现类. 此实现类为动态代理
  2. ApiService apiService = retrofit.create(ApiService.class);
  3. // 通过此代理类可以调用接口函数和服务器交互
  4. Call<VersionInfoDTO> call = apiService.loadVersionInfo();
复制代码
4. 通过Call对象, 可以同步或异步获取网络数据
  1. // 阻塞式获取数据, 不可以在主线程执行.
  2. Response<VersionInfoDTO> execute = call.execute();

  3. // 异步获取数据, 数据获取并解析完毕时onResponse被调用
  4. call.enqueue(new Callback<VersionInfoDTO>() {
  5.     @Override
  6.     public void onResponse(Response<VersionInfoDTO> response) { // 成功
  7.         // 通过body方法得到解析后的对象
  8.         VersionInfoDTO versionInfoDTO = response.body();
  9.         System.out.println("result: " + versionInfoDTO);
  10.     }

  11.     @Override
  12.     public void onFailure(Throwable t) { // 失败

  13.     }
  14. });
复制代码

源码Demo下载地址:
http://pan.baidu.com/s/1ToUx4

学习用到的数据接口为“知乎日报”接口:
https://github.com/iKrelve/KuaiHu/blob/master/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5API.md

相关文章:
用 Retrofit 2 简化 HTTP 请求
https://realm.io/cn/news/droidcon-jake-wharton-simple-http-retrofit-2/

快速Android开发系列网络篇之Retrofit
http://www.cnblogs.com/angeldevil/p/3757335.html

Retrofit结合RxJava做网络请求框架
http://gank.io/post/560e15be2dca930e00da1083  (给 Android 开发者的 RxJava 详解)

Retrofit 2.0:有史以来最大的改进
http://gold.xitu.io/entry/5626eaf360b27cc2d68292fc
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3460.html

备注1:
接口定义有以下的配置方式, 取决于接口的参数需求
  1. // 可以直接在URL中指定参数
  2. @GET("version/android/2.3.0?order=desc")
  3. Call<VersionInfoDTO> loadVersionInfo();

  4. // 可以添加参数
  5. @GET("version/android/2.3.0")
  6. Call<VersionInfoDTO> loadVersionInfo(@Query("order") String order);

  7. // 可以添加占位符
  8. @GET("news/before/{dateStr}") // 表示{dateStr}由函数参数决定
  9. Call<NewsBeforeDTO> getNewsBefore(@Path("dateStr") String date); // dateStr要一致

  10. // 设置POST请求体
  11. @POST("users/new")
  12. void createUser(@Body User user, Callback<User> cb);

  13. // 上传POST表单数据
  14. @FormUrlEncoded
  15. @POST("user/edit")
  16. User updateUser(@Field("name") String name, @Field("age") int age);

  17. // 多文件/数据上传
  18. @Multipart
  19. @PUT("/user/photo")
  20. Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

  21. //给当前请求添加Headers头信息
  22. @Headers({
  23.         "Accept: application/vnd.github.v3.full+json",
  24.         "User-Agent: Retrofit-Sample-App"
  25. })
  26. @GET("version/android/2.3.0")
  27. Call<VersionInfoDTO> loadVersionInfo();
复制代码

添加混淆忽略:
  1. -dontwarn retrofit.**
  2. -keep class retrofit.** { *; }
  3. -keepattributes Signature
  4. -keepattributes Exceptions
复制代码













欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2