通过改造在运行时处理 http 请求路径更改

问题描述 投票:0回答:1

我现在有这个api用法:

App.API.foo(mapOf("a" to a, "b" to b)).enqueue(responseHandler)

// my api class
@POST("/foo-v1")
fun foo(@Body map: Map<String, String>): Call<Response>

现在我有了新的 api 路径:

"/foo-v2"
和在运行时定义的新 baseurl。

在运行时进行更改的最佳方法是什么? 我认为的选项:将

@Path("version") version: String
添加到 foo 函数将像这样:

@POST("/foo-{version}") 
fun foo(@Body map: Map<String, String>, @Path("version") version: String): Call<Response>

对于一个请求来说还可以,但如果更改了很多请求,那就不太好了。

另一个问题,当某些请求还需要添加新路径时可以做什么,例如

@POST("/auth/foo-{version}")

android kotlin retrofit2 okhttp
1个回答
0
投票

我最初发表评论是因为时间紧迫,但我想提供一些快速代码来说明这一点。

提供这样的服务:

interface ChangeUrlService {
    @POST(".")
    fun foo(
        @Header("url") url: String,
        @Body map: Map<String, String>
    ): Call<Response>
}

您可以使用拦截器在运行时设置端点 url,该拦截器应用于您的 OkHttpClient.Builder。

class ChangeUrlInterceptor: Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        // This request is has "." as the url. We want to change it!
        val request = chain.request()

        /**
         * Get the url argument via the headers. I exit early here 
         * with the original request going through the network but you
         * can throw an exception or whatever.
         */
        val url = request.header("url")
            ?: return chain.proceed(request)

        val body = request.body // dont forget to apply your request body

        /*
         * Here's where you create your new request at runtime!
         * /
        val newRequest = Request.Builder()
            .url(url)
            .headers(request.headers)
            .apply {
                if(body == null) this else post(body)
            }
            .build()

        return chain.proceed(newRequest)
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.