[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.POST

interface 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.GsonConverterFactory

class 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?.data
                    var list = info?.data
                    dataArr += 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 连接与服务器通信,防止敏感数据被窃取或篡改。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Linux服务器部署爬虫程序?大佬只需七步!

之前在某乎上看见一篇关于《为什么很多程序员都建议使用 Linux》的文章&#xff0c;结合我自身关于Linux的使用经验。心血来潮得写了一段关于我在Linux系统部署爬虫程序的心得&#xff0c;希望结识更多的爬虫技术大佬&#xff0c;一起游弋在代码世界中。 根据我多年在Linux上部…

基于C#实现Dijkstra算法

或许在生活中&#xff0c;经常会碰到针对某一个问题&#xff0c;在众多的限制条件下&#xff0c;如何去寻找一个最优解&#xff1f;可能大家想到了很多诸如“线性规划”&#xff0c;“动态规划”这些经典策略&#xff0c;当然有的问题我们可以用贪心来寻求整体最优解&#xff0…

vue3.0使用leaflet

1、获取天地图密钥; 访问:https://www.tianditu.gov.cn/ 注册并登录,访问开发资源 =》地图API =》 地图服务=》申请key 应用管理=》创建新应用=》获取到对应天地图key 2、引入leaflet组件 参考资料:https://leafletjs.com/reference.html#path npm install leaflet …

用自己热爱的事赚钱,是多么的幸福

挖掘天赋可能有些困难&#xff0c;但挖掘爱好就简单多啦&#xff01;最幸福的事情就是能用自己喜欢的事情赚钱。 我们要说的是一个博主&#xff0c;他非常喜欢骑自行车&#xff0c;虽然他的工作是在外贸公司做销售&#xff0c;但每当有空时&#xff0c;他都会骑自行车。而且他…

竞赛选题 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

MES管理系统需要与ERP系统协同工作吗

在当前的制造业环境中&#xff0c;信息化、智能化、数字化已经成为了企业转型升级的重要方向。其中&#xff0c;ERP企业管理系统与MES生产管理系统的应用和实施&#xff0c;对于提升企业的运营效率和竞争力具有显著效果。然而&#xff0c;在面对系统工具选择时&#xff0c;许多…

内网横向技术

如果拿下了一台机器之后寻找域控机器 ipconfig /all 找到域名 ping 域名或者nslookup域名

局域网协议:动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)

在局域网络中&#xff0c;DHCP协议通过自动化和简化网络配置过程&#xff0c;提高网络的可管理性和灵活性&#xff0c;使得设备可以更轻松地连接到网络并获得所需的网络配置信息。 文章目录 What is DHCP?DHCP的组成1. DHCP客户端2. DHCP服务器&#xff1a;3. 中继代理&#…

Linux CentOS7的主机名

主机名&#xff0c;也称为计算机名&#xff0c;是提供给网络连接的设备&#xff08;如系统、交换机、路由器等&#xff09;的识别名称。同一网络中不能有两个主机名相同的系统。Linux系统给当前主机命名的目的是能够容易记住&#xff0c;尤其是在部署集群的时候更加方便。 一般…

第二证券:股票破发后面还会涨吗?

许多出资者遇到这样的状况&#xff0c;自己心里也着急及担忧。破发是股价掉破了发行价&#xff0c;这种状况下就会引起出资者的不安。那么股票破发后边还会涨吗&#xff1f;这个问题没有定论&#xff0c;需求从多个视点进行分析和判别。 从经济基础面来看&#xff0c;破发的股…

JSP EL表达式之 empty

好 本文我们还是继续说EL表达式 我们来讲一个非空判断的好手 empty 我们直接编写代码如下 <% page contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %> <%request.setCharacterEncoding("UTF-8");%> <!DOCTYPE html&…

Maven 简单配置阿里云镜像

配置步骤&#xff1a; 1、找到 maven 的安装目录&#xff0c;修改settings.xml 2、在文件中找到<mirrors>标签&#xff0c;然后再标签中添加阿里云配置即可 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共…

Echarts+Vue+dataV 首页大屏静态示例Demo

效果图: <template><div class="content bg"><!-- 全屏容器 --><!-- 第一行 --><div class="module-box"><div style="flex: 0 1 30%"><dv-decoration-10 style="height: 5px" /></div…

2016年2月17日 Go生态洞察:Go 1.6版本发布

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

简述马尔可夫链【通俗易懂】

前言 马尔可夫链&#xff08;Markov Chain&#xff09;可以说是机器学习和人工智能的基石&#xff0c;在强化学习、自然语言处理、金融领域、天气预测、语音识别方面都有着极其广泛的应用。 The future is independent of the past given the present 未来独立于过去&#xff…

批量将本地N个英文Html文档进行中文翻译-操作篇

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

GPT、GPT-2、GPT-3论文精读笔记

视频&#xff1a;GPT&#xff0c;GPT-2&#xff0c;GPT-3 论文精读【论文精读】_哔哩哔哩_bilibili MAE论文&#xff1a;把bert用回计算机视觉领域 CLIP论文&#xff1a;打通文本和图像 GPT 论文&#xff1a;Improving Language Understanding by Generative Pre-Training …

Android开发从0开始(Activity篇)

Activity的生命周期 对应解释&#xff1a; startActivity(new Intent(源页面.this,目标页面.class)) 结束当前活动页面finish(); Activity的启动模式 App先后打开两个活动&#xff0c;此时活动会放入栈内。 &#xff08;Android:launchMode”standard”&#xff09;默认 &am…

全自动洗衣机什么牌子好?内衣洗衣机推荐

现在洗内衣内裤也是一件较麻烦的事情了&#xff0c;在清洗过程中还要用热水杀菌&#xff0c;还要确保洗衣液是否有冲洗干净&#xff0c;还要防止细菌的滋生等等&#xff0c;所以入手一款小型的烘洗全套的内衣洗衣机是非常有必要的&#xff0c;专门的内衣洗衣机可以最大程度减少…

实时语音克隆:5 秒内生成任意文本的语音 | 开源日报 No.84

CorentinJ/Real-Time-Voice-Cloning Stars: 43.3k License: NOASSERTION 这个开源项目是一个实时语音克隆工具&#xff0c;可以在5秒内复制一种声音&#xff0c;并生成任意文本的语音。 该项目的主要功能包括&#xff1a; 从几秒钟的录音中创建声纹模型根据给定文本使用参考…