一、Retrofit
1、Retrofit 概述
- Retrofit 是一个网络请求库,专门用于发送 HTTP 请求和处理 HTTP 响应
2、Retrofit 引入
- 在 AndroidManifest.xml 文件中添加相关权限,如果是 Android 6.0(API 级别 23)或之后,需要在运行时请求
<uses-permission android:name="android.permission.INTERNET" />
- 在模块级
build.gradle
中引入相关依赖
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
implementation 'io.reactivex:rxandroid:1.2.0'
3、Retrofit 使用步骤
-
创建接口:创建一个接口,并定义具体的请求方法,使用 Retrofit 提供的注解来描述 HTTP 请求
-
配置 Retrofit:使用
Retrofit.Builder
构建出一个 Retrofit 实例对象 -
创建接口代理对象:通过 Retrofit 实例对象创建接口的代理对象
-
发送并处理请求:调用接口方法发送网络请求,通过回调处理请求结果
二、Retrofit 初体验
1、Server
- MyTestController.java
@Controller
@ResponseBody
@RequestMapping("/myTest")
@CrossOrigin
public class MyTestController {
@GetMapping("testGet")
public Staff testGet() {
Staff staff = new Staff(1, "jack", 10);
return staff;
}
}
2、Client Api
- ApiService.java
public interface ApiService {
@GET("/test/testGet")
Call<String> testGet();
}
3、Client Test
- MainActivity.java
// 日志拦截器
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);
OkHttpClient okHttpClient = okHttpClientBuilder.build();
// 构建 Retrofit 对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.10:9999")
.client(okHttpClient)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create()) // 解析实体类
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
.build();
ApiService apiService = retrofit.create(ApiService.class);
apiService.testGet().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String result = response.body();
Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
}
});
- 输出结果
D/OkHttp: --> GET http://192.168.0.10:9999/test/testGet http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 http://192.168.0.10:9999/test/testGet (96ms)
D/OkHttp: Vary: Origin
D/OkHttp: Vary: Access-Control-Request-Method
D/OkHttp: Vary: Access-Control-Request-Headers
D/OkHttp: Content-Type: text/plain;charset=UTF-8
D/OkHttp: Content-Length: 19
D/OkHttp: Date: Sun, 29 Sep 2024 13:07:40 GMT
D/OkHttp: Keep-Alive: timeout=60
D/OkHttp: Connection: keep-alive
D/OkHttp: testGet Hello World
D/OkHttp: <-- END HTTP (19-byte body)
I/MainActivity: ------------------------------ 请求成功,结果为:testGet Hello World
三、Retrofit 初体验案例解析
1、创建接口
- 创建一个接口,并定义具体的请求方法,使用 Retrofit 提供的注解来描述 HTTP 请求
-
@GET("/test/testGet")
:表明该方法发送一个请求路径为/test/testGet
的 GET 请求 -
Call<String> testGet();
:表明该请求的响应的响应体应该被解析成 String
public interface ApiService {
@GET("/test/testGet")
Call<String> testGet();
}
2、配置 Retrofit
- 使用
Retrofit.Builder
构建出一个 Retrofit 实例对象
// 日志拦截器
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
okHttpClientBuilder.addInterceptor(httpLoggingInterceptor);
OkHttpClient okHttpClient = okHttpClientBuilder.build();
// 构建 Retrofit 对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.10:9999")
.client(okHttpClient)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create()) // 解析实体类
.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 结合 RxJava
.build();
3、创建接口代理对象
- 通过 Retrofit 实例对象创建接口的代理对象
ApiService apiService = retrofit.create(ApiService.class);
4、发送并处理请求
- 调用接口方法发送网络请求,通过回调处理请求结果
apiService.testGet().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String result = response.body();
Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
}
});
四、Retrofit 基础请求编码
1-1、GET 请求
(1)Server
- MyTestController.java
@GetMapping("/testGet")
public String testGet() {
return "testGet Hello World";
}
(2)Client Api
- ApiService.java
@GET("/test/testGet")
Call<String> testGet();
(3)Client Test
- MainActivity.java
apiService.testGet().enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String result = response.body();
Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
}
});
- 输出结果
D/OkHttp: --> GET http://192.168.0.10:9999/test/testGet http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 http://192.168.0.10:9999/test/testGet (96ms)
D/OkHttp: Vary: Origin
D/OkHttp: Vary: Access-Control-Request-Method
D/OkHttp: Vary: Access-Control-Request-Headers
D/OkHttp: Content-Type: text/plain;charset=UTF-8
D/OkHttp: Content-Length: 19
D/OkHttp: Date: Sun, 29 Sep 2024 13:07:40 GMT
D/OkHttp: Keep-Alive: timeout=60
D/OkHttp: Connection: keep-alive
D/OkHttp: testGet Hello World
D/OkHttp: <-- END HTTP (19-byte body)
I/MainActivity: ------------------------------ 请求成功,结果为:testGet Hello World
1-2、GET 请求(带参)
(1)Server
- MyTestController.java
@GetMapping("/testGetCarryData")
public String testGetCarryData(@RequestParam("str") String str) {
return "testGetCarryData " + str;
}
(2)Client Api
- ApiService.java
@GET("/test/testGetCarryData")
Call<String> testGetCarryData(@Query("str") String str);
(3)Client Test
- MainActivity.java
apiService.testGetCarryData("12345").enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
String result = response.body();
Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
}
});
- 输出结果
D/OkHttp: --> GET http://192.168.0.10:9999/test/testGetCarryData?str=12345 http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 http://192.168.0.10:9999/test/testGetCarryData?str=12345 (98ms)
D/OkHttp: Vary: Origin
D/OkHttp: Vary: Access-Control-Request-Method
D/OkHttp: Vary: Access-Control-Request-Headers
D/OkHttp: Content-Type: text/plain;charset=UTF-8
D/OkHttp: Content-Length: 22
D/OkHttp: Date: Sun, 29 Sep 2024 13:38:41 GMT
D/OkHttp: Keep-Alive: timeout=60
D/OkHttp: Connection: keep-alive
D/OkHttp: testGetCarryData 12345
D/OkHttp: <-- END HTTP (22-byte body)
I/MainActivity: ------------------------------ 请求成功,结果为:testGetCarryData 12345
1-3、GET 请求(RESTFul)
(1)Entity
- User.java
public class User {
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
(2)Server
- MyTestController.java
@GetMapping("/testGetRestful/{id}")
public User testGetRestful(@PathVariable Integer id) {
HashMap<Integer, User> userMap = new HashMap<>();
userMap.put(1, new User(1, "jack", 10));
userMap.put(2, new User(2, "tom", 20));
userMap.put(3, new User(3, "smith", 30));
return userMap.get(id);
}
(3)Client Api
- ApiService.java
@GET("/test/testGetRestful/{id}")
Call<User> testGetRestful(@Path("id") int id);
(4)Client Test
- MainActivity.java
apiService.testGetRestful(1).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
User result = response.body();
Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
}
});
- 输出结果
D/OkHttp: --> GET http://192.168.0.10:9999/test/testGetRestful/1 http/1.1
D/OkHttp: --> END GET
D/OkHttp: <-- 200 http://192.168.0.10:9999/test/testGetRestful/1 (50ms)
D/OkHttp: Vary: Origin
D/OkHttp: Vary: Access-Control-Request-Method
D/OkHttp: Vary: Access-Control-Request-Headers
D/OkHttp: Content-Type: application/json
D/OkHttp: Transfer-Encoding: chunked
D/OkHttp: Date: Sun, 29 Sep 2024 13:52:11 GMT
D/OkHttp: Keep-Alive: timeout=60
D/OkHttp: Connection: keep-alive
D/OkHttp: {"id":1,"name":"jack","age":10}
D/OkHttp: <-- END HTTP (31-byte body)
I/MainActivity: ------------------------------ 请求成功,结果为:User{id=1, name='jack', age=10}
2、POST 请求
(1)Entity
- User.java
public class User {
private int id;
private String name;
private int age;
public User() {
}
public User(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
(2)Server
- MyTestController.java
@PostMapping("/testPost")
public User testPost(@RequestBody User user) {
HashMap<Integer, User> userMap = new HashMap<>();
userMap.put(1, new User(1, "jack", 10));
userMap.put(2, new User(2, "tom", 20));
userMap.put(3, new User(3, "smith", 30));
return userMap.get(user.getId());
}
(3)Client Api
- ApiService.java
@POST("/test/testPost")
Call<User> testPost(@Body User user);
(4)Client Test
- MainActivity.java
User user = new User();
user.setId(1);
apiService.testPost(user).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
User result = response.body();
Log.i(TAG, "------------------------------ 请求成功,结果为:" + result);
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.i(TAG, "------------------------------ 请求失败:" + t.getMessage());
}
});
- 输出结果
D/OkHttp: --> POST http://192.168.0.10:9999/test/testPost http/1.1
D/OkHttp: Content-Type: application/json; charset=UTF-8
D/OkHttp: Content-Length: 16
D/OkHttp: {"age":0,"id":1}
D/OkHttp: --> END POST (16-byte body)
D/OkHttp: <-- 200 http://192.168.0.10:9999/test/testPost (72ms)
D/OkHttp: Vary: Origin
D/libMEOW: rebuild call chain: 0xb400007288fafcc0
D/OkHttp: Vary: Access-Control-Request-Method
D/OkHttp: Vary: Access-Control-Request-Headers
D/OkHttp: Content-Type: application/json
D/OkHttp: Transfer-Encoding: chunked
D/OkHttp: Date: Sun, 29 Sep 2024 13:54:29 GMT
D/OkHttp: Keep-Alive: timeout=60
D/OkHttp: Connection: keep-alive
D/OkHttp: {"id":1,"name":"jack","age":10}
D/OkHttp: <-- END HTTP (31-byte body)
I/MainActivity: ------------------------------ 请求成功,结果为:User{id=1, name='jack', age=10}