Данный официальный документ содержит ТЗ-ёпту для проекта https://png.sijeko.ru/
Этот проект является рабочим инструментом, который используется ежедневно.
Если вы не понимаете какого-то термина или сокращения в данном ТЗ-ёпте, оно предназначено не для вас, до свидания.
Приложение представляет собой типичное клиент-серверное взаимодействие с использованием принципа REST.
Приложение на Ангуляре, Реакте или Бекбоне, я хуй ебу.
Главная страница: перетягиваем файлы изображений в бразуер, для каждого создаётся очередь оптимизации. Картинка добавляется в начало списка заблюренным кружком, который также является и круглым прогресс-баром. Раз в одну-две секунды опрашиваются перетянутые файлы, чтобы узнать прогресс выполнения. Когда оптимизация завершена (прогресс 100%), видим ссылку на изображение и эскиз. При возможности, добавить также ссылку на скачивание WebP-версии изображения.
Служебные страницы (статика):
Необходимо использовать History API, чтобы в урлах не было решёток.
Базовый урл: /api/v1
К базовому урлу добавляются все нижеперечисленные урлы HTTP-запросов (GET /images
→ GET /api/v1/images
).
Серверное API умеет возвращать данные в форматах JSON и XML.
Форматом ответа можно управлять с помощью заголовка запроса Accept
:
Accept: application/json
— выдать данные в формате JSON;Accept: application/xml
— выдать данные в формате XML.По умолчанию возвращается JSON, он же указан в примерах.
Целые числа, если не указано иное, являются беззнаковыми 64-разрядными целыми числами.
GET /images
Получить последние оптимизированные изображения.
В случае успешной обработки запроса возвращает 200 OK
и массив вида:
[
{
//… Объект вида `GET /image/@id`
},
{
//…
}
// …
]
По умолчанию возвращает 24 последних файла. Если нужно получить другое количество,
необходимо воспользоваться GET-параметром count
.
Например, для получения 12 последних файлов: GET /image?count=12
.
POST /images
Добавить изображение в очередь задач.
Поддерживаются форматы: PNG, BMP, GIF, PNM, TIFF.
Поскольку оптитимизация — долгосрочный процесс, запрос не ждёт её завершения,
а сразу возвращает идентификатор очереди оптимизаци, он же — идентификатор изображения (@id
).
При успешной поставновке изображения в очередь, возвращается код 201 Created
, с заголовками X-Id
и Location
.
Например:
201 Created
X-Id: asdf123w
Location: /api/v1/image/asdf123w
HEAD /images/@id
Проверить изображение в очереди. Возвращает прогресс выполнения оптимизации, либо урл файла, если он готов.
Пример незавершённого процесса (66,7%):
X-Progress: 66.7
Пример завершённого процесса (100%):
X-Progress: 100
Location: /api/v1/image/asdf123w
GET /images/@id
Получить изображение.
При успешном запросе возвращает 200 OK
и объект:
{
"id": "asdf123w", // Идентификатор
"name": "имя файла.png", // Имя исходного файла
"size": 66777, // Размер оптимизированного файла в байтах
"width": 66777, // Ширина изображения в пикселях
"height": 66777, // Высота изображения в пикселях
"mime": "image/png", // MIME-тип файла
"original": 77666, // Размер исходного файла в байтах
"ratio": 0.859797, // Коэффициент сжатия (size / original)
"success": true, // Была ли оптимизация успешной (size < original)
"webp": true, // Удалось ли получить WebP-версию файла
"webpSize": 6777, // Размер WebP-файла (если удалось его получить)
"time": 66, // Время, затраченное на оптмизицацию, в секундах
"createdAt": 66, // Таймштамп начала оптимизации
"optimizedAt": 66, // Таймштамп завершения оптимизации
"url": "/i/asdf123w.png", // Ссылка на просмотр файла
"downloadUrl": "66.png", // Ссылка на скачивание файла
"webpUrl": "66.png.webp", // Ссылка на скачивание WebP-файла (если он есть)
//… // Возможно, ещё какая-нибудь служебная информация
}