一、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的更多相关文章

  1. Android框架式编程之Android Architecture Components

    1. 当前Android开发面临的问题 Android开发不同于传统的桌面程序开发,桌面程序一般都有唯一的快捷方式入口,并且常作为单进程存在:而一个典型的Android应用通常由多个应用组件构成,包括 ...

  2. Android框架式编程之BufferKnife

    配置 compile 'com.jakewharton:butterknife:(insert latest version)' annotationProcessor 'com.jakewharto ...

  3. Android框架式编程之RxJava(一):HelloWorld

    Hello World 源码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import androi ...

  4. Android框架式编程之Room

    Room是Google官方出品的ORM(Object-relational mapping) 框架.当前我们也知道当前还有很多的ORM框架,例如GreenDao.OrmLite.Litepal等.目前 ...

  5. Android框架式编程之Lifecycle

    Lifecycle官方文档地址:https://developer.android.com/topic/libraries/architecture/lifecycle. 一.为什么要使用Lifecy ...

  6. Android框架式编程之EasyPermissions

    EasyPermission库是一个谷歌官方提供的简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上. 官方项目地址:https://github.com/googlesamples ...

  7. Android框架式编程之LiveData

    一.LiveData 介绍 LiveData是 Google 推荐的 Android 架构组件之一,是一个基于观察者模式的数据容器,但与一般的被观察者不同的是,它是有生命周期感知功能,解决了Andro ...

  8. Android框架式编程之EventBus

    一.EventBus 简介 EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus. 它简化了应用程序内各个组件之间进行通信的复杂 ...

  9. Android框架式编程之MVP架构

    MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...

随机推荐

  1. 使用ASP.NET Core 3.x 构建 RESTful API - 3.3 状态码、错误/故障、ProblemDetails

    HTTP状态码 HTTP状态码会告诉API的消费者以下事情: 请求是否执行成功了 如果请求失败了,那么谁为它负责 HTTP的状态码有很多,但是Web API不一定需要支持所有的状态码.HTTP状态码一 ...

  2. 数据库Oracle多表链接

    多表查询: 当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询.根据不同表中的数据之间的关系查询相关联的数据. 多表链接方式: 内连接:(等值连接,非等值连接,自连接,SQL99有交叉连接( ...

  3. 字典dict的深入学习(item() / items() 一致的)

    字典Dict的跟进学习: 一. items()方法的遍历:items()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回. dict = {"name" ...

  4. cesium 结合 geoserver 实现地图属性查询(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  5. 2018 牛客国庆集训派对Day4 - H 树链博弈

    链接:https://ac.nowcoder.com/acm/contest/204/H来源:牛客网 题目描述 给定一棵 n 个点的树,其中 1 号结点是根,每个结点要么是黑色要么是白色 现在小 Bo ...

  6. [知也无涯]GAN对人脸算法的影响

    红绣被,两两间鸳鸯.不是鸟中偏爱尔,为缘交颈睡南塘.全胜薄情郎. 看到一篇GAN对人脸图像算法的影响,决心学习一个. 人脸检测 这也是我最关注的模块.文章推荐了极小面部区域人脸识别Finding ti ...

  7. 打样ov9650,无一幸免,失败告终,之调试记录

    新打样的ov9650,焊接了4块,其中只有2块有反应,另外两块无反应,于是使用热风台助焊,调试 助焊无效,怀疑焊盘有问题,于是拆掉 有问题的图像不正常 已看图像,只知道缺位,于是使用示波器检查,发现d ...

  8. java面向对象基础知识

    一.面向对象与面向过程的区别: ①所处的角色不同:前者指挥者,后者执行者:②所需知道的事情不同:前者知道哪些是做这些事情的人就可以,不需了解具体的事情操作的过程.后者需要具备应有的技能来做这些事情. ...

  9. 【ActiveMQ】使用学习

    [ActiveMQ]使用学习 转载: 1.启动 activemq start 2.停止 activemq stop http://localhost:8161 admin / admin Queue ...

  10. 【IntelliJ Idea】常用快捷键

    [IntelliJ Idea]常用快捷键 转载:https://www.cnblogs.com/yangchongxing/p/10654018.html ============= 调试 ===== ...