Вызовы API
Эта страница — про кирпичики, из которых складывается вызов API во FlutterFlow. В конкретном запросе понадобится часть из них или все сразу — зависит от того, как устроен сервис.
- Заголовки
- Параметры запроса
- Переменные
- Тело запроса
- JSON и типы данных
- JSON-путь
- Дополнительные настройки
Заголовки
Заголовки несут служебную информацию о запросе и ответе. Они делятся на две группы:
- Заголовки запроса описывают, что именно запрашивается и кто запрашивает.
- Заголовки ответа несут дополнительные сведения от сервера.
Передача заголовков
Чаще всего нужны два:
- Authorization — авторизация запроса.
- Content-Type — тип содержимого при отправке тела запроса в POST, PUT или PATCH.
Как их задать:
- Откройте вкладку Headers и нажмите + Add Header.
- Введите имя заголовка, двоеточие и значение — например, Content-Type: application/json.
Для POST-запроса Content-Type по умолчанию — application/json, так что для JSON его можно не указывать.
Токен авторизации
Закрытые API отдают данные только при наличии токена в заголовке.
Постоянный токен
Некоторые сервисы выдают токен, который не меняется, пока вы сами не выпустите новый.
- Откройте вкладку Headers и нажмите + Add Header.
- Введите Authorization, двоеточие и значение — например, Authorization: Bearer YOUR_TOKEN.
Динамический токен
Чаще токен приходит в ответе на запрос входа и меняется при каждом входе — значит, подставлять его нужно динамически.
После успешного входа сохраните токен в переменную App State с включённым Persisted:

Дальше:
- Откройте вкладку Headers и нажмите + Add Header.
- Введите Authorization, двоеточие и имя переменной в квадратных скобках — например, Authorization: Bearer [auth_token].
- Откройте вкладку Variables и создайте переменную с тем же именем.
Теперь при вызове API значение подставляется из переменной App State.
Чтение заголовков ответа
Иногда нужное лежит не в теле ответа, а в его заголовках — например, токен после входа.
- Убедитесь, что действие вызова API добавлено и у него задано Action Output Variable Name.
- Там, где Value Source = From Variable, выберите Action Outputs > [имя переменной] — скажем,
loginResponse. - Задайте API Response Options = Get Response Header.
- Введите Header Name — он должен совпадать с именем заголовка в ответе.
- Нажмите Confirm.
Параметры запроса
Параметры уточняют, какие данные вернуть. Они дописываются в конец адреса после знака ? парами «ключ — значение».
Пример из NASA Open API:
https://api.nasa.gov/neo/rest/v1/feed?start_date=2015-09-07&end_date=2015-09-08&api_key=DEMO_KEY
Здесь start_date, end_date и api_key — параметры запроса.
Ещё пример: в адресе https://www.breakingbadapi.com/api/characters?limit=20&offset=0 параметр limit задаёт число записей на странице, а offset — сколько записей пропустить. Так устроена постраничная выдача со смещением.
Как их задать
Для запросов GET и DELETE:
- Откройте вкладку Query Parameters и нажмите + Add Query Parameter.
- Введите Name параметра.
- Задайте Value Source — Specific Value или From Variable.
- Для динамического значения выберите From Variable и укажите готовую переменную (как создать переменную) либо нажмите + Create New Variable. Переменная создастся сразу с именем параметра, но её Type нужно задать во вкладке Variables.
- Для постоянного значения выберите Specific Value, задайте Type и введите Value.
Пример для адреса https://api.instantwebtools.net/v2/passenger?page=10&size=20:
Изредка параметры нужны и в запросах POST, PUT и PATCH. Тогда:
- Замените в адресе жёстко заданное значение именем в скобках:
https://api.instantwebtools.net/v2/passenger?page=[page]. - Откройте вкладку Variables и создайте переменную с тем же именем.
Переменные
Переменные передают в вызов API данные из приложения:
- токен авторизации из состояния приложения — в заголовок;
- имя и пароль из полей ввода — в тело запроса;
- выбранные даты — в параметры;
- динамическую часть — в базовый адрес.
Создание переменных
Откройте вкладку Variables, введите Name, выберите Type и при необходимости задайте Default Value.

Дальше значения передаются при вызове API со страницы — из виджета, переменной App State или другого источника.
Так выглядит динамический базовый адрес:

Тело запроса
Запросы POST, PUT и PATCH передают данные в теле. Чаще всего — в формате JSON.
Форматы тела
JSON
- Если переменных ещё нет, создайте их — например,
usernameиpasswordдля передачи со страницы входа. - Откройте вкладку Body и выберите JSON.
- Вставьте своё тело запроса и замените значения переменными, перетащив их в нужные места.
Text
Текстовый формат нужен, когда тело — это, скажем, XML для SOAP-запроса.
- Если переменных ещё нет, создайте их.
- Откройте вкладку Body и выберите Text.
- Вставьте тело запроса и подставьте переменные перетаскиванием.
x-www-form-urlencoded
- Если переменных ещё нет, создайте их.
- Откройте вкладку Body и выберите x-www-form-urlencoded.
- Нажмите + Add Parameter и введите Name.
- Задайте Value Source — Specific Value или From Variable.
- Для динамического значения выберите From Variable и укажите переменную либо создайте новую кнопкой + Create New Variable; её Type задаётся во вкладке Variables.
- Для постоянного значения выберите Specific Value, задайте Type и Value.
Multipart
Multipart передаёт в одном запросе несколько частей данных — так обычно загружают файлы.
- Откройте вкладку Body и выберите Multipart.
- Нажмите + Add Parameter и введите Name.
- Задайте Value Source = From Variable и создайте переменную кнопкой + Create New Variable.
- Во вкладке Variables задайте её Type = Uploaded File — тогда в запрос можно передать файл, полученный действием Upload/Save Media.
JSON и типы данных
Ответ API можно разбирать в собственный тип данных, а при отправке — собирать JSON из такого типа. Это те самые сериализация и десериализация.
Так надёжнее, чем ходить по JSON-путям вручную: опечатка в пути обнаружится в лучшем случае при тестировании, а несоответствие типов — сразу.
Тип данных под структуру ответа
Сначала создайте тип данных с той же структурой, что и ответ API.

Дальше данные можно разбирать в тип или собирать из типа.
Из JSON в тип данных
Разберём на примере списка товаров из этого API:

Порядок действий:
- Создайте тип данных под структуру ответа.
- Откройте вызов API: Response & Test > Response Type и включите Parse as Data Type. Выберите нужный Data Type — в примере это «AllProducts».

-
На виджете ListView после добавления запроса к API задайте:
- Generate Children from Variable с API Response Options = As Data Type.
- Available Options = Data Structure Field — нам нужно только поле со списком товаров, а не служебные
totalиskip. - Select Field — поле со списком, в примере это «products».
- Дважды нажмите Confirm.
- Дальше данные привязываются к виджетам как обычно: Available Options = Data Structure Field и нужное поле в Select Field.
Из типа данных в JSON
Тело запроса можно собирать из объекта, а не описывать поле за полем в редакторе вызова.
Пример — добавление товара:

Порядок действий:
- Создайте тип данных под структуру тела запроса:

- В вызове API создайте переменную типа JSON и подставьте её в раздел Body.
- По нажатию кнопки Add значения из интерфейса записываются в переменную состояния страницы с этим типом данных. При вызове API передайте её и задайте Available Options = To JSON.
JSON-путь
JSONPath — язык запросов к JSON: по такому выражению из ответа достаётся ровно то, что нужно.
Ответ API почти всегда приходит в формате JSON.
Несколько выражений покрывают большинство задач, а конструктор подсказывает подходящие пути и показывает результат сразу.
Примеры выражений:
$.data.name$.users[0].name$.users[:].name
Знак $ означает корень, точка — обращение к ключу, число в скобках ([0]) — индекс элемента массива, а [:] выбирает все элементы списка.
Разберём на конкретном ответе:
{
"page": 1,
"per_page": 6,
"total": 3,
"total_pages": 2,
"data": [
{
"id": 1,
"email": "george.bluth@reqres.in",
"first_name": "George",
"last_name": "Bluth",
"avatar": "https://reqres.in/img/faces/1-image.jpg"
},
{
"id": 2,
"email": "janet.weaver@reqres.in",
"first_name": "Janet",
"last_name": "Weaver",
"avatar": "https://reqres.in/img/faces/2-image.jpg"
},
{
"id": 3,
"email": "emma.wong@reqres.in",
"first_name": "Emma",
"last_name": "Wong",
"avatar": "https://reqres.in/img/faces/3-image.jpg"
}
],
"support": {
"url": "https://reqres.in/#support-heading",
"text": "To keep ReqRes free, contributions towards server costs are appreciated!"
}
}
$.total
Вернёт:
3
$.data
Вернёт:
[
{
"id": 1,
"email": "george.bluth@reqres.in",
"first_name": "George",
"last_name": "Bluth",
"avatar": "https://reqres.in/img/faces/1-image.jpg"
},
{
"id": 2,
"email": "janet.weaver@reqres.in",
"first_name": "Janet",
"last_name": "Weaver",
"avatar": "https://reqres.in/img/faces/2-image.jpg"
},
{
"id": 3,
"email": "emma.wong@reqres.in",
"first_name": "Emma",
"last_name": "Wong",
"avatar": "https://reqres.in/img/faces/3-image.jpg"
}
]
$.data[0]
Вернёт объект с индексом 0 — то есть первый:
{
"id": 1,
"email": "george.bluth@reqres.in",
"first_name": "George",
"last_name": "Bluth",
"avatar": "https://reqres.in/img/faces/1-image.jpg"
}
$.data[0].email
Вернёт значение поля email у первого объекта:
"george.bluth@reqres.in"
$.data[:].email
Вернёт адреса почты всех объектов из data:
[
"george.bluth@reqres.in",
"janet.weaver@reqres.in",
"emma.wong@reqres.in"
]
Ключи JSON начинаются с буквы, подчёркивания или знака доллара, но не с цифры. Если ключ всё же начинается с цифры — например, 0_image, — обращайтесь к нему через скобки: $.["0_image"].
Подробности о JSONPath и о том, как составлять выражения.
Сохранённые JSON-пути
Часто используемые пути удобно сохранить и дальше выбирать их из списка как Predefined Path.
Сначала создайте и протестируйте вызов. В разделе JSON Paths нажмите + Add JSON Path, введите выражение и дайте ему имя. Если выражение верное, под ним появится Response Preview; значок Preview открывает полный ответ. Для списка значений опция Is List включится сама.
В разделе Recommended конструктор предлагает пути, где, скорее всего, лежат нужные данные.
Использование пути
Обращаясь к значению из ответа, можно ввести путь вручную или взять сохранённый.
Выберите ответ вашего API, задайте API Response Options = JSON Body, а Available Options — JSON Path или Predefined Path, и укажите имя пути.
Дополнительные настройки
Здесь вызов делают приватным и меняют настройки прокси.
Приватные вызовы
Приватный вызов нужен, когда в запросе есть токен или секрет, которому не место в коде приложения: такой вызов идёт через облачные функции Firebase.

Откройте вкладку Advanced Settings, включите Make Private, нажмите Save, а затем Deploy APIs.
Дополнительно можно потребовать, чтобы вызов выполнялся только авторизованным пользователем, — переключатель Require Authentication.
Приватные API разворачиваются как Cloud Functions в вашем проекте Firebase. При этом настраиваются:
-
Use Custom Name for Cloud Function — своё имя облачной функции; по умолчанию она называется
ffPrivateApiCall. -
Private API Cloud Function Instances — число экземпляров функции:
- Min Instances — сколько экземпляров держать «тёплыми», чтобы избежать холодного старта. Значение больше нуля ускоряет отклик, но стоит денег.
- Max Instances — предел масштабирования под нагрузкой.
Чтобы не платить лишнего, Min Instances можно оставить равным 0. Цены — на странице тарифов Cloud Functions.
- Для приватных вызовов к проекту должен быть подключён Firebase — см. инструкцию.
- Для Require Authentication должна быть настроена аутентификация Firebase.
Потоковый ответ
Если API отдаёт данные непрерывно — например, через Server Sent Events, — включите эту настройку: приложение будет принимать поток по длительному HTTP-соединению и показывать обновления по мере поступления.
Так работает, скажем, приложение с онлайн-табло спортивных результатов.
Поддерживает ли API потоковую передачу, обычно видно в его документации — по словам «event stream» или «processing chunks».
Как устроены потоковые API.
Настройки прокси
При тестировании вызовов в конструкторе, а также в режимах Run и Test запросы идут через прокси — иначе мешает политика CORS. При желании можно указать свой прокси.
- Откройте вкладку Advanced Settings.
- Выключите Use Proxy for Test и/или Use Proxy for Run/Test Mode.
- Включите Use Custom Proxy URL.
- Введите Proxy Prefix URL — например, https://your-proxy-server.com.

Кеширование результатов
Для отдельного вызова можно включить кеширование: повторные обращения с теми же аргументами будут брать данные из кеша. Подробнее — в разделе о кешировании запросов.
Чтение ответа как UTF-8
Обычно сервер сам сообщает кодировку ответа, но не всегда. Эта настройка заставляет читать ответ как UTF-8 в любом случае.
Перехватчики
Перехватчик (interceptor) вклинивается между приложением и сервером: он видит запрос до отправки и ответ до того, как тот дойдёт до приложения. Через него добавляют токены, ведут журнал и обрабатывают ошибки.
Запрос сначала попадает в перехватчик: тот может изменить его — дописать заголовки, поправить адрес — или вовсе отменить. Ответ проходит обратный путь.
Как добавить перехватчик:
-
Откройте вкладку Advanced Settings.
-
Нажмите + Add Interceptors и выберите + Create New Interceptor — откроется редактор кастомного действия.
-
Введите Action Name.
-
В заготовке кода опишите обработку запроса в функции
onRequest, а обработку ответа — вonResponse. -
Сохраните действие и проверьте, нет ли ошибок.
-
Новый перехватчик появится в списке API interceptors.
- К одному вызову можно добавить несколько перехватчиков.
- Если перехватчик нужен нескольким вызовам, соберите их в группу и добавьте его в Advanced Group Settings; для отдельного вызова внутри группы его можно переопределить.
:::tip[Видео] Если удобнее посмотреть:
Частые вопросы
Почему сохранённый JSON-путь не появляется в списке?
Чаще всего путь добавили, но забыли сохранить сам вызов API. Нажмите Save после изменений — тогда FlutterFlow увидит сохранённые пути.
Откуда ошибка «Current variable is not valid»?
Виджет получает не тот тип данных, которого ждёт: например, в текстовый виджет передали список цветов. Приведите значение к подходящему типу — скажем, к строке.