
三三要成为安卓糕手
一:Retrofit2介绍
1:背景介绍
Retrofit 也是由 Square 公司开发的一个强大且易用的网络请求库,专门用于 Android 和 Java 应用程序。它基于 OkHttp,提供了一种更高层次的抽象,帮助开发者简化 RESTful API(网络接口)调用和解析响应数据的流程。但是在2016年后Square把它升级成了Retrofit2,这让Retrofit在处理网络请求的过程中更方便。
2:依赖添加
java
//在gradle中添加依赖
com.squareup.retrofit2:retrofit:2.11.0
//Retrofit2内部可以直接使用GSON做数据解析,如果有需要,就添加Gson转换器
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
//添加一个Retrofit2中包装好的Json封装;用于传递转换器使用
com.squareup.retrofit2:converter-gson:2.11.0
二:根据请求文档定义接口
1:接口设计
请求URL

请求Query参数

2:代码
archive 英 ['ɑ:kaɪvz] 档案
java
public interface ApiService {
//定义了网络请求接口,指定了请求方式GET、指定URL路径、指定查询参数、指定返回的结果实体类对象
//自动补全?http://titok.fzqq.fun/addons/cms/api.user/userInfo?user_id=4&type=archives
@GET("http://titok.fzqq.fun/addons/cms/api.user/userInfo")
Call<UserInfoQuery> getUserInfo(
@Query("user_id") String user_id ,
@Query("type") String type);
@POST("http://titok.fzqq.fun/addons/cms/api.login/login")
Call<ResLogin> login(@Body ReqLogin login);
}
(1)Call导包

(2)服务端返回的类

原来服务端返回的是json字符串,Retrofit2直接帮我们封装好了;对比下图中OkHttp的操作,还需要我们自己进行json字符串转换为UserInfoQuery这种操作

总结:ApiService
是手动定义的 "网络请求接口" ,里面用 Retrofit 注解(@GET
/@POST
等)描述了所有 API 的请求细节(URL、参数、请求方法等)。
三:GET请求细节说明
java
/**
* 发起get请求
*/
private void sendGetRequest() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://titok.fzqq.fun/")
.addConverterFactory(GsonConverterFactory.create())//配置一个Gson转换器
.build();
ApiService apiService = retrofit.create(ApiService.class);
String userId = etUserId.getText().toString();
Call<UserInfoQuery> queryCall = apiService.getUserInfo(userId, "archives");
queryCall.enqueue(new Callback<UserInfoQuery>() {
@Override
public void onResponse(Call<UserInfoQuery> call, Response<UserInfoQuery> response) {
//Retrofit2中已经把返回回来的JSON字符串转换成Java类对象UserInfoQuery了
UserInfoQuery body = response.body();
String nickname = body.getData().getUser().getNickname();
Toast.makeText(Retrofit2Activity.this,"查询到:" + nickname , Toast.LENGTH_SHORT).show();
Log.i(TAG, "onResponse: " + nickname);
}
@Override
public void onFailure(Call<UserInfoQuery> call, Throwable throwable) {
Toast.makeText(Retrofit2Activity.this,"请求失败",Toast.LENGTH_SHORT).show();
}
});
}
1:流程梳理
创建 Retrofit 实例
- 通过
Retrofit.Builder()
构建器配置基础参数 - 指定
baseUrl
为请求的基础地址(http://titok.fzqq.fun/
) - 添加 Gson 转换器(
GsonConverterFactory
),用于自动将 JSON 响应转换为 Java 对象
创建 API 服务接口实例
- 通过
retrofit.create(ApiService.class)
生成 ApiService 接口的实现类对象 - ApiService 中定义了具体的接口请求方法(这里使用的是
getUserInfo
方法)
准备请求参数
- 从输入框
etUserId
获取用户输入的 userId - 调用
apiService.getUserInfo()
方法,传入 userId 和固定参数 "archives",得到一个Call<UserInfoQuery>
对象 - 这个 Call 对象代表了一次网络请求
发起异步请求
- 调用
queryCall.enqueue()
方法发起异步请求(不会阻塞 UI 线程) - 传入
Callback<UserInfoQuery>
回调接口处理请求结果
处理请求结果
-
当请求成功时,
onResponse
方法被调用:- 通过
response.body()
获取转换后的 Java 对象UserInfoQuery
- 从返回对象中提取用户昵称(nickname)
- 显示 Toast 提示查询结果,并通过 Log 输出信息
- 通过
-
当请求失败时,
onFailure
方法被调用:- 显示 "请求失败" 的 Toast 提示
2:动态代理
retrofit.create(ApiService.class)
:
Retrofit 会通过 动态代理(Dynamic Proxy) 技术,自动生成 ApiService
接口的具体实现类
这个实现类里,会把你在 ApiService
中定义的注解(@GET
、@Path
等),转化为实际的 HTTP 请求逻辑(拼接 URL、设置参数、执行请求等)
3:转换器代理工厂
添加一个结果的转换器;我们想要使用一个工具对服务端返回回来的结果做json转换,这里直接new Gson是不行的
服务器返回给我们的是一个字符串,想用Gson处理,但是这里不能传递一个Gson对象;添加一个Retrofit2中包装好的Json封装
4:结果


四:Retrofit2发起POST请求
java
/**
* 发起post请求
*/
private void sendPostRequest() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://titok.fzqq.fun/")
.addConverterFactory(GsonConverterFactory.create())//配置一个Gson转换器
.build();
ApiService apiService = retrofit.create(ApiService.class);
String account = etUserName.getText().toString();
String password = etPassword.getText().toString();
Call<ResLogin> loginCall = apiService.login(new ReqLogin(account, password));
loginCall.enqueue(new Callback<ResLogin>() {
@Override
public void onResponse(Call<ResLogin> call, Response<ResLogin> response) {
ResLogin resLogin = response.body();
if(response.isSuccessful() && resLogin.getCode() == 1){
Toast.makeText(Retrofit2Activity.this , "欢迎你,"
+ response.body().getData().getUser_id() , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(Retrofit2Activity.this,response.message(),Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<ResLogin> call, Throwable throwable) {
Toast.makeText(Retrofit2Activity.this, "网络请求失败", Toast.LENGTH_SHORT).show();
}
});
}
在onResponse和onFailure两个方法中的代码默认是在主线程中使用,这也是Retrofit2的便捷之处
1:正常登录

请求成功code 为 1

2:用户名或密码错误
注:在登录时我们应该考虑到多种场景,增加判断条件,避免程序崩溃

3:空参数传值
直接发起POST请求,啥参数都不写,或者有一项为空;根据"OK"这个弹窗来说,http本身这个请求是成功的

