POST /v1/configs¶
Получение актуального набора параметров для проекта по токену доступа. Метод использует POST (а не GET) для обратной совместимости — в будущем в теле можно будет передавать контекст для таргетинга условий.
Параметры запроса¶
Body
Тело запроса пустое.
Пример будущего тела запроса ›
{
"conditions": {
"country": "DE",
"appVersion": "2.3.1"
},
"experiments": {
"checkout_redesign": "B"
}
}
Параметры ответа¶
Response
Плоский JSON-объект с параметрами конфигурации, где каждый ключ — идентификатор параметра, а значение — его актуальное значение. Ключ, тип параметра и значение определяются настройками в панели управления.
Примеры значений ›
| Тип | Пример |
|---|---|
| String | "Добро пожаловать!" |
| Boolean | true |
| Number | 500 или 7.5 |
| JSON | "{\"default\":\"card\",\"methods\":[\"card\"]}" |
Особенность обработки типа JSON
Если параметр имеет тип
JSON, его значение будет возвращено в виде экранированной строки, а не вложенного JSON-объекта. Вам потребуется дополнительный парсинг этой строки в вашем коде.
Примеры запроса¶
curl -X POST https://<DOMAIN>/v1/configs \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json"
import requests
url = "https://<DOMAIN>/v1/configs"
headers = {
"Authorization": "Bearer <API_KEY>",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers)
response.raise_for_status()
config = response.json()
const url = "https://<DOMAIN>/v1/configs";
const options = {
method: "POST",
headers: {
"Authorization": "Bearer <API_KEY>",
"Content-Type": "application/json"
}
};
fetch(url, options)
.then(response => {
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
return response.json();
})
.then(config => console.log(config))
.catch(error => console.error('Error fetching config:', error));
using System.Net.Http.Headers;
using System.Text.Json;
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://<DOMAIN>/v1/configs");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<API_KEY>");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
var config = await response.Content.ReadFromJsonAsync<Dictionary<string, JsonElement>>();
package main
import (
"encoding/json"
"net/http"
)
func main() {
client := &http.Client{}
req, _ := http.NewRequest("POST", "https://<DOMAIN>/v1/configs", nil)
req.Header.Add("Authorization", "Bearer <API_KEY>")
res, err := client.Do(req)
if err != nil { /* ... обработка ошибки ... */ }
defer res.Body.Close()
var config map[string]interface{}
json.NewDecoder(res.Body).Decode(&config)
}
import okhttp3.*;
import org.json.JSONObject;
import java.io.IOException;
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://<DOMAIN>/v1/configs")
.post(RequestBody.create(new byte[0]))
.addHeader("Authorization", "Bearer <API_KEY>")
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
JSONObject config = new JSONObject(response.body().string());
}
В параметре <DOMAIN> указывается адрес вашего сервера:
- On-premises / Private Cloud: используйте ваш корпоративный домен.
- SaaS: версия в разработке (домен будет предоставлен после выпуска).
Примеры ответа¶
{
"isNewFeatureEnabled": true,
"maxUsers": 500,
"welcomeText": "Добро пожаловать!",
"paymentOptions": "{\"methods\":[\"card\",\"apple_pay\",\"google_pay\"],\"default\":\"card\"}"
}
{}
Примеры обработки ответа¶
Лучшая практика: Отказоустойчивый доступ
Всегда указывайте локальное значение по умолчанию при получении параметра из конфигурации. Это делает приложение устойчивым к непредвиденным ситуациям — например, удалению параметра в панели администратора.
import json
# Boolean
is_feature_enabled: bool = config.get('isNewFeatureEnabled', False)
# Number
max_users: int = config.get('maxUsers', 0)
# String
welcome_text: str = config.get('welcomeText', '')
# JSON (требует дополнительного парсинга)
payment_options_str = config.get('paymentOptions', '{}')
payment_options = json.loads(payment_options_str)
methods = payment_options.get('methods', [])
default_method = payment_options.get('default', '')
// Boolean
const isFeatureEnabled = config.isNewFeatureEnabled ?? false;
// Number
const maxUsers = config.maxUsers ?? 0;
// String
const welcomeText = config.welcomeText ?? '';
// JSON (требует дополнительного парсинга)
const paymentOptionsStr = config.paymentOptions ?? '{}';
const paymentOptions = JSON.parse(paymentOptionsStr);
const methods = paymentOptions.methods ?? [];
const defaultMethod = paymentOptions.default ?? '';
using System.Text.Json;
using System.Collections.Generic;
using System.Linq;
// Boolean
bool isFeatureEnabled = config.TryGetValue("isNewFeatureEnabled", out var boolEl)
&& boolEl.ValueKind == JsonValueKind.True;
// Number
int maxUsers = config.TryGetValue("maxUsers", out var numEl) ? numEl.GetInt32() : 0;
// String
string welcomeText = config.TryGetValue("welcomeText", out var strEl) ? strEl.GetString() : "";
// JSON (требует дополнительного парсинга)
string paymentOptionsStr = config.TryGetValue("paymentOptions", out var jsonEl)
? jsonEl.GetString() : "{}";
var paymentOptions = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(paymentOptionsStr);
List<string> methods = new List<string>();
if (paymentOptions.TryGetValue("methods", out var methodsEl) && methodsEl.ValueKind == JsonValueKind.Array)
{
methods = methodsEl.EnumerateArray().Select(m => m.GetString()).ToList();
}
string defaultMethod = "";
if (paymentOptions.TryGetValue("default", out var defaultEl) && defaultEl.ValueKind == JsonValueKind.String)
{
defaultMethod = defaultEl.GetString();
}
import "encoding/json"
// Boolean
isFeatureEnabled, _ := config["isNewFeatureEnabled"].(bool)
// Number
maxUsers, _ := config["maxUsers"].(float64)
// String
welcomeText, _ := config["welcomeText"].(string)
// JSON (требует дополнительного парсинга)
var paymentOptions map[string]interface{}
if paymentOptionsStr, ok := config["paymentOptions"].(string); ok {
json.Unmarshal([]byte(paymentOptionsStr), &paymentOptions)
}
var methods []string
if methodsInterface, ok := paymentOptions["methods"].([]interface{}); ok {
for _, m := range methodsInterface {
if methodStr, ok := m.(string); ok {
methods = append(methods, methodStr)
}
}
}
defaultMethod, _ := paymentOptions["default"].(string)
import org.json.JSONObject;
import org.json.JSONArray;
import java.util.ArrayList;
import java.util.List;
// Boolean
boolean isFeatureEnabled = config.optBoolean("isNewFeatureEnabled", false);
// Number
int maxUsers = config.optInt("maxUsers", 0);
// String
String welcomeText = config.optString("welcomeText", "");
// JSON (требует дополнительного парсинга)
String paymentOptionsStr = config.optString("paymentOptions", "{}");
JSONObject paymentOptions = new JSONObject(paymentOptionsStr);
JSONArray methodsArray = paymentOptions.optJSONArray("methods");
List<String> methods = new ArrayList<>();
if (methodsArray != null) {
for (int i = 0; i < methodsArray.length(); i++) {
methods.add(methodsArray.getString(i));
}
}
String defaultMethod = paymentOptions.optString("default", "");
См. также¶
- Все методы Remote Config API
- Создание параметра — пошаговая инструкция через интерфейс
- Управление параметрами — руководство по управлению