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

news2024/9/30 13:31:51

一、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}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2179738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WSL2Linux 子系统(十一)

WSL 网络改为桥接模式&#xff08;默认NAT) 上一篇文章 《WSL2Linux 子系统(十)》 详细讲述 WSL&#xff08;Windows Subsystem for Linux&#xff09;WSL 显示画面的几种方法。本篇讲述 WSL 网络转为桥接模式的两种方法。 桥接模式允许 WSL 实例获得一个与宿主机在同一子网中…

【包教包会】CocosCreator3.x框架——音频声音模块(无需导入、无需常驻节点)

下载地址&#xff1a;AudioDemo3.x: CocosCreator3.x框架——音频模块 注意事项&#xff1a; 1、gi.musicPlay、gi.soundPlay是同步函数&#xff0c;使用前必须先将音频加载到缓存 Demo通过SceneLoading实现了一个极简的Loading页面&#xff0c;将音频全部加载后进入游戏&…

JAVA智慧社区系统跑腿家政本地生活商城系统小程序源码

智慧社区系统集成跑腿家政与本地生活商城 —— 打造便捷高效的社区生活圈 &#x1f3e0; 智慧社区新时代&#xff1a;一站式服务新体验 在快节奏的都市生活中&#xff0c;智慧社区系统正悄然改变着我们的生活方式。它不再只是一个居住的空间&#xff0c;而是集成了跑腿家政、本…

AI换脸技术新纪元:直播与视频创作的新利器

在数字媒体时代&#xff0c;实时面部交换技术正变得越来越流行。它不仅为视频创作者提供了新的表达方式&#xff0c;也为直播行业带来了革命性的变化。以下是一些目前市场上领先的实时面部交换软件&#xff1a; &#x1f31f; FaceFusion FaceFusion 是一款功能强大的实时面部…

2023ICPC区域赛杭州站

VP链接&#xff1a;Dashboard - The 2023 ICPC Asia Hangzhou Regional Contest (The 2nd Universal Cup. Stage 22: Hangzhou) - Codeforces D. Operator Precedence 一道构造题&#xff0c;将序列构造成 1 2 -1 2 -1 ...... 2 -1 x。根据题目条件&#xff0c;可以推出来 x …

全新带货思路,用AI美女数字人做情感赛道,27天销量1559单

本期就另外分享一个全新的AI美女数字人带货思路&#xff0c;如果你正好对AI视频带货感兴趣&#xff0c;那么本期内容直接给你抹平“视频号上AI美女数字人玩法信息差”&#xff0c;最主要还是趁这类内容还不卷的时候&#xff0c;赶紧行动起来&#xff01; 更多实操教程和数字人工…

智能AI对话绘画二合一网站源码系统 带完整的安装代码包以及搭建部署教程

系统概述 智能AI对话绘画二合一网站源码系统是一款基于先进的人工智能技术开发的综合性网站源码系统。该系统将AI对话功能和AI绘画功能完美融合&#xff0c;用户可以通过简单的对话指令&#xff0c;让系统生成符合要求的绘画作品&#xff0c;或者通过对话了解绘画相关的知识和…

世优科技出席36氪2024具身智能大会圆桌对话,入选创新应用案例

具身智能&#xff0c;作为人工智能领域的前沿分支&#xff0c;聚焦于构建能够通过集成感知与交互机制&#xff0c;在物理环境中实现动态适应与实时互动的智能系统及机器人平台。 9月26日&#xff0c;由36氪主办的“2024具身智能大会”以“让AI通向物理世界”为主题&#xff0c;…

Unity NetCode 客户端连接不上服务器,局域网模式 Failed to connect to server.

报错代码: Failed to connect to server. 报错截图&#xff1a; 解决办法: 服务端:绑定127.0.0.1和端口 客户端:写好对应服务端ip和端口 如何查看服务端所在局域网IP&#xff0c;192.xxx.xxx.xx,就不用教了吧。 注意这个钩&#xff0c;得点下&#xff0c;默认不勾选。 意…

【MYSQL】mysql约束---自增长约束(auto_increment)

1、概念 在Mysql中&#xff0c;当主键为自增长后&#xff0c;这个主键的值就不再需要用户输入数据了&#xff0c;而由数据库系统根据定义自动赋值。每增加一条记录&#xff0c;主键会自动以相同的步长进行增长。 注意&#xff1a;自增长约束通常与主键放在一起使用。 通过给…

AutoGen框架进行多智能体协作—反思与提升博客文章质量(三)

1. 实践场景 两个代理之间通过互相反思以提升博客质量。其中一个代理作为修改意见提出者&#xff0c;另一个代理为写作者。写作者依据要求进行内容创作&#xff0c;评论员则提出修改要求&#xff0c;作者再根据要求对内容进行重新调整。 2. 代码实践 本节学习内容&#xff1a…

一文上手SpringSecurity【八】

RBAC&#xff08;Role-Based Access Control&#xff09;&#xff0c;基于角色的访问控制。通过用户关联角色&#xff0c;角色关联权限&#xff0c;来间接的为用户赋予权限。 一、RBAC介绍 RBAC&#xff08;Role-Based Access Control&#xff09;&#xff0c;即基于角色的访…

Unity实战案例全解析:RTS游戏的框选和阵型功能(3)生成范围检测框 +重置框选操作

前篇&#xff1a;Unity实战案例全解析&#xff1a;RTS游戏的框选和阵型功能&#xff08;2&#xff09; 生成选择框-CSDN博客 本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 我只是对重要功能进行分析和做出笔记分享&#xff0c;并未无师自通&…

UR学习记录

实践 示教器使用 外设使用 抓手&#xff0c;力传感器 开关、气动元件、电磁阀 示教器编写一个完整的抓取放置应用代码 使用示教器变量编写一个相对运动的应用代码 UR坐标表示计算 UR TCP/IP通讯 理论基础 齐次变换 python 矩阵计算&#xff0c;代码示例 import numpy as np…

Gromacs位置限制问题

Atom index n in position_restraints out of bounds A common problem is placing position restraint files for multiple molecules out of order.(一个常见的问题是无序放置多个分子的位置约束文件。)Recall that a position restraint itp (page 449) file containing a …

TDengine 签约国家电投旗下四大火力发电厂,助力汽轮机振动数据的有效管理

在火力发电厂中&#xff0c;汽轮机作为能量转换的核心设备&#xff0c;其稳定性直接关系到电力供应的可靠性和经济效益。因此&#xff0c;对汽轮机状态的监测与维护成为了发电厂日常经营中的重要工作。然而&#xff0c;传统的监测方式受到复杂运行环境和数据处理能力的限制&…

KA客户关系管理策略全解析

在当今商业竞争日益激烈的环境中&#xff0c;如何有效管理和维护关键客户关系成为企业制胜的关键。无论是初创企业还是跨国公司&#xff0c;都面临着同样的挑战&#xff0c;那就是如何通过精准的客户关系管理策略&#xff0c;不仅保留现有客户&#xff0c;还能不断拓展新的商业…

【Git原理与使用】Git初识基本操作

Git初识&&基本操作 1.初识Git2.Git安装3.Git基本操作3.1创建Git本地仓库3.2配置Git3.3认识工作区、暂存区、版本库3.4添加文件3.5修改文件3.6版本回退3.7撤销修改3.8删除文件 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f…

大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Linux 学习笔记(二):深入理解用户管理、运行级别与命令行操作

Linux 学习笔记&#xff08;二&#xff09;&#xff1a;深入理解用户管理、运行级别与命令行操作 前置学习内容&#xff1a;Linux学习&#xff08;一&#xff09; 1. 用户管理 1.1 用户密码管理 创建用户密码 使用 passwd 命令可以为指定用户设置密码&#xff1a; sudo pas…