# Интеграция Baserow с Appsmith - настройка через REST API

> Свяжите Appsmith и Baserow без платного шлюза: единый Datasource на Database-токене, запросы GET/POST/PATCH и двухшаговая загрузка файлов в строку.

Source: https://opennix.org/docs/baserow/integrations/appsmith-integration/


Appsmith собирает внутренние панели, дашборды и CRUD-приложения, а открытая редакция Baserow служит для них реляционным хранилищем данных - связка строится на одном защищённом Datasource в Appsmith и Database-токене Baserow, а ниже описаны настройка источника данных, паттерны чтения и записи строк и двухшаговая загрузка файлов.

## Обзор

Центральный элемент интеграции - **Datasource** (источник данных) в Appsmith: все запросы на чтение, создание, изменение и удаление строк проходят через одно и то же защищённое подключение, поэтому токен Baserow нигде не дублируется вручную внутри отдельных запросов приложения.

## Требования

- **Baserow:** [Database-токен](/docs/baserow/webhook-api/personal-api-tokens/) с правами `Create`, `Read`, `Update` и `Delete`.
- **Appsmith:** учётная запись - облачная или self-hosted.

## Шаг 1. Настройка универсального Datasource

Не прописывайте токен API в каждом запросе отдельно - используйте функцию Appsmith **Authenticated Datasource** (аутентифицированный источник данных), чтобы хранить токен на сервере и переиспользовать его во всём приложении.

1. В Appsmith откройте **Datasources** → **New Datasource** → **Authenticated API**.
2. **Name:** `Baserow API`.
3. **URL:** `https://api.baserow.io` (или адрес self-hosted инстанса).
4. **Authentication:**
   - **Type:** API Key.
   - **Key:** `Authorization`
   - **Value:** `Token [ВАШ_DATABASE_ТОКЕН]` (между словом «Token» и токеном должен быть пробел).
   - **Add To:** Header.
5. Нажмите **Save**.

## Шаг 2. Паттерн чтения (GET)

Чтобы заполнить виджет Table или List данными из Baserow:

1. Создайте новый запрос на базе Datasource `Baserow API`.
2. **Method:** `GET`
3. **Path:** `/api/database/rows/table/[TABLE_ID]/`
4. **Parameters:**
   - Key: `user_field_names` | Value: `true` (обязательно - иначе поля вернутся как `field_123`, а не по названию).
5. **Bind to Widget:** в свойстве **Table Data** виджета Table укажите `{{ get_rows.data.results }}`.

## Шаг 3. Паттерн записи (POST/PATCH)

Baserow использует `POST` для создания строк и `PATCH` для их изменения.

### Создание строки (POST)

- **Path:** `/api/database/rows/table/[TABLE_ID]/`
- **Parameter:** `user_field_names` = `true`
- **Body (JSON):**

```json
{
  "Name": "{{ InputName.text }}",
  "Status": "{{ SelectStatus.selectedOptionValue }}",
  "Active": {{ CheckboxActive.isChecked }}
}
```

### Изменение строки (PATCH)

Запрос нацелен на конкретный идентификатор строки.

- **Path:** `/api/database/rows/table/[TABLE_ID]/{{ Table1.triggeredRow.id }}/`
- **Body (JSON):** включайте только те поля, которые нужно изменить.

```json
{
  "Status": "Archived"
}
```

## Шаг 4. Двухшаговая загрузка файлов

Baserow работает с файлами иначе, чем большинство простых API: файл нельзя отправить напрямую в строку. Сначала файл **(1) загружается** на сервер, затем результат **(2) привязывается** к строке.

### Действие А. Загрузка бинарных данных (вспомогательный запрос)

Создайте запрос с именем `upload_file`.

- **Method:** `POST`
- **Path:** `/api/user-files/upload-file/`
- **Headers:** `Content-Type`: `multipart/form-data`
- **Body:** Form Data
  - Key: `file` | Type: `File` | Value: `{{ FilePicker1.files[0] }}`

*Ответ:* Baserow возвращает хеш `name` (например, `"abcd-1234-image.png"`).

### Действие Б. Привязка к строке (основной запрос)

Создайте запрос с именем `link_file_to_row`.

- **Method:** `PATCH`
- **Path:** `/api/database/rows/table/[TABLE_ID]/{{ Table1.selectedRow.id }}/`
- **Body (JSON):**

```json
{
  "Documents": [
    {
      "name": "{{ upload_file.data.name }}"
    }
  ]
}
```

### Логика workflow

В виджете **FilePicker** назначьте событию **onFilesSelected** запуск JS-объекта:

```javascript
export default {
  async handleUpload() {
    // 1. Загружаем файл в хранилище Baserow
    await upload_file.run();

    // 2. Привязываем полученный хеш файла к нужной строке
    await link_file_to_row.run();

    // 3. Обновляем таблицу, чтобы показать новый файл
    await get_rows.run();
  }
}
```

## Рекомендации

- **Пагинация.** Включите Server Side Pagination в виджете Table Appsmith и передавайте `&page={{Table1.pageNo}}` в GET-запрос к Baserow - это позволяет эффективно работать с большими таблицами.
- **Поля с одним выбором.** Если в таблице Baserow есть [поле с одним выбором](/docs/baserow/field-types/single-select-field/), при создании строки через API нужно передавать точное текстовое значение варианта (с учётом регистра) либо числовой идентификатор опции.

## Часто задаваемые вопросы

**Нужен ли отдельный сервис автоматизации между Appsmith и Baserow?** Нет - оба паттерна, чтение и запись, реализуются напрямую через [REST API базы данных Baserow](/docs/baserow/webhook-api/database-api/) и один Datasource в Appsmith; промежуточный сервис можно добавить, но обязательным он не является.

**Что произойдёт, если отправить файл вместе с остальными полями строки в одном запросе?** Ничего не сохранится - Baserow принимает файлы только через отдельный эндпоинт загрузки, поэтому запрос на создание или изменение строки всегда идёт после того, как файл уже загружен и получен его хеш.

**Как быть с очень большими таблицами Baserow в списке или таблице Appsmith?** Используйте параметр `page` GET-запроса вместе с серверной пагинацией виджета - так Appsmith будет запрашивать данные постранично вместо однократной загрузки всех строк.

Смежные темы - [настройка Database-токенов](/docs/baserow/webhook-api/personal-api-tokens/) для ограничения доступа сторонних приложений и [обзор REST API Baserow](/docs/baserow/webhook-api/database-api/) с полным списком эндпоинтов для чтения, записи и удаления строк.

