1、什么是 Retrofit?
答案
Retrofit 是 Square 开源的 Android 网络封装框架 ,是对 OkHttp 上层的封装。
注解方式定义网络接口,自动做请求封装、参数拼接、JSON 自动解析,配合协程、RxJava 使用,简化网络代码。
2、Retrofit 和 OkHttp 的关系
答案
- OkHttp:真正底层做 TCP/HTTP 请求、Socket 通信、连接池、缓存、拦截器。
- Retrofit :只是上层封装框架 ,不直接发网络请求,底层完全依赖 OkHttp。一句话:Retrofit 管语法和解析,OkHttp 管真正发请求。
3、Retrofit 核心原理
答案
- 编译期通过注解解析接口方法、请求方式、参数、地址;
- 运行时通过 动态代理 生成接口的代理对象;
- 把接口方法参数、注解,拼成 OkHttp 的 Request;
- 交给 OkHttp 执行网络请求;
- 拿到 Response 后,通过 转换器 自动解析成实体类。
核心三点:注解 + 动态代理 + 转换器
4、为什么要用 Retrofit,不用原生 OkHttp?
答案
- 接口用注解定义,不用手写拼接 Url、Header、参数;
- 自动 JSON 解析,不用手动 Gson 解析;
- 支持协程、RxJava,代码更简洁;
- 统一配置、全局 BaseUrl、超时、拦截器;
- 结构规范,适合大型项目架构分层。
5、Retrofit 常用注解分类
答案
- 请求方法注解GET、POST、PUT、DELETE、HEAD、PATCH
- 路径注解@Url、@Path 路径替换
- 参数注解@Query 拼接 url 参数@Field 表单参数@Body 请求体 JSON
- 请求头注解@Header、@Headers 静态 / 动态请求头
- 表单、文件上传@FormUrlEncoded、@Multipart、@Part、@PartMap
6、@Query 和 @Field 区别
答案
- @Query :拼接在 URL 后面 问号参数,Get 请求常用。
- @Field :放在 请求体表单 里,Post 表单提交,必须配合
@FormUrlEncoded。
7、@Body 和 @Field 区别
答案
- @Body :传 JSON 对象,放在请求体,后端接收 JSON。
- @Field :表单键值对,Content-Type 是 form 表单。
8、Retrofit 动态代理作用
答案
我们只写 接口 + 注解,不写实现类;
Retrofit 通过 动态代理 自动生成接口实现类,拦截方法调用,解析注解、组装请求,不用开发者手写实现逻辑。
9、Retrofit 转换器工厂是干嘛的
答案 把 OkHttp 原始 Response 自动转成实体类。常用:
- GsonConverterFactory 自动 JSON 解析
- ScalarsConverterFactory 支持 String 原始返回
- RxJava3CallAdapterFactory 适配 RxJava
- KotlinCoroutine 适配协程
10、CallAdapterFactory 作用
答案
用来适配返回值类型:
- 默认返回 Call
- 用 RxJava 适配器可以返回 Observable、Single
- 协程适配可以直接返回 suspend 函数、Flow
11、Retrofit 中 BaseUrl 注意事项
答案
- BaseUrl 必须以 / 结尾;
- 接口里 @Url 如果写全路径,会覆盖 BaseUrl;
- 多 BaseUrl 可以用 @Url 动态传全地址 或者自定义域名解析器。
12、Retrofit 怎么配置全局拦截器
答案
Retrofit 不能直接加拦截器,要先配置 OkHttpClient,在 OkHttp 里添加拦截器,再把 OkHttp 注入 Retrofit。
日志、公共请求头、Token 刷新都写在 OkHttp 拦截器里。
13、Retrofit 支持协程原理
答案
- 接口方法加 suspend 挂起函数;
- Retrofit 内部适配协程 CallAdapter;
- 网络请求在子线程执行,完成后自动切回主线程;
- 可以直接用 try-catch 处理异常,不用回调。
14、Retrofit 能不能适配 LiveData、Flow
答案
可以。
通过自定义 CallAdapter,把返回值包装成 LiveData、Flow,接口直接返回 Flow,配合 ViewModel 直接观察 UI 状态。
15、Retrofit 优缺点
答案优点:
- 注解化接口,代码简洁规范;
- 自动 JSON 解析;
- 完美适配协程、RxJava;
- 底层 OkHttp 拥有连接池、缓存、超时、拦截器能力;
- 易于全局统一配置、分层架构。
缺点:
-
注解多,新手难懂;
-
编译期注解会稍微增加编译时间;
-
底层依赖 OkHttp,不能脱离 OkHttp 单独使用。
16、Retrofit 中同步和异步请求
答案
- 普通 Call 对象:execute () 同步、enqueue () 异步
- 协程 suspend 方法:直接调用就是异步,内部自动切子线程。
17、Retrofit 怎么实现文件上传
答案
- 加注解 @Multipart
- 用 @Part 传 File / RequestBody
- 支持多文件同时上传底层还是 OkHttp 做 Multipart 表单封装。
18、Retrofit 怎么统一处理网络异常
答案
- 封装 BaseRepository 统一 try-catch 协程异常;
- 自定义拦截器统一处理 401 Token 过期、错误码;
- 统一封装返回实体类,解析业务错误码。
19、Retrofit 动态替换 BaseUrl 怎么做
答案
三种方式:
- 接口方法用 @Url 传入完整域名地址;
- 自定义 Retrofit 域名解析器拦截域名;
- 多个 Retrofit 实例分别对应不同 BaseUrl。
20、面试一句话总结(必背)
Retrofit 是基于 OkHttp 上层的注解式网络框架,依靠注解 + 动态代理自动生成网络请求,通过转换器自动解析 JSON,适配器适配协程和 RxJava;本身不发网络请求,只做请求封装和适配,全局依赖 OkHttp 的连接池、拦截器、超时配置,是 Android 项目标准网络架构标配。