Android框架式编程之Retrofit
一、Retrofit 简介
Retrofit 官网地址: https://github.com/square/retrofit
Retrofit(即Retrofit,目前最新版本为2.6.0版本),是目前非常流行的网络请求框架,底层是基于okHttp实现的。准确来说Retrofit是对okHttp的进一步封装,它功能强大,支持同步和异步,支持多种数据的解析方式(默认为Gson),支持RxJava。
Retrofit 最大的优势就是简洁易用,它通过注解配置网络请求的参数,采用大量的设计模式来简化我们的使用。而且它的拓展性也做的相当的好,Retrofit 的功能模块高度封装,高内聚低耦合,我们可以自定义自己想要的组件,比如说我们可以自己选择解析工具而不用默认的Gson。除此之外,Retrofit 还有诸如性能好,处理速度快,代码简化等优势。
二、Retrofit 注解
使用 Retrofit 前我们不得不提一下注解,正是这些注解极大的方便了我们的代码编写及逻辑流程的控制。
1. 请求方法注解
- @GET:GET请求
- @POST:POST请求
- @DELETE:DELETE请求
- @HEAD:HEAD请求
- @OPTIONS:OPTIONS请求
- @PATCH:PATCH请求
2. 请求参数
- @Headers:添加请求头
- @Path:替换路径
- @Query:替代参数值,通常是结合get请求的
- @FormUrlEncoded:用表单数据提交
- @Field:替换参数值,是结合post请求的
二、Retrofit 使用
Retrofit代码实现步骤如下:
1)创建Retrofit 实例。
2)定义接口,使用注解的形式封装请求地址和请求参数
3)通过Retrofit实例,获取一个接口服务对象
4)通过接口服务对象调用接口中的方法,获取call对象
5)Call对象执行请求(异步请求、同步请求)
0. 准备工作
由于Retrofit是基于OkHttp,所以还需要添加OkHttp库依赖,需要在build.grale添加如下依赖:
dependencies {
// Okhttp库
compile 'com.squareup.okhttp3:okhttp:3.10.0'
// Retrofit库
compile 'com.squareup.retrofit2:retrofit:2.6.0'
}
添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
创建接收服务器返回数据的类:
public class Blog {
// 根据返回数据的格式和数据解析方式(Json、XML等)定义
...
}
1. 创建Retrofit实例
创建Retrofit实例时需要通过 Retrofit.Builder,并调用baseUrl方法设置URL。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:4567/")
.build();
注意:Retrofit 的 baseUlr 必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException。
2. 定义接口
定义请求接口的方式示例如下:
public interface BlogService {
@GET("blog/{id}")
Call<ResponseBody> getBlog(@Path("id") int id);
}
注意这里的 interface不是class,所以我们是无法直接调用该方法,我们需要用Retrofit创建一个BlogService的代理对象。
BlogService service = retrofit.create(BlogService.class);
拿到代理对象之后,就可以调用了。
3. 接口调用
调用方式的示例如下:
Call<ResponseBody> call = service.getBlog();
// 通过call对象执行网络请求(同步请求execute,异步请求enqueue)
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
} @Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
t.printStackTrace();
}
});
至此,使用Retrofit 就能够进行基本的网络请求了,如果需要更深层的使用,可以参考一下资料进行使用,后续我们在对这些高级的使用方法进行一一整理。
三、Retrofit 添加header参数
添加Header有以下几种方式:
1. 使用注解的方式
添加一个Header参数
public interface UserService {
@Headers("Cache-Control: max-age=640000")
@GET("/tasks")
Call<List<Task>> getTasks();
}
添加多个Header参数
public interface UserService {
@Headers({
"Accept: application/vnd.yourapi.v1.full+json",
"User-Agent: Your-App-Name"
})
@GET("/tasks/{task_id}")
Call<Task> getTask(@Path("task_id") long taskId);
}
2. 使用代码的方式,则需要使用拦截器:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder().header("User-Agent", "Your-App-Name")
.header("Accept", "application/vnd.yourapi.v1.full+json")
.method(original.method(), original.body()).build();
return chain.proceed(request);
}
} OkHttpClient client = httpClient.build();
Retrofit retrofit = new Retrofit.Builder().baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create()).client(client).build();
3. 使用注解的方式,但是Header参数每次提交的都不同,也就是动态的Header:
public interface UserService {
@GET("/tasks")
Call<List<Task>> getTasks(@Header("Content-Range") String contentRange);
}
4. 使用注解Map方式,也就是将多个Header参数进行封装:
@GET("/search")
Call<ResponseBody> list(@HeaderMap Map<String, String> headers);
四、Retrofit 提交数据方式
1. Retrofit实现Form提交
Form表单提交,后台服务器是以 键值对 的形式来接受参数的,所以Retrofit也很聪明,把接口参数通过Map的形式来提交。使用@FieldMap,@POST注解。
/**
* 登录
* post
* 表单提交
*
* @param map
* @return
*/
@FormUrlEncoded
@POST("login")
Flowable<BaseDto<LoginDto>> login(@FieldMap Map<String, String> map);
2. Retrofit实现Json提交
Json提交就是可以把对象直接转换成Json字符串,提交到后台服务器。所以我们直接传递整个对象即可。Retrofit会帮我们把对象转换成Json,然后传递给后台服务器。使用@Body ,@POST注解。
/**
* 签到详情
*
* @param vo
* @return
*/
@POST("sign/getDate")
Flowable<BaseDto<SignDetailDto>> signGetDate(@Body SignDetailVo vo);
参考资料:
1. 博文:https://www.jianshu.com/p/308f3c54abdd
2. 实例代码:https://github.com/ikidou/Retrofit2Demo/tree/master/client/src/main/java/com/github/ikidou
Android框架式编程之Retrofit的更多相关文章
- Android框架式编程之Android Architecture Components
1. 当前Android开发面临的问题 Android开发不同于传统的桌面程序开发,桌面程序一般都有唯一的快捷方式入口,并且常作为单进程存在:而一个典型的Android应用通常由多个应用组件构成,包括 ...
- Android框架式编程之BufferKnife
配置 compile 'com.jakewharton:butterknife:(insert latest version)' annotationProcessor 'com.jakewharto ...
- Android框架式编程之RxJava(一):HelloWorld
Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ...
- Android框架式编程之Room
Room是Google官方出品的ORM(Object-relational mapping) 框架.当前我们也知道当前还有很多的ORM框架,例如GreenDao.OrmLite.Litepal等.目前 ...
- Android框架式编程之Lifecycle
Lifecycle官方文档地址:https://developer.android.com/topic/libraries/architecture/lifecycle. 一.为什么要使用Lifecy ...
- Android框架式编程之EasyPermissions
EasyPermission库是一个谷歌官方提供的简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 官方项目地址:https://github.com/googlesamples ...
- Android框架式编程之LiveData
一.LiveData 介绍 LiveData是 Google 推荐的 Android 架构组件之一,是一个基于观察者模式的数据容器,但与一般的被观察者不同的是,它是有生命周期感知功能,解决了Andro ...
- Android框架式编程之EventBus
一.EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus. 它简化了应用程序内各个组件之间进行通信的复杂 ...
- Android框架式编程之MVP架构
MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...
随机推荐
- 阿里巴巴的 Kubernetes 应用管理实践经验与教训
作者 | 孙健波(天元) 阿里巴巴技术专家 导读:本文整理自孙健波在 ArchSummit 大会 2019 北京站演讲稿记录.首先介绍了阿里巴巴基于 Kubernetes 项目进行大规模应用实践过程 ...
- node.js调试入门
1-1 Inspector介绍 使用Inspector调试Node.js的优势 可查看当前上下文的变量 可观察当前函数调用堆栈 不侵入代码 可在暂停状态下执行指定代码 Inspector的构成以及原理 ...
- apache mpms和php概述
当设置一个Apache + PHP服务器来运行你的PHP应用程序时,有许多配置参数需要处理. 最重要的是php服务器Api(server api:sapi),它决定了Apache将如何运行PHP脚本. ...
- 一篇文章教你轻松使用fastjson
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y JSON相信大家对他也不陌生了,前后端交互中常常 ...
- 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)
题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...
- python数学工具(一)
python 数学工具包括: 1.函数的逼近 1.1.回归 1.2.插值 2.凸优化3.积分4.符号数学 本文介绍函数的逼近的回归方法 1.作为基函数的单项式 对函数 的拟合 首先定义函数并且可视化 ...
- rails 各种分组统计查询
SpecialGroup.group(:special_type).countselect special_type,count(*) from special_groups group by spe ...
- 算法题-Z 字形变换
描述 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I R ...
- 十分钟学会Markdown基本语法
文章目录 Markdown 语法 一.标题 这是一级标题 这是二级标题 这是三级标题 这是四级标题 这是五级标题 这是六级标题 二.字体 三.引用 四.分割线 五.图片 六.超链接 七.列表 八.表格 ...
- Python面向对象-访问权限public和private
上一节我们介绍了,Class内部可以有属性和方法,外部代码通过直接调用实例的方法来操作数据,这样就可以隐藏内部的逻辑实现:同时,外部代码还是可以自由的修改实例的属性和增加方法. 但是有时候,我们不想这 ...