Retrofit类型安全的HTTP客户端库

news2024/11/28 18:59:36

简介

        Retrofit是Square公司开发的一个类型安全的HTTP客户端库,用于Android和Java平台,它使得与Web服务的交互变得更加简单快捷。Retrofit将HTTP API转换成Java接口,让你可以用更简洁的代码形式调用RESTful API,Android网络编程重点之一,基于互联网,从服务器上获取数据。

一、添加依赖(资源包)

首先,在你的build.gradle.kts(Module级别)文件中添加Retrofit的依赖:

在versions中添加名称及版本

retrofit = "2.9.0"
gson="2.9.0"

在libraries中添加到相应的地址,包名,配置管理

retrofit = {group = "com.squareup.retrofit2", name ="retrofit",version.ref = "retrofit"}
gson={group="com.squareup.retrofit2",name="converter-gson",version.ref="gson"}

最后在"dependencies"(依赖关系)中添加上文中的名称

implementation(libs.retrofit)
    implementation(libs.gson)

二、定义API接口

创建一个接口来描述Web服务的端点。Retrofit会根据这个接口生成实现类。

原理:

public interface ApiService {
    @GET("users/{user}/repos")
    Call<List<Repo>> listRepos(@Path("user") String user);
}

实例:

public interface WHttp {
    @GET("api/weather/city/{id}")
    Call<ReSon> getCall(@Path("id") String id);
}

创建 Retrofit 实例

        创建一个接口来描述Web服务的端点。Retrofit会根据这个接口生成实现类。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .addConverterFactory(GsonConverterFactory.create()) // 如果你使用Gson解析JSON
    .client(new OkHttpClient())
    .build();

这里,@GET注解指定了HTTP的GET方法,{user}是一个动态部分,将由@Path注解的参数填充。

三、创建服务接口的实例

创建实例:

使用Retrofit实例来创建API接口的实例,并用gson中的addConverterFactory()方法解析数据

四、发送请求:

创建Retrofit服务接口实例

WHttp wHttp = retrofit.create(WHttp.class);

这一行代码通过Retrofit实例创建了一个名为WHttp的服务接口实现。WHttp接口应该事先定义好,包含了一些用于定义HTTP请求的方法,比如这里的getCall方法。

构建请求

Call<ReSon> call = wHttp.getCall("101260101");

调用WHttp接口中的getCall方法,并传入参数"101260101"(这个参数根据实际接口需求可能代表某种ID或查询条件)。这个操作返回一个类型为Call<ReSon>的对象,表示一个即将发出的HTTP请求,目的是获取一个ReSon类型的响应数据。

异步执行请求enqueue

call.enqueue(new Callback<ReSon>() {
    //...
});

使用enqueue方法异步发送请求。它不会阻塞当前线程,适合在主线程中调用,避免UI冻结。

onResponse
@Override
public void onResponse(Call<ReSon> call, Response<ReSon> response) {
    ReSon reSon = (ReSon) response.body();
    textView.setText(reSon.getDate());
}

        当请求成功完成并且服务器返回一个成功的响应(HTTP状态码在200-299之间)时,onResponse方法会被调用。通过response.body()获取到服务器返回的ReSon对象,然后从中提取数据(这里假设ReSon类有一个getDate方法用于获取日期信息),并将这个信息设置到一个名为textView的TextView控件中显示。

onFailure
@Override
public void onFailure(Call<ReSon> call, Throwable t) {
    textView.setText("错误" + t);
}

        如果请求过程中出现错误,比如网络问题、超时、服务器无响应等,onFailure方法会被触发。这里简单地将错误信息以文本形式显示在textView中,实际应用中可能需要更细致的错误处理,比如根据错误类型给出不同的提示信息,或者进行重试逻辑等。

总的来说,这段代码演示了如何使用Retrofit发送一个异步HTTP请求,处理成功响应和失败情况的基本模式。

五、最总代码:

WHttp wHttp = retrofit.create(WHttp.class);
                Call<ReSon> call = wHttp.getCall("101260101");
               call.enqueue(new Callback<ReSon>() {
                   @Override
                   public void onResponse(Call<ReSon> call, Response<ReSon> response) {
                       ReSon reSon =  response.body();
                       textView.setText(reSon.getDate());
                   }

                   @Override
                   public void onFailure(Call<ReSon> call, Throwable t) {
                       textView.setText("错误"+t);
                   }
               });

六、网络安全错误

        该错误信息表明您的应用程序尝试与域名t.weather.itboy.net建立网络连接时,被网络安全策略阻止了。这通常是因为现代操作系统和网络框架为了提高安全性,会限制明文(未加密)的HTTP通信,鼓励或强制使用HTTPS进行加密通信。

         解决这个问题的方法通常涉及到更新应用的网络安全配置,允许特定域名的明文流量或者最好是确保所有通信都通过HTTPS进行。如果你的应用是运行在Android平台上,可以通过以下步骤解决:

创建网络安全配置文件

                在你的Android项目的res/xml目录下,创建一个名为network_security_config.xml的文件(如果该目录不存在,请先创建它),并添加如下配置以允许特定域名的明文流量(t.weather.itboy.net)(这不推荐用于生产环境,仅作示例):

1<?xml version="1.0" encoding="utf-8"?>
2<network-security-config>
3    <domain-config cleartextTrafficPermitted="true">
4        <domain includeSubdomains="true">t.weather.itboy.net</domain>
5    </domain-config>
6</network-security-config>
  1. 引用配置文件

    1. 在你的应用的AndroidManifest.xml文件中,添加android:networkSecurityConfig属性指向刚才创建的配置文件:Xml
      1<application
      2    ...
      3    android:networkSecurityConfig="@xml/network_security_config">
      4    ...
      5</application>
  2. 重启应用

    1. 保存更改后,重新编译并安装你的应用到设备上。

然而,最安全的做法是确保t.weather.itboy.net支持HTTPS,并且你的应用只通过HTTPS与之通信。如果该服务确实提供了HTTPS连接,请检查你的应用程序代码,确保所有URL都以https://开头而非http://

如果这是由于Android系统的安全策略(比如在Android 9及以上版本中对明文流量的限制),则上述解决方案是必要的。但在实施时,始终优先考虑应用和用户数据的安全性。

 数据匹配错误

如下错误:

更正数据匹配为:

七、效果

八、异步与同步请求

        Retrofit支持异步(如上所示使用enqueue方法)和同步请求(使用execute方法)。注意,同步请求不应该在主线程中执行,因为它会阻塞UI线程。在Retrofit中,异步请求通过enqueue方法实现,而同步请求则通过execute方法完成。下面分别给出这两个操作的示例代码,但请注意,同步请求应当避免在Android主线程中直接执行,以免阻塞UI,导致应用无响应(ANR)。

异步请求示例(已提供,再次展示以供参考)

1WHttp wHttp = retrofit.create(WHttp.class);
2Call<ReSon> call = wHttp.getCall("101260101");
3
4call.enqueue(new Callback<ReSon>() {
5    @Override
6    public void onResponse(Call<ReSon> call, Response<ReSon> response) {
7        if (response.isSuccessful()) {
8            ReSon reSon = response.body();
9            // 在这里处理响应数据,例如更新UI
10            runOnUiThread(new Runnable() {
11                @Override
12                public void run() {
13                    textView.setText(reSon.getDate());
14                }
15            });
16        } else {
17            // 处理错误情况,例如HTTP错误码
18        }
19    }
20
21    @Override
22    public void onFailure(Call<ReSon> call, Throwable t) {
23        // 处理网络请求失败的情况
24        runOnUiThread(new Runnable() {
25            @Override
26            public void run() {
27                textView.setText("错误: " + t.getMessage());
28            }
29        });
30    }
31});

同步请求示例

同步请求应当在后台线程执行,例如使用ThreadAsyncTask(尽管AsyncTask在Android 11及以上版本已被废弃,推荐使用其他并发机制如java.util.concurrent包下的工具类)。以下使用一个简单的Thread示例:

1new Thread(new Runnable() {
2    @Override
3    public void run() {
4        try {
5            WHttp wHttp = retrofit.create(WHttp.class);
6            Call<ReSon> call = wHttp.getCall("101260101");
7            Response<ReSon> response = call.execute();
8
9            if (response.isSuccessful()) {
10                final ReSon reSon = response.body();
11                // 由于不能直接在后台线程更新UI,需要切换到主线程
12                runOnUiThread(new Runnable() {
13                    @Override
14                    public void run() {
15                        textView.setText(reSon.getDate());
16                    }
17                });
18            } else {
19                // 错误处理,同样需要回到主线程更新UI
20                runOnUiThread(new Runnable() {
21                    @Override
22                    public void run() {
23                        textView.setText("同步请求错误: " + response.code());
24                    }
25                });
26            }
27        } catch (IOException e) {
28            e.printStackTrace();
29            // 异常处理,同样需要回到主线程更新UI
30            runOnUiThread(new Runnable() {
31                @Override
32                public void run() {
33                    textView.setText("同步请求失败: " + e.getMessage());
34                }
35            });
36        }
37    }
38}).start();

在上述同步请求示例中,我们通过创建一个新的Thread并在其中执行execute方法来发送请求。由于execute会阻塞直到请求完成,所以它不能直接在主线程中使用。请求完成后,我们使用runOnUiThread回调到主线程更新UI,以确保遵循Android的单线程模型。

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

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

相关文章

中国机器人产业崛起,德国市场面临30%的份额挑战

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 随着科技的不断进步&#xff0c;机器人行业正迎来前所未有的发展机遇。令人震惊的是&#xff0c;根据最新统计数据&#xff0c;中国机器人产业在…

数据结构之“算法的时间复杂度和空间复杂度”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、算法效率 1.1算法的复杂度概念 1.2复杂度的重要性 二、时间复杂度 2.1时间复杂度的概念 2.2大O的渐进表示法 2.3常见的时间复杂度…

服务器主机托管服务内容科普

在现代信息技术快速发展的背景下&#xff0c;服务器主机托管服务已成为众多企业、机构和个人不可或缺的一部分。本文将为您详细科普服务器主机托管服务的内容&#xff0c;帮助您更好地理解和选择适合自己的托管方案。 一、硬件与基础设施 服务器主机托管服务首先提供了硬件和网…

DevExpress WPF中文教程:Grid - 如何将更改发布到数据库(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

如何优雅的使用Github Action服务来将Hexo部署到Github Pages

文章目录 参考文章前提条件1. 初始化Hexo2. 初始化仓库3. 创建Token4. 修改_config.yml5. 配置Github Action工作流6. 推送验证7. 配置Github Pages8. 修改Hexo主题样式10. 添加文章遇到了一些问题和方案1. 网站没有样式问题2. 图片不显示 参考文章 Bilibili视频教程-9分钟零成…

2024年综合艺术与媒体传播国际会议(ICIAMC 2024)

2024年综合艺术与媒体传播国际会议(ICIAMC 2024) 2024 International Conference on Integrated Arts and Media Communication (ICIAMC 2024) 会议地点&#xff1a;贵阳&#xff0c;中国 网址&#xff1a;www.iciamc.com 邮箱: iciamcsub-conf.com 投稿主题请注明:ICIAMC…

【漏洞复现】全程云OA svc.asmx SQL注入漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

一个简单好用安全的开源交互审计系统,支持SSH,Telnet,Kubernetes协议

前言 在当今的企业网络环境中&#xff0c;远程访问和交互审计成为了保障网络安-全的重要组成部分。然而&#xff0c;现有的解-决方案往往存在一些痛点&#xff0c;如复杂的配置、有限的协议支持、以及审计功能的不足。这些问题不仅增加了IT管理员的负担&#xff0c;也为企业的…

Ecahrts竖向柱状图实现自动滚动

效果如下&#xff1a; 1.首先声明一个timer定时器标识 let timer: NodeJS.Timer; // 定时器 2.再声明窗口展示的数量&#xff0c;yAxisIndex2用来记录当前index已经加了多少&#xff0c;方便再formatter中格式化标题的相关信息 const dataZoomEndValue 6; // 数据窗口范围的…

【0-1系列】从0-1快速了解搜索引擎是什么以及怎么用(上)

友情链接 社区开发版安装部署与使用教程社区版家族V2024.5版本更新说明 START>>1.快速了解搜索引擎 什么是搜索引擎数据库 搜索引擎数据库是一类专门用于数据内容搜索的NoSQL数据库&#xff0c;是非结构化大数据处理分析领域中重要的基础支撑软件。 伴随互联网、移动…

scene graph generation benchmark关于visual genome的数据划分(train,test,val)

scene graph generation benchmark关于visual genome的数据划分&#xff08;train&#xff0c;test&#xff0c;val&#xff09; 前言 前言 很多做scene graph generation&#xff0c;准备测试的同学&#xff0c;发现visual genome并没有提供官方的训练train&#xff0c;测试t…

竞赛选题 python opencv 深度学习 指纹识别算法实现

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…

【AI大模型】基于ChatGLM-6b从零开始本地部署语言模型,步骤详细无坑版

1.什么是ChatGLM-6B ChatGLM-6B 是的一种自然语言处理模型&#xff0c;属于大型生成语言模型系列的一部分。"6B"在这里指的是模型大约拥有60亿个参数&#xff0c;这些参数帮助模型理解和生成语言。ChatGLM-6B 特别设计用于对话任务&#xff0c;能够理解和生成自然、…

Linux 软链接

# 语法 ln -s <文件夹or文件的真实路径> <自定义路径别名> # 例子 ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ens33

Android集成mapbox教程

目录 简介准备工作创建Token系统开发简介 Mapbox是来自美国的一家为开发者提供地图服务和开发工具的开放平台。Mapbox以开源的形式构建了矢量瓦片技术生态,开发了矢量切片工具、瓦片服务传输框架。Mapbox的底图平台非常受欢迎,特别是开发者和学生群体,可以使用免费的开源软…

matlab结合python的CoolProp库来进行热泵热循环仿真

前言 需要安装python&#xff0c;不同matlab版本需要下载对用的python版本&#xff01;&#xff01;&#xff01;&#xff01;&#xff0c;切记&#xff01;&#xff01;&#xff01;&#xff01;否则程序无法运行&#xff0c;下图是展示了matlab和python之间的版本对应 安装…

数据分析思考

数据分析工作流程 在我的数据分析职业发展过程中&#xff0c;我从基础的数据提取工作开始&#xff0c;逐步深入到更为复杂和具有战略意义的领域。这包括构建和完善指标体系、设计风险预警模型&#xff0c;以及与多部门协作完成公司整体经营分析等工作。 在这个过程中&#xf…

会声会影2024旗舰版汉化最新安装包下载方法步骤

嗨&#xff0c;亲爱的CSDN的朋友们&#xff01;&#x1f389;今天&#xff0c;我要跟大家分享一款让你的视频编辑体验升级的神器——会声会影2024最新版本&#xff01;✨如果你是一个热衷于创作视频内容的创作者&#xff0c;那么你一定不能错过这个软件。它不仅功能强大&#x…

为什么企业需要数据挖掘平台?哪个比较好呢?

什么是数据挖掘&#xff1f; 数据挖掘就是从大量的数据中去发现有用的信息&#xff0c;然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢&#xff1f;实际上&#xff0c;数据挖掘就是智能化的数据分析&#xff0c;它们的目标都是一样的。但是&#xff0c…

前端面试js高频手写大全

res.push(fn(arr[i])) } return res } 3. reduce实现数组的map方法 Array.prototype.myMap function(fn,thisValue){ var res []; thisValue thisValue||[]; this.reduce(function(pre,cur,index,arr){ return res.push(fn.call(thisValue,cur,index,arr)); },[])…