Как экстернализировать базовый URL в Retrofit для Android

#android #retrofit

#Android #модернизация

Вопрос:

Теперь у нас есть приложение для Android, которое отлично работает с помощью Retrofit. Мы пытаемся автоматизировать сборку для тестирования и выпуска продукции, чтобы уменьшить вероятность человеческой ошибки (т. Е. Разработчики забывают указывать базовый URL на производство при сборке для производства .. и т.д.)

Я заметил, что базовый URL для Retrofit определен в файле класса. Есть ли какой-либо метод, который мы можем использовать для настройки его в файле свойств или xml, чтобы мы могли использовать скрипт Gradle для выбора правильного файла для включения в сборку?

Спасибо

Комментарии:

1. Я использую gradle.properties для хранения ключей Api, но я думаю, что этот метод также должен работать для базового URL. Ознакомьтесь с этим руководством. medium.com/code-better /…

Ответ №1:

Вы можете определить константу в своих 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 определен в каждом из них. Для этого случая я определяю buildTypes в модуле приложения и передаю BuildConfig.API_URL в качестве параметра при вызове модуля с помощью конструктора модернизации.

Ответ №2:

Я думаю, что выполнение такого рода задач с помощью Gradle — лучший выбор, потому что он легко автоматизирует процесс сборки.Но я делюсь процессом, чтобы сделать это с помощью build.gradle(:app) изображения, потому что нам нужно уделять особое внимание escape-последовательности Java при добавлении URL-адреса API в buildTypes , иначе URL-адрес не будет правильно генерироваться в BuildConfig и выдавать Cannot resolve ... ошибку, подобную следующим изображениям —

введите описание изображения здесь

Итак, правильное решение заключается в том, чтобы добавить URL-адрес, подчиняющийся escape-последовательности, как на следующем фото-

введите описание изображения здесь

Комментарии:

1. это также можно увидеть в принятом ответе, опубликованном почти за два года до этого

Ответ №3:

Я согласен с @jeprubio, используя gradle, а затем

 .baseUrl(BuildConfig.API_URL)


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

Ответ №4:

Вы можете создать файл типа «urls.xml » и получите ваш URL в виде строки.

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

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

Таким образом, вы можете настроить разные URL-адреса в зависимости от вашего вкуса и типа сборки.

Ответ №5:

Помимо конфигурации типа сборки Gradle, если у вас больше логики, чем несколько полей (или, если быть точным, реализаций), вы можете определить классы / файлы, которые будут существовать только в формате / тип сборки, поместив его в нужную папку.

Например, вы можете создать config файл (Java / Kotlin) и вместо размещения его в main/java/example/package/config.java папке модуля поместить его внутрь debug/java/example/package/config.java и release/java/example/package/config.java с тем же именем пакета, чтобы дифференцировать его реализацию для этих типов сборки.

Для вашего примера этот файл может содержать статическое поле BASE_URL с разными значениями для разных типов сборки / вариантов.

Это можно сделать точно так же и для flavors.

Ответ №6:

Ну, вчера я просто застрял на этой проблеме, не нашел ничего, что могло бы решить мою проблему, так что вот как я заставил ее работать:

создайте общедоступный класс в любое время, когда вы хотите BASEURL или что-нибудь еще, и в нем создайте общедоступную статическую строку с именем anything (BASE), поместите в нее базовый URL.

теперь получите доступ к этому классу из вашего модифицированного класса и выберите этот статический элемент (в методе baseUrl), что-то вроде BASEURL.BASE;

почему мне нужно это сделать, возникла такая проблема, как retrofit.методы baseurl хотят только статическую строку, и когда мы обращаемся к строке из strings.xml сохраните его в статической строке, это выдаст некоторую ошибку, так что это был еще один способ, которым я пришел к решению, что это работает и будет работать для вас.