当前位置: 首页 > news >正文

[Android]使用Retrofit进行网络请求

以下是使用 Retrofit 发送 POST 请求获取分页城市列表的 Kotlin 代码示例

1.在你的 build.gradle 文件中添加 Retrofit 和 Gson 的依赖

dependencies {......implementation("com.squareup.retrofit2:retrofit:2.9.0")implementation("com.squareup.retrofit2:converter-gson:2.9.0")
}

 

2.申请网络权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.INTERNET" />......</manifest>

 

3.定义数据类

data class CityResponse(val code: String,val message: String,val data: CityDataInfo
)data class  CityDataInfo(val page: Int,var pageSize: Int,var totalPages: Int,var totalItems: Int,val data: List<CityModel>
)data class CityModel(val id: Int,val name: String,val code: String
)data class PageRequest(val page: Int,val pageSize: Int
)

数据格式如下:

 

4.定义一个 Retrofit 接口

import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.POSTinterface ApiService {@POST("api/cityList.php")fun getCities(@Body request: PageRequest): Call<CityResponse>
}

在这个接口中,@POST 注解表示这是一个 POST 请求,"api/cityList.php" 是你的 API 端点,getCities 是你的请求方法,它接受一个 PageRequest 对象作为请求体,并返回一个对象。

 

5.创建一个 Retrofit 实例用来发送 POST 请求

import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactoryclass HomeFragment: Fragment() {private var dataArr: List<CityModel> = listOf()override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)requestCityList()}private fun requestCityList() {val retrofit = Retrofit.Builder().baseUrl("https://www.lnktools.com/").addConverterFactory(GsonConverterFactory.create()).build()val service = retrofit.create(ApiService::class.java)val call = service.getCities(PageRequest(1, 20))call.enqueue(object : Callback<CityResponse> {override fun onResponse(call: Call<CityResponse>, response: Response<CityResponse>) {if (response.isSuccessful) {val res = response.body()var info = res?.datavar list = info?.datadataArr += list ?: listOf()// 处理响应println("dataArr count = ${dataArr.count()}")} else {// 处理错误}}override fun onFailure(call: Call<CityResponse>, t: Throwable) {// 处理失败}})}}

这段代码首先创建了一个 Retrofit 实例,并配置了基础 URL 和 Gson 转换器。然后,我们使用 retrofit.create 方法来创建一个 ApiService 的实例。最后,我们调用 getCities 方法来发送 POST 请求,并使用 enqueue 方法来异步发送请求。在 Callback 的 onResponse 方法中,我们可以处理服务器的响应,在 onFailure 方法中,我们可以处理请求失败的情况。

6.网络安全配置

正常来说,按照上面操作完成网络请求已经没问题了。但在手机设置代理抓包时,还是可能会导致网络请求失败,这时可以按下面的方式处理。

到 res -> xml 创建一个network-security-config.xml文件,配置如下。

<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /><certificates src="user" /></trust-anchors></base-config>
</network-security-config>

然后,到清单文件为application配置networkSecurityConfig。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.INTERNET" /><application android:networkSecurityConfig="@xml/network_security_config" ></application></manifest>

注意:在开发设置 cleartextTrafficPermitted="true" 来允许明文流量,便于我们抓包。但在发布应用时,为了提高应用的安全性,通常建议禁用明文流量,即将 cleartextTrafficPermitted 设置为 false。这样可以确保应用只能通过加密的 HTTPS 连接与服务器通信,防止敏感数据被窃取或篡改。

相关文章:

  • 含分布式电源的配电网可靠性评估(matlab代码)
  • vue2.0+elementui集成file-loader之后图标失效问题
  • 安徽省广德市选择云轴科技ZStack Cloud云平台建设县级智慧城市
  • SQL注入漏洞发现和利用,以及SQL注入的防护
  • 【精选】Ajax技术知识点合集
  • centos7 系统keepalived 定时执行脚本
  • 百度智能云正式上线Python SDK版本并全面开源
  • SQL Server数据库自动备份方法
  • 机器学习第12天:聚类
  • python二叉树链树_树的链式存储结构
  • yum仓库
  • 第二十章:多线程
  • 【Docker】从零开始:2.Docker三要素
  • 3、LeetCode之无重复字符的最长子串
  • CSGO搬砖干货,全网最详细教学!
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • CentOS6 编译安装 redis-3.2.3
  • download使用浅析
  • ECS应用管理最佳实践
  • httpie使用详解
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • javascript从右向左截取指定位数字符的3种方法
  • swift基础之_对象 实例方法 对象方法。
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue ES6 Jade Scss Webpack Gulp
  • 初识MongoDB分片
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 机器学习学习笔记一
  • 力扣(LeetCode)965
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 实现菜单下拉伸展折叠效果demo
  • 使用parted解决大于2T的磁盘分区
  • 新书推荐|Windows黑客编程技术详解
  • 一些css基础学习笔记
  • 7行Python代码的人脸识别
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 数论-逆元
  • #QT(智能家居界面-界面切换)
  • #WEB前端(HTML属性)
  • #单片机(TB6600驱动42步进电机)
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (力扣题库)跳跃游戏II(c++)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • ***检测工具之RKHunter AIDE
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET 常见的偏门问题
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件