在运行时在移动应用程序中切换 API 端点

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

我们正在为 iOS 和 Android 平台构建一个应用程序,该应用程序依赖于通过 REST API 调用进行通信的 Web 应用程序。 Web 应用程序有自己的用户界面来定义实体,并托管在三个环境中以便于管理。 test.mydomain.com 用于开发和质量保证团队测试; uat.mydomain.com 供项目利益相关者验证,mydomain.com 供公共最终用户验证。

经过必要的验证和验证后,所做的任何更改都会经过测试->uat->生命周期。

移动应用程序还具有三种风格 - 测试; uat;居住。测试版本指向 test.mydomain.com 作为 API 端点,并由开发人员和测试人员通过 USB 部署加载到平板电脑和手机上。 对于 uat,使用 testflight 或其 Android 等效项;对于 live,则使用应用程序商店。

当公开发布错误报告时,我们希望使用开发人员可以在 test.mydomain.com 中自由获取的测试数据来重现该报告。 但是,从应用程序商店下载的应用程序将指向实时服务器 mydomain.com 作为其 API 端点。当然,我们可以获取应用程序版本的确切源代码提交、构建和测试,但我希望在应用程序中动态地更改 API 端点,以便我可以测试许多场景。

“动态”这个词的意思是我想在运行时更改 API 端点,就像通过设置菜单一样。 缺点是普通最终用户不应该访问此菜单,我想用密码保护它。然后密码就变得通用了,为了避免这种情况,我必须想出一些其他的逻辑。

关于如何动态/在运行时切换 API 端点,但同时不允许最终用户使用此功能,是否有更好的想法? 我想到了 Android 的解决方案,当构建号被点击 7 次时公开“开发者设置”。但在此之前请先检查一下。

android ios development-environment endpoint
2个回答
0
投票

我们可以通过创建多个方案动态切换API端点,并在每个方案中指定应用程序的端点,这样每次更改应用程序端点时都可以选择该方案,而不是每次手动更改端点


0
投票

您可以在 android 端使用 okhttp3.Interceptor 来实现此行为。通过拦截 api 调用来更改基本 url。

1- 只需创建一个拦截器和一个包含基本 url 的基本 url 持有者。

class BaseUrlInterceptor (var baseUrlHolder: BaseUrlHolder) : Interceptor {
    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {
        var request = chain.request()
        val builder = request.newBuilder()
        baseUrlHolder.baseUrl?.let {
            adjustBaseUrl(request.url)?.let {
                request = builder.url(it).build()
            }
        }
        return chain.proceed(request)
    }

    private fun adjustBaseUrl(url: HttpUrl): HttpUrl? {
        return baseUrlHolder.baseUrl?.let {
            url.newBuilder().host(it.toHttpUrl().host).build()
        }
    }
}
data class BaseUrlHolder(
    var baseUrl : String?= null
)

2-如果您使用任何依赖注入库,请创建一个单例 BaseUrlHolder 来调整基本 url。如果您不使用任何内容,则可以将其保持静态,或者可以实现手动依赖项注入。您需要从想要更改基本网址的任何地方访问此 BaseUrlHolder。

3-然后将拦截器添加到您的 OkHttpClient.Builder 中。

...
val yourHttpClientBuilder= OkHttpClient.Builder()
yourHttpClientBuilder.addInterceptor(
                BaseUrlInterceptor({$yourSingletonBaseUrlHolder})
            )
...

4- 此时,当您更改 {$yourSingletonBaseUrlHolder}.baseUrl 时,您将更改该 http 客户端的 api 调用的基本 url。

{$yourSingletonBaseUrlHolder}.baseUrl = {myNewBaseUrl}

5-如果您有多个http客户端和多个基本url,只需为每个客户端创建多个BaseUrlHolder和多个拦截器,并使用它们的拦截器和BaseUrlHolder进行拦截。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.