今天做一個(gè)安卓的需求,需要用到retrofit訪問(wèn)restApi服務(wù)器。這可能是最常見(jiàn)的需求了,第一個(gè)接口是個(gè)登錄接口,是一個(gè)post類(lèi)型的api接口,服務(wù)器要求參數(shù)是一個(gè)json格式,如下所示:
{
"username":"admin",
"password":"admin123",
"code":"0"
}
返回類(lèi)似這樣:
{
"code": 200,
"data": {},
"message": "操作成功",
"token": "eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjI5NzdiMDcxLTI0MDYtNDI1Yi04YzA0LWZhYjI2N2QyMDc4ZCJ9.7CoTnvalu0-Lw9eVFECRW5yDYh18T7V1-kfMOxlsMJtAeO4ME4okLSGrnC05ZUQtR4CtabOTrmjuW4tYWJpq4Q"
}
api接口用postman實(shí)驗(yàn)了,沒(méi)任何問(wèn)題。 但怎么樣用retrofit去實(shí)現(xiàn)它呢?
那既然咱們是客串就只好先搜了,retrofit的基本使用解決了,但最后的問(wèn)題是如何傳遞那個(gè)小json參數(shù)到服務(wù)器,網(wǎng)上倒是也有很多代碼什么的,但始終感覺(jué)不滿意,或者說(shuō)不夠方便,最終自己弄了一個(gè)解決方案,其實(shí)原理和網(wǎng)上說(shuō)的沒(méi)啥區(qū)別,主要是為了方便,受到kotlin mapof() 的啟發(fā) 寫(xiě)了一個(gè)jsonOf而已:
fun <K, V> jsonOf(vararg pairs: Pair<K, V>):RequestBody =
if (pairs.isNotEmpty()){
Gson().toJson(mapOf(*pairs))
.toRequestBody("application/json; charset=utf-8".toMediaType())
}
else throw Throwable("bad json arguments")
然后看看api接口定義
@POST("login")
suspend fun login(@Body body:RequestBody):LoginRepo
LoginRepo無(wú)非是返回值結(jié)構(gòu)的定義就不貼了,在看看調(diào)用時(shí)是不是簡(jiǎn)潔就行了
調(diào)用login
iotService.login(jsonOf("username" to "admin", "password" to "admin123", "code" to 0))
有了jsonOf是不是很簡(jiǎn)單了,以后有任何需要json參數(shù)的這樣搞就行了(復(fù)雜的也沒(méi)問(wèn)題)
也備用自己以后再次復(fù)制粘貼,所以寫(xiě)了小東西