如何在Android Retrofit中外部化基本URL

时间:2019-04-04 14:43:22

标签: android retrofit

我们现在有一个Android应用,可以使用Retrofit正常工作。我们正在尝试自动化构建以进行测试和产品发布,以减少人为错误的可能性(例如,开发人员在为生产而构建时忘记将基本URL指向产品。等)

我注意到翻新的基本URL在类文件中定义。是否可以使用任何方法将其配置为在属性文件或xml中,以便我们可以使用Gradle脚本选择要包含在构建中的正确文件?

谢谢

5 个答案:

答案 0 :(得分:2)

您可以在buildTypes中定义一个常量:

buildTypes {
    debug {
        buildConfigField "String", "API_URL", "\"https://url/pre/\""
    }
    release {
        buildConfigField "String", "API_URL", "\"https://url/pro/\""
    }
}

然后在改造生成器中使用它:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BuildConfig.API_URL)
    .build();

请注意,如果您有不同的模块,则在每个模块中都定义BuildConfig。对于这种情况,我在app模块中定义buildTypes,并在使用改造生成器对该模块的调用中将BuildConfig.API_URL作为参数传递。

答案 1 :(得分:0)

您可以创建一个类似于“ urls.xml”的文件,并以字符串形式获取您的url。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="base_url">https://www.myurl.com</string>
</resources>

这样,您可以根据自己的风格和构建类型配置不同的url。

答案 2 :(得分:0)

除了Gradle构建类型配置外,如果您的逻辑比几个字段(或确切的实现)多,则可以通过将其放置在正确的文件夹中来定义仅存在于flavor / build-type中的类/文件。

例如,您可以创建一个config文件(Java / Kotlin),而不是将其放置在模块的main/java/example/package/config.java文件夹中,而是将其放置在debug/java/example/package/config.java和{{1 }}使用相同的程序包名称,以区分那些构建类型的实现。

以您的示例为例,该文件可以包含一个静态字段release/java/example/package/config.java,该字段在不同的构建类型/风味上具有不同的值。

这也可以用完全相同的方式完成。

答案 3 :(得分:0)

好吧,昨天我只是被困在这个问题上,却找不到任何能解决我问题的东西,所以这就是我的工作方式:

在需要BASEURL或任何内容时随时创建一个公共类,并在其中创建公共静态字符串名称(BASE)并在其中输入基本URL。

现在从改造类中访问该类,并在BASEURL.BASE之类的baseURL方法中选择该静态元素;

为什么我需要做一些事情,例如Retrofit .baseurl方法只需要一个静态字符串,当我们从strings.xml访问一个字符串时,将其保存为静态字符串会产生一些错误,所以这是我解决的另一种方法效果很好,将为您服务。

答案 4 :(得分:0)

我认为由 Gradle 执行此类任务是最佳选择,因为它可以轻松自动化构建过程。但我将通过 build.gradle(:app) 与图像共享执行此过程的过程,因为我们需要支付额外费用在 buildTypes 中添加 API URL 时注意 java 的 escape sequence 否则 URL 将无法在 BuildConfig 中正确生成并产生 Cannot resolve ... 错误,如下图 -

enter image description here

所以正确的解决方案是添加遵循转义序列的 URL,如下图所示-

enter image description here