🐞 Разбор квиза по REST API - ошибки, которые допускают из-за отсутствия насмотренности и опыта 🐞
Пару дней назад я опубликовала вопросы с подвохами по REST API.
✅ Результаты тут
Как всегда, вижу сильный перекос голосов в сторону:
«а давайте всё сделаем через POST» 🙃
Но прежде чем вы начнёте спорить в комментариях, хочу сразу показать простой CRUD на примере управления данными о записи на приём к ветеринару.
Если это HTTP API без REST-подхода, то может получиться так:
Почему это не REST?
❌ В URL используются глаголы, хотя их роль уже могут выполнять HTTP-методы: GET, POST, PUT, PATCH, DELETE.
Если делаете REST API, то запись того же CRUD будет выглядеть так:
Почему это ближе к REST?
✅ В URL нет лишних глаголов.
✅ Действие определяется HTTP-методом.
✅ URL описывает ресурс, а не команду.
*public — это название API. Его можно опустить, но на практике часто полезно сохранять, особенно в микросервисной архитектуре.
❗️Главное правило перед проектированием эндпоинтов RESTful API:
сначала распишите полный набор операций для одного ресурса по CRUD и проверьте, чтобы не было конструкций вроде: POST /objects/create.
Потому что здесь уже возникает дублирование смысла: POST = create, а create ещё раз написан в URL.
Итого, ключевые ошибки в тестировании:
👉 1. Запись на приём
Большинство выбрали верный вариант.
Но много голосов было и за:
❌ POST /appointments/create - это "масло-маслянное"
❌ POST /appointments/{id} - откуда возьмете id? он же присваивается после создания записи на сервере, в БД
👉 2. История записей
По сути это обычное получение списка записей на приём.
Большинство выбрали корректные варианты, но здесь важно помнить ещё одну вещь:
❗️В идеале нужно было в предложенных решениях добавить названия API:
А я их благополучно скрыла от вас.
👉 3. Отмена записи
За DELETE - большинство голосов.
Но отмена записи — это чаще не удаление строки из БД, а изменение статуса.
Поэтому более точный вариант здесь — PATCH, если мы, например, меняем статус записи на cancelled.
DELETE иногда тоже встречается, но с точки зрения бизнес-смысла PATCH здесь обычно аккуратнее.
📌 Почему "все POST" это не REST?
“всё через POST” не доказывает автоматически, что API не REST,
но очень часто означает, что API игнорирует стандартную семантику HTTP и уходит в сторону RPC over HTTP — этот вывод следует из сочетания RFC 9110 и диссертации Филдинга
▫️ HTTP требует уважать семантику методов — RFC 9110
▫️ REST определяется наличием uniform interface и hypermedia constraints — Филдинг, 5.1.5 - “REST APIs must be hypertext-driven”.
Подробный разбор каждого варианта — на картинках к посту 🤝
🖼 Исходники картинок
Полезные материалы, связанные с решением:
📚 Шпаргалка по методам: GET, POST, PUT, PATCH, DELETE
📚 Примеры API с разбором структуры методов
📚 Структура URL в REST API
🩵 Проектирование REST API: спорные вопросы с проектов и собеседований на системного аналитика (и не только)
Пример HTTP API:
https://www.unisender.com/ru/support/api/common/bulk-email/
Пример REST API:
https://developers.avito.ru/api-catalog/job/documentation#operation/applicationsGetIds
#RestApiGA #VetCareGA (Tg | ВК | Max)
Пару дней назад я опубликовала вопросы с подвохами по REST API.
✅ Результаты тут
Как всегда, вижу сильный перекос голосов в сторону:
«а давайте всё сделаем через POST» 🙃
Но прежде чем вы начнёте спорить в комментариях, хочу сразу показать простой CRUD на примере управления данными о записи на приём к ветеринару.
Если это HTTP API без REST-подхода, то может получиться так:
POST /api/public/v1/appointments/create - создать запись
POST /api/public/v1/appointments/{id} - получить запись по id
POST /api/public/v1/appointments/list - получить список записей
POST /api/public/v1/appointments/{id}/update - редактировать запись (отменить)
POST /api/public/v1/appointment/{id}/delete - удалить запись
Почему это не REST?
❌ В URL используются глаголы, хотя их роль уже могут выполнять HTTP-методы: GET, POST, PUT, PATCH, DELETE.
Если делаете REST API, то запись того же CRUD будет выглядеть так:
POST /api/public/v1/appointments - создать запись
GET /api/public/v1/appointments/{id} - получить запись по id
GET /api/public/v1/appointments - получить список записей, не конкретная по id
PATCH /api/public/v1/appointments/{id} - редактировать запись (отменить)
DELETE /api/public/v1/appointments/{id} - удалить запись
Почему это ближе к REST?
✅ В URL нет лишних глаголов.
✅ Действие определяется HTTP-методом.
✅ URL описывает ресурс, а не команду.
*public — это название API. Его можно опустить, но на практике часто полезно сохранять, особенно в микросервисной архитектуре.
❗️Главное правило перед проектированием эндпоинтов RESTful API:
сначала распишите полный набор операций для одного ресурса по CRUD и проверьте, чтобы не было конструкций вроде: POST /objects/create.
Потому что здесь уже возникает дублирование смысла: POST = create, а create ещё раз написан в URL.
Это минимальное, чтобы уйти от HTTP API в сторону REST-а.
Итого, ключевые ошибки в тестировании:
👉 1. Запись на приём
Большинство выбрали верный вариант.
Но много голосов было и за:
❌ POST /appointments/create - это "масло-маслянное"
❌ POST /appointments/{id} - откуда возьмете id? он же присваивается после создания записи на сервере, в БД
👉 2. История записей
По сути это обычное получение списка записей на приём.
Большинство выбрали корректные варианты, но здесь важно помнить ещё одну вещь:
❗️В идеале нужно было в предложенных решениях добавить названия API:
/api/admin/v1
/api/public/v1
А я их благополучно скрыла от вас.
👉 3. Отмена записи
За DELETE - большинство голосов.
Но отмена записи — это чаще не удаление строки из БД, а изменение статуса.
Поэтому более точный вариант здесь — PATCH, если мы, например, меняем статус записи на cancelled.
DELETE иногда тоже встречается, но с точки зрения бизнес-смысла PATCH здесь обычно аккуратнее.
📌 Почему "все POST" это не REST?
“всё через POST” не доказывает автоматически, что API не REST,
но очень часто означает, что API игнорирует стандартную семантику HTTP и уходит в сторону RPC over HTTP — этот вывод следует из сочетания RFC 9110 и диссертации Филдинга
▫️ HTTP требует уважать семантику методов — RFC 9110
▫️ REST определяется наличием uniform interface и hypermedia constraints — Филдинг, 5.1.5 - “REST APIs must be hypertext-driven”.
Подробный разбор каждого варианта — на картинках к посту 🤝
🖼 Исходники картинок
Полезные материалы, связанные с решением:
📚 Шпаргалка по методам: GET, POST, PUT, PATCH, DELETE
📚 Примеры API с разбором структуры методов
📚 Структура URL в REST API
🩵 Проектирование REST API: спорные вопросы с проектов и собеседований на системного аналитика (и не только)
Пример HTTP API:
https://www.unisender.com/ru/support/api/common/bulk-email/
Пример REST API:
https://developers.avito.ru/api-catalog/job/documentation#operation/applicationsGetIds
#RestApiGA #VetCareGA (Tg | ВК | Max)
❤18🔥9⚡4🤩1
This media is not supported in your browser
VIEW IN TELEGRAM
Старенькая серия саус-парка про Интернет… сегодня уже не так смешно 🥲📡
1😁37😢15🤣5💯3🔥2
🩵 REST API vs GraphQL - сравнение с примерами 🩷
Последний вопрос в тесте показал, что с GraphQL знакомы пока немногие.
Либо часть из вас просто не заметила, что вопрос был именно про GraphQL, а не про REST API 🙂
👉 Вопрос был такой:
Какой endpoint выбрать для получения карточки питомца в GraphQL?
Большинство голосов ушло за вариант, который был бы верным для REST API:
Но в GraphQL логика другая.
🩷 GraphQL — это другой подход к проектированию API по сравнению с REST.
Что важно понимать:
✔️ GraphQL обычно работает поверх HTTP
✔️ чаще всего используется один endpoint: POST /graphql
✔️ для запросов только на получение данных также может использоваться GET /graphql
✔️ клиент сам указывает, какие поля хочет получить в ответе
✔️ это помогает не получать лишние данные и в ряде случаев экономить трафик
✔️ ошибки в GraphQL часто возвращаются внутри JSON-ответа в поле errors, при этом HTTP-статус остаётся 200
🩵🩷 Подробное сравнение GraphQL с REST API я показала на примере метода
«Создать запись на приём к ветеринару» — смотрите на картинках к посту.
И отдельно правильный ответ на вопрос из теста про «Получение карточки питомца»:
👉 POST /graphql — основной вариант эндпоинта
👉 GET /graphql — тоже допустим, если это только запрос на получение данных
В этом и был подвох:
в REST API мы обычно проектируем отдельные endpoint-ы под разные сценарии,
а в GraphQL чаще всего работаем через один общий endpoint.
#RestApiGA #VetCareGA
📱 Tg | 💙 ВК | 💬 Max
Последний вопрос в тесте показал, что с GraphQL знакомы пока немногие.
Либо часть из вас просто не заметила, что вопрос был именно про GraphQL, а не про REST API 🙂
👉 Вопрос был такой:
Какой endpoint выбрать для получения карточки питомца в GraphQL?
Большинство голосов ушло за вариант, который был бы верным для REST API:
GET /api/v1/pets/{petId}
Но в GraphQL логика другая.
🩷 GraphQL — это другой подход к проектированию API по сравнению с REST.
Что важно понимать:
✔️ GraphQL обычно работает поверх HTTP
✔️ чаще всего используется один endpoint: POST /graphql
✔️ для запросов только на получение данных также может использоваться GET /graphql
✔️ клиент сам указывает, какие поля хочет получить в ответе
✔️ это помогает не получать лишние данные и в ряде случаев экономить трафик
✔️ ошибки в GraphQL часто возвращаются внутри JSON-ответа в поле errors, при этом HTTP-статус остаётся 200
🩵🩷 Подробное сравнение GraphQL с REST API я показала на примере метода
«Создать запись на приём к ветеринару» — смотрите на картинках к посту.
И отдельно правильный ответ на вопрос из теста про «Получение карточки питомца»:
👉 POST /graphql — основной вариант эндпоинта
👉 GET /graphql — тоже допустим, если это только запрос на получение данных
В этом и был подвох:
в REST API мы обычно проектируем отдельные endpoint-ы под разные сценарии,
а в GraphQL чаще всего работаем через один общий endpoint.
#RestApiGA #VetCareGA
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤21🔥5👍2🦄2😁1
📌 Проси много, чтобы получить хотя бы половину 📌
Это моя фраза недели.
Мне кажется, она очень хорошо ложится не только на бизнес, но и на карьеру, зарплату и профессиональный рост.
Мы часто сами себя занижаем:
▫️ «мне ещё рано»
▫️ «я пока не дотягиваю»
▫️ «а вдруг откажут»
▫️ «а вдруг я прошу слишком много»
Особенно сейчас, когда вокруг много тревоги, нестабильности и разговоров про кризис.
А потом удивляемся, почему нас оценивают ниже, чем хотелось бы?!
Иногда рост начинается не с нового курса, новой работы или нового проекта.
👉 А с внутреннего разрешения перестать торговаться против себя.
Просить больше.
Называть сумму смелее.
Не обесценивать свой опыт.
Не объяснять себе самому заранее, почему вам можно заплатить меньше.
Потому что если вы сами ставите себе нижнюю планку, рынок редко будет спорить и поднимать её за вас.
👉 Рост часто начинается там, где вы перестаёте себя уменьшать.
И если вы хотя читаете этот канал, думаете о профессии, задаёте вопросы, учитесь и развиваетесь — это уже не «ничего особенного».
Это уже вклад в вашу будущую стоимость как специалиста.
P.S. А к посту добавила подборку доброты, которая скопилась за последние пару месяцев. Здесь поместилось меньше половины 🩷🩷🩷 Огромная благодарность за каждое сообщение 🙏
📱 Tg | 💙 ВК | 💬 Max
Это моя фраза недели.
Мне кажется, она очень хорошо ложится не только на бизнес, но и на карьеру, зарплату и профессиональный рост.
Мы часто сами себя занижаем:
▫️ «мне ещё рано»
▫️ «я пока не дотягиваю»
▫️ «а вдруг откажут»
▫️ «а вдруг я прошу слишком много»
Особенно сейчас, когда вокруг много тревоги, нестабильности и разговоров про кризис.
А потом удивляемся, почему нас оценивают ниже, чем хотелось бы?!
Иногда рост начинается не с нового курса, новой работы или нового проекта.
👉 А с внутреннего разрешения перестать торговаться против себя.
Просить больше.
Называть сумму смелее.
Не обесценивать свой опыт.
Не объяснять себе самому заранее, почему вам можно заплатить меньше.
Потому что если вы сами ставите себе нижнюю планку, рынок редко будет спорить и поднимать её за вас.
👉 Рост часто начинается там, где вы перестаёте себя уменьшать.
И если вы хотя читаете этот канал, думаете о профессии, задаёте вопросы, учитесь и развиваетесь — это уже не «ничего особенного».
Это уже вклад в вашу будущую стоимость как специалиста.
P.S. А к посту добавила подборку доброты, которая скопилась за последние пару месяцев. Здесь поместилось меньше половины 🩷🩷🩷 Огромная благодарность за каждое сообщение 🙏
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥16💯8🦄6❤1🔥1