一,简介

Retrofit 是目前使用广泛的 Http Client 框架,它适用于 Android 和 Java。

但需要注意的是,Retrofit 本身并不是一个网络请求框架,而是一个网络请求框架的封装。在 Retrofit 框架中,网络请求不是由 Retrofit 本身来操作的,而是由它的内核(2.x 版本默认内置为 OkHttp)来实现的:

上图就是使用 Retrofit 实现网络请求的流程:

  1. 首先应用层通过 Retrofit 层来封装请求参数,header,url 等信息
  2. Retrofit 通过 OkHttp 来完成后续的请求操作
  3. 服务端处理完请求后,将结果返回给OkHttp层
  4. OkHttp 层再将原始结果返回给 Retrofit 层,Retrofit 根据用户的需求对结果进行解析

Retrofit使得开发者能专注于请求接口的封装工作,网络请求的工作就交给了OkHttp。

二,使用

1. 定义接口

官网上介绍说 “Retrofit turns your HTTP API into a Java interface.”,Retrofit 会将每一个 Http 的 API 请求转化为一个 Java 接口。

结合官网上的示例,我们可以这样理解这句话的含义:

比如我们现在有一个 API 接口地址为:

https://api.github.com/users/zhangsan/repos

那么我们就可以根据这个 API 地址来定义一个 Java 接口,也就是将这个 API 地址抽象成为了一个 Java 接口:

public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}

在上面这个定义的接口 GithubService 中,有一个被 @GET 注解标识的 listRepos 方法,它表示的是这个 listRepos 方法是一个 GET 请求,并且这 GET 请求的路径为 “user/{user}repos”。这个路径之后会与创建 Retrofit 对象时填写的 baseUrl 拼接起来,形成一个完整的 API 地址。

{user} 这种写法表示的是这部分内容并不是写死的,相当于占位符的作用,它的实际类型则是 listRepos 方法中的参数 (String user),这里传入的是一个 String 类型的参数。所以 {user} 的实际类型是一个字符串。

那么方法参数前的 @Path 注解又是干什么用的呢?

@Path("user") 是一个参数相关的注解,它的作用是:假如传给 listRepos 方法的参数为 null 的话,那么就会使用 “user” 这个字符串当做为默认值代替传入到请求路径中。

List 则表示的从服务器返回的数据,我们将它定义成了一个实体类

2.创建 Retrofit 对象

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();

可以看到 Retrofit 的创建是通过一个 Builder 设计模式来实现的,同时需要指定 baseUrl 的值,与之前定义接口时定义的请求路径一起形成完整的请求地址。

3.使用接口创建「请求对象」

创建完 retrofit 对象之后,通过调用它的 create() 方法来创建 GithubService 接口的实例,之后我们就可以使用 service 实例来进行网络请求了。

GithubService service = retrofit.create(GithubService.class);

Call<List<Repo>> repos = service.listRepos("zhangsan");

接着调用之前定义好的 GtihubService接口的 listRepos 方法将会返回一个 Call 对象,Call 对象代表了被封装的请求和响应,它与 OkHttp 中的语法类似。

4. 通过 Call 对象来发送网络请求

通过 Call 对象就可以发起同步或者异步的网络请求了。

//发起异步请求
repos.enqueue(new Callback<List<Repo>>() {
@Override
public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) { }
@Override
public void onFailure(Call<List<Repo>> call, Throwable t) {
}
});

Retrofit 使用简介的更多相关文章

  1. 开源框架相关面试问题-retrofit网络框架面试问题讲解

    retrofit使用简介: 在retrofit中通过一个接口作为Http请求的api接口.注意:@GET("url")中的url只是一个路径,不包含主机号的. 创建一个retrof ...

  2. [旧][Android] Retrofit 源码分析之 Retrofit 对象

    备注 原发表于2016.04.27,资料已过时,仅作备份,谨慎参考 前言 在上一周学习了一下 Retrofit 的执行流程.接下来的文章要更为深入地学习 Retrofit 的各个类,这次我们先学习一下 ...

  3. Retrofit简介与使用方法(翻译)

    简介 Retrofit 是一个Square开发的类型安全的REST安卓客户端请求库.这个库为网络认证.API请求以及用OkHttp发送网络请求提供了强大的框架.Retrofit库让从web api下载 ...

  4. Retrofit 简介 wiki 文档

    简介 Type-safe HTTP client for Android and Java by Square, Inc. GitHub主页:https://github.com/square/ret ...

  5. 【转】GitHub 排名前 100 的安卓、iOS项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  6. GitHub Android Libraries Top 100 简介

    本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过 ...

  7. 2016年GitHub 排名前 100 的安卓、iOS项目简介(收藏)

    排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不相关的项目, 所以排名并不具备任何官方效力, 仅供参考学习, 方便初学者 ...

  8. 64.GitHub 排名前100的android项目简介

    GitHub Android Libraries Top 100 简介 排名完全是根据 GitHub 搜索 Java 语言选择 (Best Match) 得到的结果, 然后过滤了跟 Android 不 ...

  9. RxJava简介

    RxJava简介 本文为前段时间学习RxJava时留下的历史遗留笔记,仅作纪念,科学的大神教学帖子在这里-> 给 Android 开发者的 RxJava 详解 通过链式调用序列实现基于事件流的异 ...

随机推荐

  1. requests 抓取网站

    import requests from requests.exceptions import RequestException import re import json def get_one_p ...

  2. 卡尔曼(Kalman)滤波及十种数据采集滤波的方法和编程实例

    卡尔曼(Kalman)滤波:https://blog.csdn.net/CSDN_X_W/article/details/90289021 十种数据采集滤波的方法和编程实例:https://wenku ...

  3. Databus&canal对比

    Databus和canal都能够提供实时从数据库获取变更,并提供给下游的实时消费流的功能. 本文针对两个系统实现和应用上的不同点,做了一个简单的对比: 对比项 Databus canal 结论 支持的 ...

  4. MongoDB学习笔记,基础+增删改查+索引+聚合...

    一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...

  5. mysql数据库:分表、多表关联、外键约束、级联操作

    一.分表.外键.级联.多对一 二.多对多 三.一对一 一.分表.外键.级联.多对一 将部门数据与员工数据放到同一张表中会造成 数据重复 结构混乱 扩展维护性差 需要分表 create table de ...

  6. 7.控制计划任务crontab命令

    at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的Linux 系统上面原本就有非常多的计划 性工作,因此这个系统服务是默认 ...

  7. 卸载CUDA和cuDNN

    卸载CUDA和cuDNN 1.卸载CUDA 本教程只针对对于.run方式安装的,其他的没有进行测试 打开终端,输入sudo /usr/local/cuda-10.0/bin/uninstall_cud ...

  8. 【vuex】mutation和action的区别

    const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } ...

  9. unzip解压3G或者4G以上文件失败的解决方法

    Linux下,使用unzip解压时,报错:End-of-central-directory signature not found.  Either this file is nota zipfile ...

  10. USRPX310 在GNU Radio上更改通道A或B

    UHD:USRP sink和USRP source默认是A通道发射接收.或设置 Mb0:Subdev Spec: A:0 更改为B通道收发:设置 Mb0:Subdev Spec: B:0