1-1.Retrofit 简单编码模板(创建接口、配置 Retrofit、创建接口代理对象、发送并处理请求)

一、Retrofit

1、Retrofit 概述
  • Retrofit 是一个网络请求库,专门用于发送 HTTP 请求和处理 HTTP 响应
2、Retrofit 引入
  1. 在 AndroidManifest.xml 文件中添加相关权限,如果是 Android 6.0(API 级别 23)或之后,需要在运行时请求
<uses-permission android:name="android.permission.INTERNET" />
  1. 在模块级 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 使用步骤
  1. 创建接口:创建一个接口,并定义具体的请求方法,使用 Retrofit 提供的注解来描述 HTTP 请求

  2. 配置 Retrofit:使用 Retrofit.Builder 构建出一个 Retrofit 实例对象

  3. 创建接口代理对象:通过 Retrofit 实例对象创建接口的代理对象

  4. 发送并处理请求:调用接口方法发送网络请求,通过回调处理请求结果


二、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 请求
  1. @GET("/test/testGet"):表明该方法发送一个请求路径为 /test/testGet 的 GET 请求

  2. 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}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值