Действительно, полностью избавиться от инструкций и команд не получается.
Мы делаем вот так:
1. docker-compose up api собирает связанные через depends_on образы и запускает их.
2. Все команды на запущенных контейнерах стараемся убирать в Makefile.
Что-то вроде:
# Makefile
migrate:
docker-compose run api bundle exec rake db:migrate
После доклада меня спрашивали несколько раз про этот подход, когда фронтенд-разработчик всё запускает не локально, а использует отдельный staging- или dev-сервер для разработки.
Этот способ работает и имеет свои плюсы, но не лишен и недостатков.
Вот некоторые из них:
Невозможность работать офлайн или при плохом Интернете. Многие любят работать из дома, деревни или в дороге.
Необходимость делить один и тот же ресурс с другими разработчиками и тестировщиками. У нас были случаи, когда приходилось создавать необходимую для разработки сущность новости с названием «НЕ УДАЛЯТЬ!», чтобы кто-то её случайно не грохнул. Но, всё равно это периодически случалось.
Такой сервер достаточно хрупкий. Было несколько ситуаций, когда бекенд-разработчики или эскплуатация начинали шатать сервак. Или, к примеру, накатывали туда какие-нибудь ломающие изменения. Это останавливало разработку у всей команды.
Stateless означает, что сервер не хранит никакого состояния о сессии клиента на стороне сервера.
Сессия клиента хранится на клиенте. Сервер stateless означает, что каждый сервер может обслуживать любого клиента в любое время, нет "близости" сессий или "липких" сессий. Соответствующая информация о сессии сохраняется на клиенте и при необходимости передается на сервер.
Это единственный способ масштабирования до миллионов одновременно работающих пользователей.
Note: RFC 7231 specifies that a DELETE request may include a body, but that a server may reject the request. This spec defines the semantics of a server, and we are defining its semantics for JSON:API.
В докладе я говорю о том, что любое решение будет работать. Но вместо того, чтобы спорить по поводу правильных HTTP-кодов и названий полей, вроде isSuccess, лучше взять готовую спеку и начать делать то, что нужно заказчику.
Получается немного, да.
Но я думаю, что при составлении спецификации решили, что в данном случае единообразие интерфейса и минимизация ошибок важнее избыточности.
В спеке есть про это, если я правильно понял Ваше замечание.
Some clients, like IE8, lack support for HTTP’s PATCH method. API servers that wish to support these clients are recommended to treat POST requests as PATCH requests if the client includes the X-HTTP-Method-Override: PATCH header. This allows clients that lack PATCH support to have their update requests honored, simply by adding the header.
Note: The above example URI shows unencoded [ and ] characters simply for readability. In practice, these characters must be percent-encoded, per the requirements in RFC 3986.
Локальное разворачивание позволяет развернуть у себя любую ветку API.
Например, вот так:
Действительно, полностью избавиться от инструкций и команд не получается.
Мы делаем вот так:
1. docker-compose up api собирает связанные через depends_on образы и запускает их.
2. Все команды на запущенных контейнерах стараемся убирать в Makefile.
Что-то вроде:
Этот способ работает и имеет свои плюсы, но не лишен и недостатков.
Вот некоторые из них:
docker stats
.Видим, что БД заняла 19 МБ, а API на Java — 352 МБ.
У нас у разработчиков от 8 до 16 ГБ оперативной памяти. Обычно, этого хватает.
По личному опыту, большую часть оперативной памяти во время разработки съедает IDE, Chrome, Telegram, Slack, а не запущенные docker-контейнеры.
С сериализацией/десериализацией проблем особо не было никогда. Обыкновенная работа со структурами данных.
Тут профит в том, что структура jsonapi-сущности документирована и исключает споры, тогда как «самых простых сериализаций» может быть несколько.
Мы используем загрузку файлов через Multipart.
Relationships (считай join) связывает представления, которые могут быть получены откуда угодно.
Stateless означает, что сервер не хранит никакого состояния о сессии клиента на стороне сервера.
Сессия клиента хранится на клиенте. Сервер stateless означает, что каждый сервер может обслуживать любого клиента в любое время, нет "близости" сессий или "липких" сессий. Соответствующая информация о сессии сохраняется на клиенте и при необходимости передается на сервер.
Это единственный способ масштабирования до миллионов одновременно работающих пользователей.
Полее подробно с картинками описано в диссертации Роя Филдинга.
Да, конечно.
REST — передача состояния представления.
Естественно, представление может быть получено откуда угодно.
Это зависит от реализации сервера.
RFC 3986 никак не определяет формат передачи массива через GET-параметры.
В общем случае на сервер придёт строка вся
query string
.Если сервер разберёт её по аргументам, то, скорее всего, будет вот так:
Если игнорирование и будет, то только если оно специально так настроено.
http://springbot.github.io/json-api/extensions/bulk/#deleting-multiple-resources
Но я думаю, что при составлении спецификации решили, что в данном случае единообразие интерфейса и минимизация ошибок важнее избыточности.
jsonapi.org/recommendations/#patchless-clients
На вопрос тоже нашёл ответ в спеке:
jsonapi.org/format/#fetching-sparse-fieldsets