#API
Чужая программа может читать и писать справочники сайта по HTTP. Так подключают склад, 1С, мобильное приложение или свой скрипт выгрузки.
Адрес один на все справочники:
https://ваш-сайт.ru/api/v1/lists/…Почему один адрес, а не свой на каждый справочник.
Справочник — это и статьи, и товары, и заявки. Заводить отдельный адрес под каждый значило бы переписывать API всякий раз, когда владелец сайта заводит новый справочник. Поэтому справочник называется номером в адресе, а работа с ним одна и та же.
#Что умеет
| Метод | Адрес | Что делает |
|---|---|---|
GET | /api/v1/lists/ | перечень справочников |
GET | /api/v1/lists/{id}/fields/ | поля справочника |
GET | /api/v1/lists/{id}/records/ | записи |
POST | /api/v1/lists/{id}/records/ | завести запись |
GET | /api/v1/lists/{id}/records/{rid}/ | одна запись |
PATCH | /api/v1/lists/{id}/records/{rid}/ | правка |
DELETE | /api/v1/lists/{id}/records/{rid}/ | удалить |
PUT работает наравне с PATCH — оба правят только присланные поля.
#Чего не умеет намеренно
Заводить и удалять сами справочники. Это меняет схему базы, и такое делают руками, глядя на последствия, а не запросом из чужой программы. Поля справочника тоже правятся только в панели.
#Что нужно для начала
- Завести ключ в разделе Настройки → Ключи API.
- Узнать номер справочника — он виден в адресе панели и в ответе
GET /api/v1/lists/. - Слать запросы с заголовком
Authorization: Bearer <ключ>.
curl -H "Authorization: Bearer ВАШ_КЛЮЧ" \
https://ваш-сайт.ru/api/v1/lists/<?php
$ch = curl_init('https://ваш-сайт.ru/api/v1/lists/');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: Bearer ВАШ_КЛЮЧ'],
]);
$answer = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($answer['lists'] as $list) {
echo $list['id'], ' — ', $list['title'], PHP_EOL;
}import requests
r = requests.get(
'https://ваш-сайт.ru/api/v1/lists/',
headers={'Authorization': 'Bearer ВАШ_КЛЮЧ'},
timeout=15,
)
r.raise_for_status()
for item in r.json()['lists']:
print(item['id'], '—', item['title'])const res = await fetch('https://ваш-сайт.ru/api/v1/lists/', {
headers: { Authorization: 'Bearer ВАШ_КЛЮЧ' },
});
if (!res.ok) throw new Error('HTTP ' + res.status);
const { lists } = await res.json();
for (const list of lists) console.log(list.id, '—', list.title);{
"ok": true,
"lists": [
{"id": 1, "name": "pages", "title": "Страницы"},
{"id": 4, "name": "blog", "title": "Записи блога"}
]
}Не хотите набирать это руками — откройте песочницу: там запрос собирается полями, выполняется прямо со страницы, а код на всех четырёх языках получается сам.
#Как устроен ответ
У любого ответа есть поле ok.
{"ok": true, "records": []}
{"ok": false, "error": "Справочника нет."}Ответы не кешируются и отдаются как application/json; charset=utf-8.
Завершающий слеш в адресе обязателен.
Веб-сервер приводит адрес без слеша к адресу со слешем постоянным
перенаправлением. GET это переживает, а PATCH и DELETE — плохо:
клиент по умолчанию повторяет их методом GET и без тела. Запрос
формально «проходит», а запись остаётся нетронутой.