0

Following is my RetrofitApi interface

 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?>

What I want is to know what is the URL after adding the query param and path to the respective url, like what is the final url before making API call.

Retrofit is making the final request url in its own library. How can i access that before making the request.

Context:

For caching purpose, I'm storing endpoints in db from the response interceptor. Now, before making another call, I want to check if that endpoint is already saved in my database or not. That's why I need to know what will be the final url.

Do I need to create my own Endpoint Builder Wrapper or does retrofit provides an easy way to access that final end point value?

4

1 回答 1

0

所以,我必须创建包装类来构建我的端点,因为如果你不使用改造 CALL 作为返回类型,改造不会暴露 url。

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

杰克沃顿 说:

如果您使用的是 Retrofit 的调用,您可以获得具有可用 URL 的支持 OkHttp 请求。如果您使用任何适配器,则 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(没有基本 url)作为端点传递:

@GET
suspend fun getUsers(@Url url: String): Response<UserEntity?>
于 2021-08-31T12:19:00.037 回答