阅读量:0
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.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)响应体数据类
业务中接口数据通常会非常复杂,建议使用Gson或JsonObject简化响应体。
本文举例的响应较为简单。
/** * 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怒耗半天