安卓笔记1-Retrofit2请求自定义接口

news2025/1/9 4:27:49

1、整体功能概述

安卓项目中使用Retrofit2实现和自定义接口的网络交互,通过Postman模拟服务端,创建自定义接口。

作用

  1. 前后端开发进度对不齐时,客户端可利用本功能模拟测试数据。
  2. 备忘。

缺点

  • retrofit模拟接口需要配置响应数据类,若接口响应体字段较多,或者数据类型不规则,配置起来比较麻烦。
  • 建议使用

2、postman mock接口

使用Postman mock 同一URL下不同的功能接口,表示如下:

// 功能接口URL
https://myapi.com/myservice1
https://myapi.com/myservice2
https://myapi.com/myservice3
...

注:https: //myapi.com/会被替换成postman生成的URL,最终可调用的完整URL长这样:

https://随机生成的字符串.mock.pstmn.io/myservice

流程

在这里插入图片描述

完成后点击右下角 next
在这里插入图片描述
在这里插入图片描述

点击右上角 view Collection Docs查看接口信息
在这里插入图片描述
如上,模拟生成了一个url下两个不同的功能接口,按照样例访问即可。

3、Retrofit2进行网络交互

在Android项目(本文以空白项目为例)中设置retrofit2

项目整体结构

如下图所示:
在这里插入图片描述

1)首先配置Retrofit客户端

// RetrofitClient.kt

package com.example.retrofit

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

object RetrofitClient {
    private const val SERVICE_BASE_URL = "https://你生成的随机字符串.mock.pstmn.io"

  // 配置retrofit实例
    val serviceRetrofit: Retrofit by lazy {
        Retrofit.Builder()
            .baseUrl(SERVICE_BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }
  
	//配置接口实例
    val service1: Service1 by lazy {
        serviceRetrofit.create(Service1::class.java)
    }

    val service2: Service2 by lazy {
        serviceRetrofit.create(Service2::class.java)
    }
    
}

2)配置接口

// ApiService.kt

package com.example.retrofit

import retrofit2.Call
import retrofit2.http.GET

// 配置接口协议方法、路径、响应
interface Service1 {
    @GET("/myservice1")
    fun getService1(): Call<Service1Response>
}

interface Service2 {
    @GET("/myservice2")
    fun getService2(): Call<Service2Response>

}

3)响应体数据类

业务中接口数据通常会非常复杂,建议使用GsonJsonObject简化响应体。

本文举例的响应较为简单。

/**
 * Response.kt
 * @tip: 根据响应体设置数据类
 */
package com.example.retrofit

data class Service1Response(
    val goal1: String
)

data class Service2Response(
    val goal2: String
)

4)请求体类

仅测试用,无特殊要求可以不写。

5)调用

xml

<!--  activity_main.xml  -->

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Response from Service 1"
        android:layout_marginBottom="10dp"/>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Response from Service 2"/>
</LinearLayout>

MainActivity

package com.example.testretrofit

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.example.retrofit.RetrofitClient
import com.example.retrofit.Service1Response
import com.example.retrofit.Service2Response
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class MainActivity : AppCompatActivity() {
    private lateinit var textView1: TextView
    private lateinit var textView2: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textView1 = findViewById(R.id.textView1)
        textView2 = findViewById(R.id.textView2)

        RetrofitClient.service1.getService1().enqueue(object : Callback<Service1Response> {
            override fun onResponse(call: Call<Service1Response>, response: Response<Service1Response>) {
                if (response.isSuccessful) {
                    println("getService1调用成功")
                    println(response.body())

                    runOnUiThread {
                        response.body()?.let {
                            textView1.text = it.goal1
                        }
                    }
                } else {
                    // 处理错误响应
                    println("getService1响应错误")
                }
            }

            override fun onFailure(call: Call<Service1Response>, t: Throwable) {
                // 处理请求失败
                println("getService1响应失败")
            }
        })


        RetrofitClient.service2.getService2().enqueue(object : Callback<Service2Response> {
            override fun onResponse(call: Call<Service2Response>, response: Response<Service2Response>) {
                if (response.isSuccessful) {
                    println("getService2调用成功")
                    println(response.body())
                    runOnUiThread {
                        response.body()?.let {
                            textView2.text = it.goal2
                        }
                    }
                } else {
                    // 处理错误响应
                    println("getService2响应错误,状态码: ${response.code()}, 错误信息: ${response.message()}")
                }
            }

            override fun onFailure(call: Call<Service2Response>, t: Throwable) {
                // 处理请求失败
                println("getService2响应失败,错误: ${t.message}")
            }
        })


    }
}

实测

模拟器一定一定选择新一点的api版本!

不然跟我一样和GPT怒耗半天

在这里插入图片描述

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

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

相关文章

美无定论,娜扎亦菲各自绽放你更爱哪一款?

娜扎亦菲各自绽放你更爱哪一款&#xff1f; 哎呀&#xff0c;这个问题可真是让我头疼呢&#xff0c; 就像让我在两个糖果店里选择最甜的那一颗一样难&#xff01; 古力娜扎和刘亦菲&#xff0c;两位都是娱乐圈里璀璨的明珠&#xff0c; 美得各有千秋&#xff0c;让人怎么舍得…

2024年上半年信息系统项目管理师——综合知识真题题目及答案(第1批次)(3)

2024年上半年信息系统项目管理师 ——综合知识真题题目及答案&#xff08;第1批次&#xff09;&#xff08;3&#xff09; 第41题&#xff1a;在应用集成中&#xff0c;有多个组件帮助协调连接各种应用。其中&#xff08;&#xff09;利用特定的数据结构&#xff0c;帮助开发人…

企业网络实验dhcp-snooping、ip source check,防非法dhcp服务器、自动获取ip(虚拟机充当DHCP服务器)、禁手动修改IP

文章目录 需求相关配置互通性配置配置vmware虚拟机&#xff08;dhcp&#xff09;分配IP服务配置dhcp relay&#xff08;dhcp中继&#xff09;配置dhcp-snooping&#xff08;防非法dhcp服务器&#xff09;配置ip source check&#xff08;禁手动修改IP&#xff09; DHCP中继&…

四. TensorRT模型部署优化-pruning(sparse-tensor-core)

目录 前言0. 简述1. 自动驾驶中需要关注的电力消耗2. Ampere架构中的3rd Generation Tensor core3. Sparse tensor core做矩阵乘法总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们…

【刷题汇总 -- 删除公共字符、两个链表的第一个公共结点、mari和shiny】

C日常刷题积累 今日刷题汇总 - day0121、删除公共字符1.1、题目1.2、思路1.3、程序实现 -- 蛮力法1.4、程序实现 -- 哈希 2、两个链表的第一个公共结点2.1、题目2.2、思路2.3、程序实现 -- 对齐比对法2.4、程序实现 -- 公共端点路程法 3、mari和shiny3.1、题目3.2、思路3.3、程…

Unity如何查找两个transform最近的公共parent

查找两个子对象最近的父对象 一、问题背景二、解决方案思路核心算法代码 三、总结 一、问题背景 最近看到个关于Unity的问题&#xff1a;在Hierarchy面板中的游戏对象&#xff0c;给定两个子物体transform对象&#xff0c;如何查找这两个transform最近的公共父级parent。感觉挺…

Java中常用线程安全的集合

文章目录 常用线程安全的集合CopyWriteArrayListCopyOnWriteArraySetHashTableConcurrentHashMapJDK1.7JDK1.8 常用线程安全的集合 在多线程环境中&#xff0c;数据的一致性和线程的安全性是至关重要的。传统的集合类&#xff0c;如ArrayList、HashMap和HashSet&#xff0c;在…

手撕Vue中的RouterLink和RouterView,深入理解其底层原理(一)

RouterLink和RouterView的作用 我们可以通过RouterLink绑定好指向的路径 点击就能够实现在RouterView中将页面显示出来 我们首先使用官方的vue-router展示一下效果 App.vue <template><div><router-link to"/">Home</router-link><ro…

Real User ID 和 Effective User ID 的区别

在 Unix 和 Linux 系统中&#xff0c;每个进程都有多个用户标识符&#xff08;UID&#xff09;&#xff0c;其中最重要的是“真实用户 ID”&#xff08;real UID&#xff09;和“有效用户 ID”&#xff08;effective UID&#xff09;。 它们的区别和用途如下&#xff1a; 真实…

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕&#xff0c;课程资…

五. TensorRT API的基本使用-MNIST-model-build-infer

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main函数2.2 build接口2.3 infer接口2.4 其他 总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第五章—TensorRT API 的基…

7.13实训日志

上午 学习网络安全的过程中&#xff0c;我们深入了解了网络的不同层面和技术&#xff0c;从表层网络到深网再到暗网&#xff0c;以及涉及的产业分类和技术工具。这些知识不仅帮助我们理解网络的复杂性&#xff0c;还揭示了如何应对和防范各种网络威胁。 首先&#xff0c;我们…

滞后序列分析案例详解

一个半小时 超出30分钟 日期&#xff1a;2024-07-13 19:14:33 回放 摘要 Python在行为分析中的应用 主要讲述了如何使用Python处理序列数据&#xff0c;以及如何结合定性分析和定量分析来全面分析课程内容。讲者提到了一种叫做分层法的分类方法&#xff0c;该方法使用了布鲁…

记录vite项目中Cornerstone的兼容问题(持续更新)

&#x1f50e; 在vite项目中打包提示错误 ESM integration proposal for Wasm" is not supported currently. ⛳️ 问题描述 Error: Could not load /home/xxx/xxx/node_modules/icr/polyseg-wasm/dist/ICRPolySeg.wasm (imported by node_modules/icr/polyseg-wasm/di…

【软件建模与设计】-02-UML图

目录 摘要 1、用例图&#xff08;use case diagram&#xff09; 2、类与对象 3、类图 3.1、四种关系 3.2、可见性 4、交互图 4.1、通信图 4.2、顺序图 5、状态机图 6、包图 7、并发通信图 8、部署图 9、UML扩展机制 9.1、构造型 9.2、标记值 9.3、约束 摘要 用…

log4j2的日志框架(详细,springboot和异步日志的实现)

目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版&#xff0c;参考了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带 来…

韦东山嵌入式linux系列-驱动进化之路:总线设备驱动模型

1 驱动编写的 3 种方法 以 LED 驱动为例 1.1 传统写法 使用哪个引脚&#xff0c;怎么操作引脚&#xff0c;都写死在代码中。 最简单&#xff0c;不考虑扩展性&#xff0c;可以快速实现功能。 修改引脚时&#xff0c;需要重新编译。 应用程序调用open等函数最简单的方法是驱动…

ISO 45001:提升职业健康与安全管理水平的关键

在现代企业管理中&#xff0c;员工的职业健康与安全&#xff08;OH&S&#xff09;已经成为不可忽视的重要议题。ISO 45001作为国际标准化组织&#xff08;ISO&#xff09;制定的职业健康与安全管理体系标准&#xff0c;为企业提供了科学有效的管理规范和指南。实施这一标准…

C#中的反射

dll和exe文件的区别 用途&#xff1a; .exe&#xff08;可执行文件&#xff09;&#xff1a;是可以直接运行的程序文件。当你双击一个 .exe 文件或在命令行中输入它的名字&#xff0c;操作系统会加载并执行这个程序。 .dll&#xff08;动态链接库&#xff09;&#xff1a;包含…

如何在SpringCloud中使用Kafka Streams实现实时数据处理

使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用。Kafka Streams是一个基于Kafka的流处理库&#xff0c;它可以用来处理流式数据&#xff0c;进行流式计算和转换操作。 下面将介绍如何在Spring Cloud中使用Kafka Streams实…