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

1、整体功能概述

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

作用

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

缺点

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

2、postman mock接口

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

bash 复制代码
// 功能接口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客户端

kotlin 复制代码
// 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)配置接口

kotlin 复制代码
// 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简化响应体。

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

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

data class Service1Response(
    val goal1: String
)

data class Service2Response(
    val goal2: String
)

4)请求体类

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

5)调用

xml

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

kotlin 复制代码
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怒耗半天

相关推荐
帅得不敢出门10 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了12 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任13 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山13 小时前
Android“引用们”的底层原理
android·java
迃-幵14 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
大风起兮云飞扬丶14 小时前
Android——从相机/相册获取图片
android
Rverdoser14 小时前
Android Studio 多工程公用module引用
android·ide·android studio
aaajj15 小时前
[Android]从FLAG_SECURE禁止截屏看surface
android
@OuYang15 小时前
android10 蓝牙(二)配对源码解析
android
Liknana15 小时前
Android 网易游戏面经
android·面试