今天做一个安卓的需求,需要用到retrofit访问restApi服务器。这可能是最常见的需求了,第一个接口是个登录接口,是一个post类型的api接口,服务器要求参数是一个json格式,如下所示:
{
"username":"admin",
"password":"admin123",
"code":"0"
}
返回类似这样:
{
"code": 200,
"data": {},
"message": "操作成功",
"token": "eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjI5NzdiMDcxLTI0MDYtNDI1Yi04YzA0LWZhYjI2N2QyMDc4ZCJ9.7CoTnvalu0-Lw9eVFECRW5yDYh18T7V1-kfMOxlsMJtAeO4ME4okLSGrnC05ZUQtR4CtabOTrmjuW4tYWJpq4Q"
}
api接口用postman实验了,没任何问题。 但怎么样用retrofit去实现它呢?
那既然咱们是客串就只好先搜了,retrofit的基本使用解决了,但最后的问题是如何传递那个小json参数到服务器,网上倒是也有很多代码什么的,但始终感觉不满意,或者说不够方便,最终自己弄了一个解决方案,其实原理和网上说的没啥区别,主要是为了方便,受到kotlin mapof() 的启发 写了一个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无非是返回值结构的定义就不贴了,在看看调用时是不是简洁就行了
调用login
iotService.login(jsonOf("username" to "admin", "password" to "admin123", "code" to 0))
有了jsonOf是不是很简单了,以后有任何需要json参数的这样搞就行了(复杂的也没问题)
也备用自己以后再次复制粘贴,所以写了小东西