kotlin: 用Retrofit+协程访问网络接口

一,安装第三方库

build.gradle.kts中添加

    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    implementation("com.google.code.gson:gson:2.13.0")

然后点击:Sync Now 链接

二,代码:

json.php

image

接口model类

package com.example.okdemo2.net

import androidx.annotation.Keep
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.Serializable

//@InternalSerializationApi
/**
 * 请求返回的BasicResponse 可以自己重新实现
 */

@Keep
@Serializable
open class ApiResponse<T>(
    open var data: T? = null,
    open var code: Int = -1,
    open var msg: String = "",
    open var status: String? = null,
    open var time: String? = null,
) {
    val isSuccess: Boolean
        get() = code == 200

}

数据model类

package com.example.okdemo2.fragment

//import com.google.gson.annotations.
//import com.google.gson.annotations.SerializedName
//import java.io.Serializable
import androidx.annotation.Keep
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Keep
@Serializable
data class UserList(
    @SerialName("list")
    val `list`: MutableList<UserListItem>,
    @SerialName("curPage")
    val curPage: Int,
    @SerialName("total")
    val total: Int,
    @SerialName("totalPage")
    val totalPage: Int,
    @SerialName("token")
    val token: String,
)


@Keep
@Serializable
data class UserListItem(
    @SerialName("id")
    val id: Int,
    @SerialName("name")
    val name: String,
    @SerialName("image")
    val image: String,
)

接口列表:

package com.example.okdemo2.fragment

import com.example.okdemo2.net.ApiResponse
import retrofit2.http.GET
import retrofit2.http.QueryMap

interface ApiService {
    @GET("/json.php")
    suspend fun userList(@QueryMap map: MutableMap<String, Any>): ApiResponse<UserList>
}

调用retrofit访问接口

        //按钮点击
        binding.getJsonButton.setOnClickListener {

            println("按钮被点击了")

            val retrofit = Retrofit.Builder()
                .baseUrl("http://www.nihonnoma.net")
                .addConverterFactory(GsonConverterFactory.create())
                .build()
            val appService = retrofit.create(ApiService::class.java)

                        lifecycleScope.launch {

                            //参数
                            val params = mutableMapOf<String, Any>(
                                "p" to 1,
                                "count" to 20,
                                "token" to "王富贵到此一游"
                            )
                            //访问接口
                            val user = appService.userList(params)
                            println(user)

                            if (user.status == "success") {
                                println("成功")
                                println(user.data)
                                println("当前页:"+user.data?.curPage)
                                println("当前用户:"+user.data?.token)
                                println(user.data?.list)
                            } else {
                                println("失败")
                                println("错误代码:"+user.code)
                                println("错误信息:"+user.msg)
                            }
                        }

        }

三,运行结果 :

image

posted @ 2025-09-06 22:07  刘宏缔的架构森林  阅读(21)  评论(0)    收藏  举报