黑马程序员技术交流社区
标题:
网络框架-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的依赖中添加:
// retrofit 2.0的依赖库
compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
// 使用gson转换获取到的数据
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
复制代码
使用步骤:
1. 创建Retrofit对象, 用于配置网络协议,主机名, 数据转换器等信息
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://news-at.zhihu.com/api/4/") // 配置网络协议和跟路径
.addConverterFactory(GsonConverterFactory.create())// 添加数据转换工厂
.build();// 构建
复制代码
2. 定义一个RSET API接口函数, 执行此函数表示请求方式为GET, 获取服务器路径为
version/android/2.3.0
数据, 并将返回的json结果转换成
VersionInfoDTO
对象。
此处的接口声明的方式更多详情参见底部 备注1:
public interface ApiService {
@GET("version/android/2.3.0")
Call<VersionInfoDTO> loadVersionInfo();
}
复制代码
3.创建接口的动态代理类, 调用接口函数获得 调用对象Call
// 通过retrofit生成接口实现类. 此实现类为动态代理
ApiService apiService = retrofit.create(ApiService.class);
// 通过此代理类可以调用接口函数和服务器交互
Call<VersionInfoDTO> call = apiService.loadVersionInfo();
复制代码
4. 通过Call对象, 可以同步或异步获取网络数据
// 阻塞式获取数据, 不可以在主线程执行.
Response<VersionInfoDTO> execute = call.execute();
// 异步获取数据, 数据获取并解析完毕时onResponse被调用
call.enqueue(new Callback<VersionInfoDTO>() {
@Override
public void onResponse(Response<VersionInfoDTO> response) { // 成功
// 通过body方法得到解析后的对象
VersionInfoDTO versionInfoDTO = response.body();
System.out.println("result: " + versionInfoDTO);
}
@Override
public void onFailure(Throwable t) { // 失败
}
});
复制代码
源码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:
接口定义有以下的配置方式, 取决于接口的参数需求
// 可以直接在URL中指定参数
@GET("version/android/2.3.0?order=desc")
Call<VersionInfoDTO> loadVersionInfo();
// 可以添加参数
@GET("version/android/2.3.0")
Call<VersionInfoDTO> loadVersionInfo(@Query("order") String order);
// 可以添加占位符
@GET("news/before/{dateStr}") // 表示{dateStr}由函数参数决定
Call<NewsBeforeDTO> getNewsBefore(@Path("dateStr") String date); // dateStr要一致
// 设置POST请求体
@POST("users/new")
void createUser(@Body User user, Callback<User> cb);
// 上传POST表单数据
@FormUrlEncoded
@POST("user/edit")
User updateUser(@Field("name") String name, @Field("age") int age);
// 多文件/数据上传
@Multipart
@PUT("/user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
//给当前请求添加Headers头信息
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("version/android/2.3.0")
Call<VersionInfoDTO> loadVersionInfo();
复制代码
添加混淆忽略:
-dontwarn retrofit.**
-keep class retrofit.** { *; }
-keepattributes Signature
-keepattributes Exceptions
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2