Retrofit 使用简介

一,简介

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) {
    }
});
posted @ 2018-09-24 21:51  Helldorado  阅读(579)  评论(0编辑  收藏  举报