本帖最后由 唐杨老师 于 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
复制代码
|
|