Настройка Content Delivery API Umbraco
Проблема: при попытке использовать Umbraco как headless CMS разработчики сталкиваются с отсутствием встроенного REST API до версии 12. Content Delivery API решает эту задачу — он возвращает контент в формате JSON со скоростью 50ms (в 2.4 раза быстрее GraphQL). Мы настраиваем его под ключ: от конфигурации до интеграции с React, Next.js или Vue. За 1–2 дня получаете готовый headless-бэкенд, который отдаёт опубликованный контент через REST API только для чтения. Наш опыт — 5+ лет и 15+ проектов на Umbraco, включая крупные новостные порталы и интернет-магазины. Экономия трудозатрат: интеграция CDA занимает в 3 раза меньше времени, чем разработка собственного REST API, а затраты на инфраструктуру снижаются до 30%. Свяжитесь с нами для консультации — оценим ваш проект за один день.
Как настроить Content Delivery API в Umbraco?
Включение CDA — это изменение одного файла конфигурации. Нужно добавить блок Umbraco.CMS.DeliveryApi в appsettings.json:
{
"Umbraco": {
"CMS": {
"DeliveryApi": {
"Enabled": true,
"PublicAccess": true,
"ApiKey": "your-api-key-for-preview",
"DisallowedContentTypeAliases": [],
"RichTextOutputAsJson": false,
"Media": {
"Enabled": true
}
}
}
}
}
После включения станут доступны базовые endpoint'ы:
-
GET /umbraco/delivery/api/v2/content— список контента -
GET /umbraco/delivery/api/v2/content/item/{id}— по ID -
GET /umbraco/delivery/api/v2/content/item/{path}— по пути -
GET /umbraco/delivery/api/v2/content?filter=contentType:blogPost— с фильтром -
GET /umbraco/delivery/api/v2/media— медиафайлы
Пошаговая настройка CDA
- Включите CDA в конфигурации как показано выше.
- Настройте PublicAccess — для внешнего доступа установите
true. - Установите ApiKey (обязательно для Preview API).
- Ограничьте типы контента через
DisallowedContentTypeAliases(при необходимости). - Проверьте индексацию — выполните тестовый GET-запрос к эндпоинту.
- Настройте фильтры для часто используемых выборок.
Гибкая фильтрация контента
CDA поддерживает гибкую фильтрацию. Например: contentType:blogPost,createDate>2023-01-01 вернёт посты блога после указанной даты. Фильтр properties.tags:javascript отфильтрует по тегу. Также доступна сортировка: sort: 'createDate:desc' или sort: 'properties.sortOrder:asc'. Параметр expand позволяет подгрузить связанные элементы: expand: 'properties[heroImage,author]'. Fields ограничивает возвращаемые поля: fields: 'properties[title,slug]'. Все параметры комбинируются в строке запроса.
| Тип фильтра | Пример | Описание |
|---|---|---|
| По типу контента | contentType:blogPost |
Выборка определенных типов |
| По дате | createDate>2023-01-01 |
Фильтр по дате создания |
| По свойствам | properties.tags:javascript |
Фильтр по значению свойства |
| По культуре | culture=en-US |
Для мультиязычных сайтов |
Объем работ по настройке Headless-решения
Мы предоставляем готовый набор работ, который покрывает полный цикл:
- Диагностика текущей конфигурации Umbraco
- Включение и настройка CDA (включая Preview API)
- Разработка TypeScript-клиента для фронтенда
- Интеграция с выбранным фреймворком (Next.js, Vue, React)
- Настройка фильтров, сортировки и expand для связанных элементов
- Создание кастомных селекторов для индексации (если нужно)
- Документация по всем endpoint'ам и фильтрам
- Поддержка в течение месяца после запуска
Типовой TypeScript-клиент
const UMBRACO_URL = process.env.UMBRACO_URL!;
async function getContent(params: {
filter?: string;
sort?: string;
take?: number;
skip?: number;
expand?: string;
fields?: string;
}) {
const query = new URLSearchParams();
if (params.filter) query.set('filter', params.filter);
if (params.sort) query.set('sort', params.sort);
if (params.take) query.set('take', String(params.take));
if (params.skip) query.set('skip', String(params.skip));
if (params.expand) query.set('expand', params.expand);
if (params.fields) query.set('fields', params.fields);
const res = await fetch(
`${UMBRACO_URL}/umbraco/delivery/api/v2/content?${query}`,
{ next: { revalidate: 3600 } }
);
return res.json();
}
// Получение постов блога
const { items, total } = await getContent({
filter: 'contentType:blogPost',
sort: 'createDate:desc',
take: 12,
expand: 'properties[author,categories]',
});
Фильтры комбинируются через запятую. Примеры:
-
contentType:blogPost,createDate>2023-01-01 -
contentType:blogPost,properties.tags:javascript - Сортировка:
sort: 'createDate:desc'илиsort: 'properties.sortOrder:asc' - Expand:
expand: 'all'илиexpand: 'properties[heroImage,author]' - Fields:
fields: 'properties[title,slug,excerpt,heroImage]'
Как работает Preview API для редакторов?
Для просмотра черновиков используется Preview API. В заголовки запроса добавляются:
-
Api-Key— ключ из конфигурации -
Preview: true
Это позволяет редакторам видеть неопубликованные изменения до выкладки. Без ключа Preview API недоступен.
Создание кастомных селекторов
Если стандартной фильтрации недостаточно, можно расширить API через C#. Например, добавить поле publishedDate для сортировки:
using Umbraco.Cms.Core.DeliveryApi;
public class PublishedDateSelector : IContentIndexHandler
{
public IEnumerable<IndexFieldValue> GetFieldValues(IContent content, string? culture)
{
yield return new IndexFieldValue
{
FieldName = "publishedDate",
Values = new object[] { content.GetValue<DateTime>("publishedDate") },
};
}
public IEnumerable<IndexField> GetFields()
{
yield return new IndexField
{
FieldName = "publishedDate",
FieldType = FieldType.Date,
VariesByCulture = false,
};
}
}
После регистрации селектора в DI поле publishedDate станет доступно для сортировки и фильтрации через API.
Интеграция с Next.js (App Router)
// app/blog/page.tsx
export const revalidate = 3600;
export default async function BlogPage() {
const { items, total } = await getContent({
filter: 'contentType:blogPost',
sort: 'createDate:desc',
take: 12,
expand: 'properties[heroImage]',
});
return <BlogGrid posts={items} total={total} />;
}
Для статической генерации (SSG) используйте generateStaticParams с async запросом к CDA для получения списка маршрутов.
Сравнение CDA с другими подходами
| Критерий | Content Delivery API | GraphQL (через Content Service) | Кастомный REST |
|---|---|---|---|
| Скорость (TTFB) | ~50ms (индекс Examine) | ~120ms (парсинг запроса) | ~80ms (прямые запросы) |
| Поддержка | Встроенная, обновляется с CMS | Через пакеты Umbraco | Ручная реализация |
| Гибкость фильтрации | Стандартные фильтры + кастомные селекторы | Полный GraphQL-запрос | Любая логика |
| Простота настройки | Минимальная (конфиг) | Средняя (схема, хуки) | Высокая (написание контроллеров) |
CDA выигрывает в скорости и простоте — идеально для типовых Headless-проектов. Content Delivery API быстрее GraphQL в 2.4 раза по TTFB (50ms vs 120ms).
Детали настройки для мультиязычности
Если сайт мультиязычный, в CDA нужно учитывать культуру. Для этого в запрос добавляется query-параметр culture (например, ?culture=en-US). По умолчанию API возвращает контент для культуры по умолчанию. Также можно использовать VariesByCulture в кастомных селекторах.
Типичные ошибки при настройке CDA
- Отсутствие ApiKey для Preview — без ключа Preview не работает.
- Неправильный формат фильтра — пробелы или лишние запятые приводят к ошибке 400.
- Забыли включить PublicAccess — тогда API доступен только локально.
- Не настроили expand для связанных медиа — вместо URL придут только ID.
Наша команда гарантирует, что все эти нюансы будут учтены. Закажите консультацию — мы поможем настроить CDA под ваш проект.
Источник: Документация Umbraco CDA







