在改造中,我可以在拨打电话之前获得带有所有动态 values/query 参数的端点 uri 吗?

In retrofit, can I get the endpoint uri with all dynamic values/query params before making the call?

以下是我的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。我如何才能在发出请求之前访问它。

上下文:

出于缓存目的,我将来自响应拦截器的端点存储在数据库中。现在,在再次调用之前,我想检查该端点是否已保存在我的数据库中。这就是为什么我需要知道最后的 url.

我是否需要创建自己的 Endpoint Builder Wrapper,或者改造是否提供了一种访问最终终点值的简单方法?

所以,我不得不创建包装器 class 来构建我的端点,因为如果你不使用 retrofit CALL 作为 return 类型,retrofit 不会公开 url。

我还创建了一个 issue/future 请求,Jake 已回复:github.com/square/retrofit/issues/3628

杰克沃顿说:

If you are using Retrofit's Call you can get the backing OkHttp Request which has the URL available. If you are using any of the adapters the URL is not exposed in any way.

调用代码如下:

 val endPoint =  EndPointBuilder()
                        .setEndPoint(NetworkConstants.Url.USER_DETAIL)
                        .addParamsAndValue(NetworkConstants.Params.USER_NAME,"")
                        .addQueryParamAndValue(NetworkConstants.Params.LANG,"en")
                        .build()

现在 EndPointBuilder class:

//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(没有基础 url)作为端点传递:

@GET
suspend fun getUsers(@Url url: String): Response<UserEntity?>