以下是我的RetrofitApi接口
const val USER_DETAIL = "private/{${Params.USER_NAME}}/details"
@GET(USER_DETAIL)
suspend fun getUsers(@Path(NetworkConstants.Params.USER_NAME) userName: String, @Query(NetworkConstants.Params.LANG) lang: String): Response<UserEntity?>
我想知道的是添加查询参数和路径到相应URL后的URL是什么,例如之前的最终URL是什么调用API
Retrofit在自己的库中生成最终请求url。在发出请求之前,我如何访问它?
背景:
出于缓存目的,我将响应拦截器中的端点存储在db中。现在,在进行另一个调用之前,我想检查该端点是否已经保存在数据库中。这就是为什么我需要知道最终的url是什么。
我是否需要创建我自己的端点生成器包装器,或者改造是否提供了一种访问最终端点值的简单方法?
所以,我必须创建包装器类来构建我的端点,因为如果您不使用retrofit CALL作为返回类型,retrofit不会暴露url。
我还创建了一个问题/未来请求,Jake已经响应了:github.com/square/retrofit/issues/3628
Jake Wharton说:
如果您正在使用Retrofit的调用,您可以获得支持OkHttp请求,它具有可用的URL。如果您正在使用任何适配器,则URL不会以任何方式暴露。
以下是主叫代码:
val endPoint = EndPointBuilder()
.setEndPoint(NetworkConstants.Url.USER_DETAIL)
.addParamsAndValue(NetworkConstants.Params.USER_NAME,"")
.addQueryParamAndValue(NetworkConstants.Params.LANG,"en")
.build()
现在EndPointBuilder类:
//accommodate query and path params of retrofit
class EndPointBuilder {
private val pathParamMap = hashMapOf<String, String>()
private val queryParamMap = hashMapOf<String, String>()
private var endPoint : String? = null
fun setEndPoint(endPoint: String): EndPointBuilder{
this.endPoint = endPoint
return this
}
fun addParamsAndValue(param: String, value: String): EndPointBuilder{
pathParamMap[param] = value
return this
}
fun addQueryParamAndValue(param: String, value: String): EndPointBuilder{
queryParamMap[param] = value
return this
}
fun build(): String{
for((key, value) in pathParamMap){
endPoint = endPoint.toString().replace("{$key}",value)
}
var queryString = ""
var counter = 0
for((key, value) in queryParamMap){
queryString = "$queryString$key=$value"
counter++
if(counter < queryParamMap.size){
queryString= "$queryString&"
}
}
endPoint = endPoint.toString() +"?"+ queryString
return endPoint.toString()
}
这是我的改进接口,其中url(不带base url)作为端点传递:
@GET
suspend fun getUsers(@Url url: String): Response<UserEntity?>