В этом документе описывается, как программно читать и изменять набор параметров и условий в формате JSON, известный как шаблон Remote Config . Это позволяет вносить изменения в шаблон на бэкенде, который клиентское приложение может получить с помощью клиентской библиотеки.
Используя REST API Remote Config или Admin SDK , описанные в этом руководстве, вы можете обойти управление шаблоном в консоли Firebase и напрямую интегрировать изменения Remote Config в свои процессы. Например, с помощью внутренних API Remote Config вы можете:
- Планирование обновлений Remote Config . Используя вызовы API совместно с заданием cron, вы можете изменять значения Remote Config по регулярному расписанию.
- Пакетный импорт значений конфигурации для эффективного перехода из вашей собственной системы в Firebase Remote Config .
Используйте Remote Config с Cloud Functions for Firebase , изменяя значения в вашем приложении в зависимости от событий, происходящих на стороне сервера. Например, вы можете использовать Remote Config для продвижения новой функции в вашем приложении, а затем автоматически отключить это продвижение, как только вы определите, что с новой функцией взаимодействует достаточное количество пользователей.
В следующих разделах руководства описываются операции, которые можно выполнять с помощью API-интерфейсов Remote Config . Чтобы ознакомиться с кодом, выполняющим эти задачи через REST API, см. один из следующих примеров приложений:
- Быстрый старт Java для Firebase Remote Config REST API
- Быстрый старт REST API удаленной настройки Firebase для Node.js
- Быстрый старт Python для Firebase Remote Config REST API
Изменение удаленной конфигурации с помощью Firebase Admin SDK
Admin SDK — это набор серверных библиотек, позволяющих взаимодействовать с Firebase из привилегированных сред. Помимо обновления Remote Config , Admin SDK обеспечивает генерацию и проверку токенов аутентификации Firebase, чтение и запись в Realtime Database и т. д. Подробнее о предварительных требованиях и настройке Admin SDK см. в статье «Добавление Firebase Admin SDK на сервер» .
В типичном процессе Remote Config вы можете получить текущий шаблон, изменить некоторые параметры или группы параметров и условия, проверить шаблон и опубликовать его. Перед выполнением этих вызовов API необходимо авторизовать запросы из SDK.
Инициализируйте SDK и авторизуйте запросы API.
При инициализации Admin SDK без параметров SDK использует учётные данные Google Application Default Credentials и считывает параметры из переменной среды FIREBASE_CONFIG
. Если содержимое переменной FIREBASE_CONFIG
начинается с символа {
оно будет интерпретировано как JSON-объект. В противном случае SDK предполагает, что строка — это имя JSON-файла, содержащего параметры.
Например:
Node.js
const admin = require('firebase-admin'); admin.initializeApp();
Ява
FileInputStream serviceAccount = new FileInputStream("service-account.json"); FirebaseOptions options = FirebaseOptions.builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options);
Получить текущий шаблон удаленной конфигурации
При работе с шаблонами Remote Config помните, что они версионируются, и что каждая версия имеет ограниченный срок жизни с момента создания до момента замены её обновлением: 90 дней, а общее количество хранимых версий ограничено 300. Подробнее см. в разделе «Шаблоны и версионирование» .
Вы можете использовать внутренние API для получения текущей активной версии шаблона Remote Config в формате JSON.
Параметры и значения параметров, созданные специально как варианты в эксперименте A/B Testing не включаются в экспортируемые шаблоны.
Чтобы получить шаблон:
Node.js
function getTemplate() { var config = admin.remoteConfig(); config.getTemplate() .then(function (template) { console.log('ETag from server: ' + template.etag); var templateStr = JSON.stringify(template); fs.writeFileSync('config.json', templateStr); }) .catch(function (err) { console.error('Unable to get template'); console.error(err); }); }
Ява
Template template = FirebaseRemoteConfig.getInstance().getTemplateAsync().get(); // See the ETag of the fetched template. System.out.println("ETag from server: " + template.getETag());
Изменить параметры удаленной конфигурации
Вы можете программно изменять и добавлять параметры и группы параметров Remote Config . Например, к существующей группе параметров с именем «new_menu» можно добавить параметр для управления отображением сезонной информации:
Node.js
function addParameterToGroup(template) { template.parameterGroups['new_menu'].parameters['spring_season'] = { defaultValue: { useInAppDefault: true }, description: 'spring season menu visibility.', }; }
Ява
template.getParameterGroups().get("new_menu").getParameters() .put("spring_season", new Parameter() .setDefaultValue(ParameterValue.inAppDefault()) .setDescription("spring season menu visibility.") );
API позволяет создавать новые параметры и группы параметров, а также изменять значения по умолчанию, условные значения и описания. Во всех случаях после внесения изменений необходимо явно опубликовать шаблон.
Изменить условия удаленной конфигурации
Вы можете программно изменять и добавлять условия и условные значения Remote Config . Например, чтобы добавить новое условие:
Node.js
function addNewCondition(template) { template.conditions.push({ name: 'android_en', expression: 'device.os == \'android\' && device.country in [\'us\', \'uk\']', tagColor: 'BLUE', }); }
Ява
template.getConditions().add(new Condition("android_en", "device.os == 'android' && device.country in ['us', 'uk']", TagColor.BLUE));
Во всех случаях после внесения изменений необходимо явно опубликовать шаблон.
API-интерфейсы Remote Config предоставляют несколько условий и операторов сравнения, которые можно использовать для изменения поведения и внешнего вида приложения. Подробнее об условиях и поддерживаемых для них операторах см. в справочнике по условным выражениям .
Проверьте шаблон удаленной конфигурации
При желании вы можете проверить свои обновления перед публикацией, как показано ниже:
Node.js
function validateTemplate(template) { admin.remoteConfig().validateTemplate(template) .then(function (validatedTemplate) { // The template is valid and safe to use. console.log('Template was valid and safe to use'); }) .catch(function (err) { console.error('Template is invalid and cannot be published'); console.error(err); }); }
Ява
try { Template validatedTemplate = FirebaseRemoteConfig.getInstance() .validateTemplateAsync(template).get(); System.out.println("Template was valid and safe to use"); } catch (ExecutionException e) { if (e.getCause() instanceof FirebaseRemoteConfigException) { FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause(); System.out.println("Template is invalid and cannot be published"); System.out.println(rcError.getMessage()); } }
Этот процесс проверки проверяет наличие ошибок, таких как дублирование ключей для параметров и условий, недопустимые имена условий или несуществующие условия, а также некорректный формат e-тегов. Например, запрос, содержащий больше допустимого количества ключей (2000), вернёт сообщение об ошибке Param count too large
.
Опубликовать шаблон удаленной конфигурации
Получив шаблон и внеся в него необходимые изменения, вы можете опубликовать его. Публикация шаблона, описанная в этом разделе, заменяет весь существующий шаблон конфигурации обновлённым файлом, а новому активному шаблону присваивается номер версии на единицу больше, чем у заменяемого им шаблона.
При необходимости вы можете использовать REST API для отката к предыдущей версии . Чтобы снизить риск ошибок при обновлении, можно выполнить проверку перед публикацией .
Персонализации и условия Remote Config включены в загружаемые шаблоны, поэтому важно помнить о следующих ограничениях при попытке публикации в другом проекте:
Персонализации нельзя импортировать из проекта в проект.
Например, если в вашем проекте включены персонализации, а вы загрузили и отредактировали шаблон, вы можете опубликовать его в том же проекте, но не сможете опубликовать его в другом проекте, пока не удалите персонализации из шаблона.
Условия можно импортировать из проекта в проект, но учтите, что любые конкретные условные значения (например, идентификаторы приложений или аудитории) должны существовать в целевом проекте до публикации.
Например, если у вас есть параметр Remote Config , который использует условие, указывающее значение платформы
iOS
, шаблон можно опубликовать в другом проекте, поскольку значения платформы одинаковы для всех проектов. Однако, если он содержит условие, зависящее от конкретного идентификатора приложения или аудитории пользователей, которых нет в целевом проекте, валидация завершится неудачей.Если шаблон, который вы планируете опубликовать, содержит условия, зависящие от Google Analytics , в целевом проекте необходимо включить Analytics .
Node.js
function publishTemplate() { var config = admin.remoteConfig(); var template = config.createTemplateFromJSON( fs.readFileSync('config.json', 'UTF8')); config.publishTemplate(template) .then(function (updatedTemplate) { console.log('Template has been published'); console.log('ETag from server: ' + updatedTemplate.etag); }) .catch(function (err) { console.error('Unable to publish template.'); console.error(err); }); }
Ява
try { Template publishedTemplate = FirebaseRemoteConfig.getInstance() .publishTemplateAsync(template).get(); System.out.println("Template has been published"); // See the ETag of the published template. System.out.println("ETag from server: " + publishedTemplate.getETag()); } catch (ExecutionException e) { if (e.getCause() instanceof FirebaseRemoteConfigException) { FirebaseRemoteConfigException rcError = (FirebaseRemoteConfigException) e.getCause(); System.out.println("Unable to publish template."); System.out.println(rcError.getMessage()); } }
Изменение удаленной конфигурации с помощью REST API
В этом разделе описаны основные возможности REST API Remote Config по адресу https://firebaseremoteconfig.googleapis.com
. Подробности см. в справочнике по API .
Получите токен доступа для аутентификации и авторизации запросов API.
Проекты Firebase поддерживают учётные записи служб Google, которые можно использовать для вызова API сервера Firebase с сервера приложений или доверенной среды. Если вы разрабатываете код локально или развёртываете приложение локально, вы можете использовать учётные данные, полученные через эту учётную запись службы, для авторизации запросов к серверу.
Чтобы аутентифицировать учетную запись службы и предоставить ей доступ к службам Firebase, необходимо сгенерировать файл закрытого ключа в формате JSON.
Чтобы создать файл закрытого ключа для вашей учетной записи службы:
В консоли Firebase откройте Настройки > Учетные записи служб .
Нажмите «Сгенерировать новый закрытый ключ» , затем подтвердите, нажав «Сгенерировать ключ» .
Надежно сохраните JSON-файл, содержащий ключ.
При авторизации через учётную запись сервиса у вас есть два варианта предоставления учётных данных приложению. Вы можете либо установить переменную среды GOOGLE_APPLICATION_CREDENTIALS , либо явно передать путь к ключу учётной записи сервиса в коде. Первый вариант более безопасен и настоятельно рекомендуется.
Чтобы установить переменную окружения:
Задайте переменную окружения GOOGLE_APPLICATION_CREDENTIALS , указав путь к JSON-файлу, содержащему ключ вашей учётной записи сервиса. Эта переменная применяется только к текущему сеансу оболочки, поэтому при открытии нового сеанса задайте её заново.
Linux или macOS
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"
Окна
С PowerShell:
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\service-account-file.json"
После выполнения указанных выше шагов Application Default Credentials (ADC) сможет неявно определить ваши учетные данные, что позволит вам использовать учетные данные учетной записи службы при тестировании или запуске в средах, отличных от Google.
Используйте свои учетные данные Firebase вместе с библиотекой Google Auth Library для предпочитаемого вами языка, чтобы получить кратковременный токен доступа OAuth 2.0:
node.js
function getAccessToken() {
return admin.credential.applicationDefault().getAccessToken()
.then(accessToken => {
return accessToken.access_token;
})
.catch(err => {
console.error('Unable to get access token');
console.error(err);
});
}
В этом примере клиентская библиотека API Google аутентифицирует запрос с помощью веб-токена JSON (JWT). Подробнее см. в разделе Веб-токены JSON .
Питон
def _get_access_token():
"""Retrieve a valid access token that can be used to authorize requests.
:return: Access token.
"""
credentials = ServiceAccountCredentials.from_json_keyfile_name(
'service-account.json', SCOPES)
access_token_info = credentials.get_access_token()
return access_token_info.access_token
Ява
public static String getAccessToken() throws IOException {
GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(new FileInputStream("service-account.json"))
.createScoped(Arrays.asList(SCOPES));
googleCredentials.refreshAccessToken();
return googleCredentials.getAccessToken().getTokenValue();
}
По истечении срока действия токена доступа автоматически вызывается метод обновления токена для получения обновленного токена доступа.
Чтобы разрешить доступ к Remote Config , запросите область действия https://www.googleapis.com/auth/firebase.remoteconfig
.
Измените шаблон удаленной конфигурации
При работе с шаблонами Remote Config помните, что они версионируются, и что каждая версия имеет ограниченный срок жизни с момента создания до момента замены её обновлением: 90 дней, а общее количество хранимых версий ограничено 300. Подробнее см. в разделе «Шаблоны и версионирование» .
Получить текущий шаблон удаленной конфигурации
Вы можете использовать внутренние API для получения текущей активной версии шаблона Remote Config в формате JSON.
Параметры и значения параметров, созданные специально как варианты в эксперименте A/B Testing не включаются в экспортируемые шаблоны.
Используйте следующие команды:
cURL
curl --compressed -D headers -H "Authorization: Bearer token" -X GET https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -o filename
Эта команда выводит полезную нагрузку JSON в один файл, а заголовки (включая Etag) — в отдельный файл.
Необработанный HTTP-запрос
Host: firebaseremoteconfig.googleapis.com GET /v1/projects/my-project-id/remoteConfig HTTP/1.1 Authorization: Bearer token Accept-Encoding: gzip
Этот вызов API возвращает следующий JSON вместе с отдельным заголовком, содержащим ETag , который вы используете для последующего запроса.
Проверьте шаблон удаленной конфигурации
При желании вы можете проверить обновления перед их публикацией. Для проверки обновлений шаблона добавьте к запросу на публикацию параметр URL ?validate_only=true
. В ответе код статуса 200 и обновлённый etag с суффиксом -0
означают, что обновление успешно проверено. Любой ответ, отличный от 200, означает, что данные JSON содержат ошибки, которые необходимо исправить перед публикацией.
Обновите шаблон удаленной конфигурации
Получив шаблон и внеся необходимые изменения в JSON-контент, вы можете опубликовать его. Публикация шаблона, описанная в этом разделе, заменяет весь существующий шаблон конфигурации обновлённым файлом, а новому активному шаблону присваивается номер версии на единицу больше, чем у заменяемого им шаблона.
При необходимости вы можете использовать REST API для отката к предыдущей версии . Чтобы снизить риск ошибок при обновлении, можно выполнить проверку перед публикацией .
Персонализации и условия Remote Config включены в загружаемые шаблоны, поэтому важно помнить о следующих ограничениях при попытке публикации в другом проекте:
Персонализации нельзя импортировать из проекта в проект.
Например, если в вашем проекте включены персонализации, а вы загрузили и отредактировали шаблон, вы можете опубликовать его в том же проекте, но не сможете опубликовать его в другом проекте, пока не удалите персонализации из шаблона.
Условия можно импортировать из проекта в проект, но учтите, что любые конкретные условные значения (например, идентификаторы приложений или аудитории) должны существовать в целевом проекте до публикации.
Например, если у вас есть параметр Remote Config , который использует условие, указывающее значение платформы
iOS
, шаблон можно опубликовать в другом проекте, поскольку значения платформы одинаковы для всех проектов. Однако, если он содержит условие, зависящее от конкретного идентификатора приложения или аудитории пользователей, которых нет в целевом проекте, валидация завершится неудачей.Если шаблон, который вы планируете опубликовать, содержит условия, зависящие от Google Analytics , в целевом проекте необходимо включить Analytics .
cURL
curl --compressed -H "Content-Type: application/json; UTF8" -H "If-Match: last-returned-etag" -H "Authorization: Bearer token" -X PUT https://firebaseremoteconfig.googleapis.com/v1/projects/my-project-id/remoteConfig -d @filename
Для этой команды curl
вы можете указать содержимое, используя символ «@», за которым следует имя файла.
Необработанный HTTP-запрос
Host: firebaseremoteconfig.googleapis.com PUT /v1/projects/my-project-id/remoteConfig HTTP/1.1 Content-Length: size Content-Type: application/json; UTF8 Authorization: Bearer token If-Match: expected ETag Accept-Encoding: gzip JSON_HERE
Поскольку это запрос на запись, ETag изменяется этой командой, и обновленный ETag предоставляется в заголовках ответа следующей команды PUT
.
Изменить условия удаленной конфигурации
Вы можете программно изменять условия и значения условий Remote Config . При использовании REST API необходимо напрямую редактировать шаблон, чтобы изменить условия перед его публикацией.
{ "conditions": [{ "name": "android_english", "expression": "device.os == 'android' && device.country in ['us', 'uk']", "tagColor": "BLUE" }, { "name": "tenPercent", "expression": "percent <= 10", "tagColor": "BROWN" }], "parameters": { "welcome_message": { "defaultValue": { "value": "Welcome to this sample app" }, "conditionalValues": { "tenPercent": { "value": "Welcome to this new sample app" } }, "description": "The sample app's welcome message" }, "welcome_message_caps": { "defaultValue": { "value": "false" }, "conditionalValues": { "android_english": { "value": "true" } }, "description": "Whether the welcome message should be displayed in all capital letters." } } }
Приведённые выше изменения сначала определяют набор условий, а затем определяют значения по умолчанию и значения параметров, зависящие от условий ( условные значения ), для каждого параметра. Также добавляется необязательное описание для каждого элемента; как и комментарии к коду, они предназначены для использования разработчиками и не отображаются в приложении. Для контроля версий также предусмотрен ETag .
API-интерфейсы Remote Config предоставляют несколько условий и операторов сравнения, которые можно использовать для изменения поведения и внешнего вида приложения. Подробнее об условиях и поддерживаемых для них операторах см. в справочнике по условным выражениям .
Коды ошибок HTTP
Код статуса | Значение |
---|---|
200 | Успешно обновлено |
400 | Произошла ошибка проверки. Например, запрос, содержащий больше ключей, чем допустимо (2000), вернёт код 400 (недопустимый запрос) с сообщением об ошибке « Param count too large . Этот код состояния HTTPS может также возникать в следующих двух ситуациях:
|
401 | Произошла ошибка авторизации (токен доступа не был предоставлен или API Firebase Remote Config REST не был добавлен в ваш проект в Cloud Developer Console) |
403 | Произошла ошибка аутентификации (предоставлен неверный токен доступа) |
500 | Произошла внутренняя ошибка. Если возникла эта ошибка, отправьте запрос в службу поддержки Firebase. |
Код статуса 200 означает, что шаблон Remote Config (параметры, значения и условия проекта) обновлен и теперь доступен приложениям, использующим этот проект. Другие коды статуса указывают на то, что шаблон Remote Config , существовавший ранее, всё ещё действует.
После отправки изменений в шаблон перейдите в консоль Firebase и убедитесь, что изменения отображаются так, как ожидалось. Это крайне важно, поскольку порядок условий влияет на их оценку (вступает в силу первое условие, которое оказывается true
).
Использование ETag и принудительные обновления
REST API Remote Config использует тег сущности (ETag) для предотвращения состояний гонки и перекрывающихся обновлений ресурсов. Подробнее об ETag см. в разделе ETag - HTTP .
Для REST API Google рекомендует кэшировать ETag, предоставленный последней командой GET
, и использовать это значение ETag в заголовке запроса If-Match
при выполнении команд PUT
. Если команда PUT
возвращает код состояния HTTPS 409, следует выполнить новую команду GET
, чтобы получить новый ETag и шаблон для использования в следующей команде PUT
.
Вы можете обойти ETag и предоставляемую им защиту, принудительно обновив шаблон Remote Config следующим образом: If-Match: *
Однако этот подход не рекомендуется, поскольку он может привести к потере обновлений шаблона Remote Config , если несколько клиентов обновляют Remote Config . Подобный конфликт может возникнуть, если несколько клиентов используют API, или при конфликтующих обновлениях от клиентов API и пользователей консоли Firebase .
Инструкции по управлению версиями шаблонов Remote Config см. в разделе Шаблоны Remote Config и управление версиями .