Перейти к содержанию

POST /v1/configs

Получение актуального набора параметров для проекта по токену доступа. Метод использует POST (а не GET) для обратной совместимости — в будущем в теле можно будет передавать контекст для таргетинга условий.


Параметры запроса

Body application/json
Тело запроса пустое.
Пример будущего тела запроса
{
    "conditions": {
        "country": "DE",
        "appVersion": "2.3.1"
    },
    "experiments": {
        "checkout_redesign": "B"
    }
}

Параметры ответа

Response 200 OK · application/json
Плоский JSON-объект с параметрами конфигурации, где каждый ключ — идентификатор параметра, а значение — его актуальное значение. Ключ, тип параметра и значение определяются настройками в панели управления.
Примеры значений
ТипПример
String"Добро пожаловать!"
Booleantrue
Number500 или 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", "");

См. также