如何使用自定义类型的Retrofit @Query参数?

时间:2017-08-01 22:52:01

标签: kotlin retrofit retrofit2

给出以下Retrofit接口:

@GET("offices")
fun getOffices(@Query("uid") uid: String,
               @Query("lat") latitude: Double,
               @Query("lon") longitude: Double
): Call<List<Office>>

如何使用更加用户友好的GeoLocation类型...

替换位置参数
data class GeoLocation(
        val latitude: Double,
        val longitude: Double
)

...在请求时自动转换为latlon,例如:

@GET("offices")
fun getOffices(@Query("uid") uid: String,
               @Query("location") location: GeoLocation
): Call<List<Office>>

以下是改造设置:

fun createRetrofit(baseUrl: String,
                   okHttpClient: OkHttpClient): Retrofit {
    val moshi = Moshi.Builder()
            .build()

    return Retrofit.Builder()
            .baseUrl(baseUrl)
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .client(okHttpClient)
            .build()
}

2 个答案:

答案 0 :(得分:0)

如果您担心用户友好访问,您可以创建一个包装函数。通过这种方式,您无需在所有

中混乱使用Retrofit配置
fun getOffices(uid: String, location: GeoLocation): Call<List<Office>> {
    return getOfficesIf(uid, location.lat, location.lon)
}

@GET("offices")
fun getOfficesIf(@Query("uid") uid: String,
                 @Query("lat") latitude: Double,
                 @Query("lon") longitude: Double
): Call<List<Office>>

答案 1 :(得分:0)

您可以在挂起函数中使用 Query 作为参数,如下所示:

@GET("Posts")
suspend fun getPosts(@Query("MaxCount") maxCount: Int): Response<Posts>