Retrofit 使用简介
Posted liyutian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Retrofit 使用简介相关的知识,希望对你有一定的参考价值。
一,简介
Retrofit 是目前使用广泛的 Http Client 框架,它适用于 android 和 Java。
但需要注意的是,Retrofit 本身并不是一个网络请求框架,而是一个网络请求框架的封装。在 Retrofit 框架中,网络请求不是由 Retrofit 本身来操作的,而是由它的内核(2.x 版本默认内置为 OkHttp)来实现的:
上图就是使用 Retrofit 实现网络请求的流程:
- 首先应用层通过 Retrofit 层来封装请求参数,header,url 等信息
- Retrofit 通过 OkHttp 来完成后续的请求操作
- 服务端处理完请求后,将结果返回给OkHttp层
- 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 使用简介的主要内容,如果未能解决你的问题,请参考以下文章