Kotlin使用Retrofit2简单实例

效果展示

在这里插入图片描述

接口介绍

接口: 手机号码归属地查询API.
支持格式:JSON
请求方法:GET

步骤:

1. gradle添加依赖库

dependencies {
    
    
    ...
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}

2. 创建数据类

在这里插入图片描述

data class Tel(val status: String, val msg: String, val result: Result) {
    
    
    data class Result(
        val province: String,       // 省
        val city: String,           // 市
        val company: String,        // 运营商
        val cardtype: String        // 卡类型
    )
}

3. 定义代理接口

interface TelService {
    
    

    /**
     * @Parent: appkey: 调用的密钥      shouji: 查询的手机号
     */
    @GET("shouji/query")
    fun SerachTelByGet(@Query("appkey") appkey: String, @Query("shouji") shouji: String): Call<Tel>
}

4.Retrofit构造器

//单例类
object ServiceCreator {
    
    
    private const val BASE_URL = "https://api.binstd.com"       //根路径

    private val retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())     //添加用于解析数据的转换库
        .build()

    fun <T> create(serviceClass: Class<T>): T = retrofit.create(serviceClass)
}

调用

package com.example.serachtel

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

class MainActivity : AppCompatActivity() {
    
    
    private val appkey = "注册后即可获取"

    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        requestGetBtn.setOnClickListener {
    
    
            val telNumber = inputTelEt.text.toString()	//从EditText获取输入的手机号
            val telService = ServiceCreator.create(TelService::class.java)  //传入之前定义的接口

			//Get请求并处理结果
            telService.SerachTelByGet(appkey, telNumber).enqueue(object : Callback<Tel> {
    
    
                override fun onFailure(call: Call<Tel>, t: Throwable) {
    
    
                    t.printStackTrace()
                }

                override fun onResponse(call: Call<Tel>, response: Response<Tel>) {
    
    
                    val tel = response.body()
                    if (tel != null) {
    
    
                        infoTv.text = "${tel.result.province}   ${tel.result.city}"
                    }
                }
            })
        }
    }
}

最后注意

1
网络权限

<uses-permission android:name="android.permission.INTERNET" />

2
我编译时报错Error: Invoke-customs are only supported starting with Android O (–min-api 26)
原因:代码未设置支持Java8

解决方法:在app的build.gradle添加如下代码

android {
    
    
   	...
    compileOptions {
    
    
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44972847/article/details/107103126