1、整体功能概述
安卓项目中使用Retrofit2实现和自定义接口的网络交互,通过Postman模拟服务端,创建自定义接口。
作用
- 前后端开发进度对不齐时,客户端可利用本功能模拟测试数据。
- 备忘。
缺点
- 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.ktpackage com.example.retrofitimport retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactoryobject 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.ktpackage com.example.retrofitimport retrofit2.Call
import retrofit2.http.GET// 配置接口协议方法、路径、响应
interface Service1 {@GET("/myservice1")fun getService1(): Call<Service1Response>
}interface Service2 {@GET("/myservice2")fun getService2(): Call<Service2Response>}
3)响应体数据类
业务中接口数据通常会非常复杂,建议使用Gson或JsonObject简化响应体。
本文举例的响应较为简单。
/*** Response.kt* @tip: 根据响应体设置数据类*/
package com.example.retrofitdata 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"><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Response from Service 1"android:layout_marginBottom="10dp"/><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Response from Service 2"/>
</LinearLayout>
MainActivity
package com.example.testretrofitimport 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.Responseclass MainActivity : AppCompatActivity() {private lateinit var textView1: TextViewprivate lateinit var textView2: TextViewoverride 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怒耗半天