以下是使用 Retrofit 發送 POST 請求獲取分頁城市列表的 Kotlin 代碼示例
1.在你的?build.gradle 文件中添加 Retrofit 和 Gson 的依賴
dependencies {......implementation("com.squareup.retrofit2:retrofit:2.9.0")implementation("com.squareup.retrofit2:converter-gson:2.9.0")
}
?
2.申請網絡權限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.INTERNET" />......</manifest>
?
3.定義數據類
data class CityResponse(val code: String,val message: String,val data: CityDataInfo
)data class? CityDataInfo(val page: Int,var pageSize: Int,var totalPages: Int,var totalItems: Int,val data: List<CityModel>
)data class CityModel(val id: Int,val name: String,val code: String
)data class PageRequest(val page: Int,val pageSize: Int
)
數據格式如下:
?
4.定義一個 Retrofit 接口
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.POSTinterface ApiService {@POST("api/cityList.php")fun getCities(@Body request: PageRequest): Call<CityResponse>
}
在這個接口中,@POST?注解表示這是一個 POST 請求,"api/cityList.php"?是你的 API 端點,getCities?是你的請求方法,它接受一個?PageRequest?對象作為請求體,并返回一個對象。
?
5.創建一個 Retrofit 實例用來發送 POST 請求
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactoryclass HomeFragment: Fragment() {private var dataArr: List<CityModel> = listOf()override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)requestCityList()}private fun requestCityList() {val retrofit = Retrofit.Builder().baseUrl("https://www.lnktools.com/").addConverterFactory(GsonConverterFactory.create()).build()val service = retrofit.create(ApiService::class.java)val call = service.getCities(PageRequest(1, 20))call.enqueue(object : Callback<CityResponse> {override fun onResponse(call: Call<CityResponse>, response: Response<CityResponse>) {if (response.isSuccessful) {val res = response.body()var info = res?.datavar list = info?.datadataArr += list ?: listOf()// 處理響應println("dataArr count = ${dataArr.count()}")} else {// 處理錯誤}}override fun onFailure(call: Call<CityResponse>, t: Throwable) {// 處理失敗}})}}
這段代碼首先創建了一個 Retrofit 實例,并配置了基礎 URL 和 Gson 轉換器。然后,我們使用 retrofit.create 方法來創建一個 ApiService 的實例。最后,我們調用 getCities 方法來發送 POST 請求,并使用 enqueue 方法來異步發送請求。在 Callback 的 onResponse 方法中,我們可以處理服務器的響應,在 onFailure 方法中,我們可以處理請求失敗的情況。
6.網絡安全配置
正常來說,按照上面操作完成網絡請求已經沒問題了。但在手機設置代理抓包時,還是可能會導致網絡請求失敗,這時可以按下面的方式處理。
到 res -> xml 創建一個network-security-config.xml文件,配置如下。
<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="system" /><certificates src="user" /></trust-anchors></base-config>
</network-security-config>
然后,到清單文件為application配置networkSecurityConfig。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><uses-permission android:name="android.permission.INTERNET" /><application android:networkSecurityConfig="@xml/network_security_config" ></application></manifest>
注意:在開發設置 cleartextTrafficPermitted="true"
來允許明文流量,便于我們抓包。但在發布應用時,為了提高應用的安全性,通常建議禁用明文流量,即將?cleartextTrafficPermitted
?設置為?false
。這樣可以確保應用只能通過加密的 HTTPS 連接與服務器通信,防止敏感數據被竊取或篡改。