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

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怒耗半天

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先需要在项目中添加OkHttp、Retrofit和RxJava的依赖。 在build.gradle文件中添加以下代码: ```groovy dependencies { implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'io.reactivex.rxjava2:rxjava:2.2.10' } ``` 然后在代码中创建Retrofit实例和API接口定义: ```java public interface ApiService { @GET("posts") Observable<List<Post>> getPosts(); } Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://jsonplaceholder.typicode.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(new OkHttpClient()) .build(); ApiService apiService = retrofit.create(ApiService.class); ``` 最后在需要请求API接口的地方,使用RxJava的Observable来发起请求: ```java apiService.getPosts() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<Post>>() { @Override public void onSubscribe(Disposable d) { // 订阅事件 } @Override public void onNext(List<Post> posts) { // 请求成功,处理返回结果 } @Override public void onError(Throwable e) { // 请求失败,处理异常 } @Override public void onComplete() { // 请求完成 } }); ``` 其中,subscribeOn(Schedulers.io())表示在io线程中发起请求,observeOn(AndroidSchedulers.mainThread())表示在主线程中处理结果。具体的线程调度可以根据实际情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

事多做话少说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值