Retrofit传递json类型的参数

今天做一个安卓的需求,需要用到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参数的这样搞就行了(复杂的也没问题)
也备用自己以后再次复制粘贴,所以写了小东西

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容