Retrofit 学习记录(一)

本文介绍Retrofit的基础使用方法,包括接口定义、请求路径配置及参数传递等,通过实例展示如何发起GET请求并处理响应。

Retrofit

说起 Retrofit,我真是头大,工作了一年了,还只会用 OKHttp 去做网络请求,由于自己注解没学好,所以对 Retrofit 一直都有点畏惧,但是没办法,现在 Retrofit 都是主流的网络请求了,所以难啃也得啃。毕竟工作了一年多了,说自己不会 Retrofit + RxJava 好像不太合适,那就来吧。

对 Retrofit 是什么东西,就不介绍了。反正大家都说好用,不信你用着试试。

入门

先来个简单的入门吧。首先定义一个接口,在接口里面定义一个方法。你只需要知道,Retrofit 所有的网络请求方法都是定义在接口内部的。

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

这里有一个 @GET 注解,表示该方法请求是一个 Get 请求,我们都知道常用的请求方式有两种, Get 请求和 Post 请求,那么这里的 @GET 就代表的 Get 请求。

你可能还注意到了,@GET 注解后面带有一大串狗屎一样的东西,别急,我们来慢慢解释,“users/{user}/repos” 这实际上是一个子路径, 它最后是要和基路径拼接在一起才能形成一个完整的请求路径的,可能有人会问,我这里没有看到基路径啊,嘿,小伙子,别急,基路径你会看到的,只不过不是这里。

既然能够理解 “users/{user}/repos ” 是一个子路径,那么你肯定会觉得 “{user}” 这个东西不正常,因为正常的请求怎么可能会带有这个东西?没错,这个东西实际上是一个占位符。知道什么是占位符吧?举个例子,如果我们请求的基路径是 “http://www.baidu.com” ,那么我们调用 listRepos 这个方法实际上请求的完整路径就是 “http://www.baidu.com/users/{user}/repos” ,这里的占位符用 listRepos 这个方法传进来的参数来替代,也就是 listRepos(@Path(“user”) String user) 中的 user,先暂时忽略 @Path(“user”) 这个注解。如果我们传递进来的 user 参数是 tom, 那么完整请求路径就是

http://www.baidu.com/users/tom/repos

如果我们传递进来的 user 参数是 jack,那么完整的请求路径就是

http://www.baidu.com/users/jack/repos

说道这里了,我想你应该明白了。那么我们接着说一下 @Path(“user”) 这个注解,你上面也看到了,我们的请求路径中有一个 {user} 是占位符,因为是请求路径中有占位符,所以我们这里需要用注解 @Path 来标明我们的路径中的占位符是用这里的参数来替代的,@Path(“user”) 中的 “user” 就代表我们路径中的占位符 {user} 中的 user。

好了,说到这里,方法的定义就说完了,下面我们说说方法的实现。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://api.github.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

RetrofitApi retrofitApi = retrofit.create(RetrofitApi.class);

Call<List<Repo>> call = retrofitApi.listRepos("octocat");

call.enqueue(new Callback<List<Repo>>() {
        @Override
        public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
             String name = response.body().get(0).getName();
             Toast.makeText(RxJavaActivity.this, "第一个列表中的用户名为:" + name, 
                 Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(Call<List<Repo>> call, Throwable t) {

        }
    });

我们上面不是说了基路径和子路径拼接起来就成了一个完整的路径么?从上面的代码我们可以知道,基路径就是 baseUrl(“http://api.github.com/“) 中的 http://api.github.com/

注意:基路径必须以 “/” 结尾,否则会报错。

综合我们上面的讲解来看,完整的请求路径应该是

http://api.github.com/users/{user}/repos

因为我们传入的 user 参数是 “octocat”, 所以最后我们应用程序请求的完整路径就出来了

http://api.github.com/users/octocat/repos

这就是一个最简单,最基础的 Retrofit 网络请求。演示结果如下:
Retrofit 不带参数的 GET 请求

我们轻而易举的拿到了列表中第一个人的用户名。你肯定看到了,我们对拿到的结果并没有做任何的处理,就可以直接根据 response 对象直接拿到实体类中的属性值,为什么呢?当然这都要得益于我们在创建 Retrofit 对象的时候添加了(Gson 解析转换工厂,这里用到了工厂模式)

.addConverterFactory(GsonConverterFactory.create())

这样一行代码,这行代码直接指定了 Retrofit 在拿到结果后,直接跟我们对结果进行解析,返回给我们的是实体类对象。是不是很 6 ? 帮我们把解析的过程都做了,简直不能太 6。当然你也可以在后面添加其他的转换工厂,链式编程就是这么炸,至于其他工厂,我们在这里暂时不做过多说明。

请求附带参数

上面我们说了一个最简单的 GET 请求,不带任何参数说明,万一我们的请求需要携带参数呢?举个例子,比如登录的请求

http://www.baidu.com/login?username='xxx'&password='123456'

像这样的请求,我们对参数如何处理呢?
这里我们需要添加另外一个注解 Query

那我们就来试试怎么样使用 Query 注解,并且结合我们上面所讲的 Path 注解一起使用

首先在接口中定义一个方法

 @GET("users/{user}/repos")
 Call<List<Repo>> getGroupList(
            @Path("user") String user, 
            @Query("sort") String sort);

@Query(“sort”) 中的 sort 就是在路径后面拼接的查询参数,假如基路径为:

http://api.github.com

Path 替代参数是 octcota,Query 拼接传入的参数是 20,所以我们上面的完整请求路径应该是

http://api.github.com/users/octcota/repos?sort=20

那我们上面说的登录的案例就可以写成

@GET("login")
Call<String> login(@Query("username") String username, @Query("password") String password)

是不是贼 6 ?

这里的 Call 可以先理解成返回值,等到时候和 RxJava 结合起来一起使用的时候,我们的返回值将不再是 Call。

### 关于 Retrofit 网络框架的学习教程和使用指南 #### 1. Retrofit 基础概念 Retrofit个由 Square 开发的类型安全 HTTP 客户端,专为 Android 和 Java 平台设计。它的主要作用是对网络请求的功能进行了高度封装,简化了开发者的工作流程[^3]。 #### 2. 添加依赖项 为了在项目中使用 Retrofit,需要先将其作为依赖引入到项目的 `build.gradle` 文件中。以下是官方推荐的方式: ```gradle implementation 'com.squareup.retrofit2:retrofit:2.9.0' ``` 如果需要额外的支持(如 JSON 解析),还可以加入相应的转换器支持库,例如 Gson 转换器或 FastJson 转换器: ```gradle // 使用Gson转换器 implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 使用FastJson转换器 implementation 'com.github.scribejava:retrofit-spring-boot-starter:版本号' // 需要替换具体版本号[^2] ``` #### 3. 创建请求接口 定义个接口来描述 API 请求的行为。通过注解指定请求的方法(GET/POST)、URL 参数以及其他细节。以下是个简单的例子: ```java public interface ApiService { @GET("translate") // 对应金山词霸API路径 Call<TranslationResponse> translate(@Query("q") String query); } ``` 这里展示了如何利用 `@GET` 注解发送 GET 请求,并传递查询参数给服务器[^1]。 #### 4. 初始化 Retrofit 实例并调用服务 初始化 Retrofit 类时需提供基础 URL 地址和服务类对象工厂方法。之后可以通过该实例获得之前声明的服务接口实现体。 ```java Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") // 设置基础url .addConverterFactory(GsonConverterFactory.create()) // 指定JSON解析工具 .build(); ApiService apiService = retrofit.create(ApiService.class); // 获取接口代理对象 Call<TranslationResponse> call = apiService.translate("你好世界"); call.enqueue(new Callback<TranslationResponse>() { ... }); // 异步执行回调逻辑 ``` #### 5. 处理响应数据结构 通常情况下,返回的数据会被映射成自定义实体类的形式。比如对于翻译结果可以这样建模: ```java public class TranslationResponse { private String translatedText; public String getTranslatedText() { return this.translatedText; } } ``` 以上代码片段说明了个典型的 RESTful Web Service 的客户端开发过程[^3]。 #### 6. 扩展功能介绍 除了基本的同步与异步请求外,还能够结合其他强大的技术栈起工作,像协程 (Kotlin Coroutines),反应式编程(RxJava)[^4]等都可以极大地提高程序性能及用户体验度。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值