Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

CRUD HTTP API

В программировании аббревиуатура CRUD обозначет 4 базовых операции над информацией: создание, чтение, обновление и удаление. CRUD строят вокруг какой-то сущности, например пользователя. Для этого создают либо интерфейс формами, либо HTTP API эндпоинты.

Сервис https://dummyjson.com как раз предоставляет такой набор операций для своих сущностей. Рассмотрим их подробнее.

В целях безопасности, этот сервис не выполняет реальных изменений на сервере. Все операции выглядят так как будто они вносят изменения, но изменения, на самом деле, не происходят

Метод URL Операция
GET /users Список пользователей
GET /users/1 Информация о пользователе
POST /users/add Добавление пользователя
PATCH /users/1 Обновление пользователя
DELETE /users/1 Удаление пользователя

1 - это идентификатор конкретного пользователя. Он будет меняться, в зависимости от того, с каким пользователем мы работаем прямо сейчас. Кстати идентификатор не обязательно должен быть числом, здесь все зависит от того, что бекенд считает идентификатором и как он создается в базе данных. Например в MongoDB идентификатор состоит из чисел и букв.

Обратите внимание на использование методов HTTP. У них есть определенный смысл и он здесь используется. GET нужен для извлечения данных, POST для отправки форм (создания), PATCH для обновления и DELETE для удаления. URL, при этом, часто остается одним и тем же.

Использование подходящих методов имеет важное значение в API. Любые HTTP запросы, которые ходят в интернете, обрабатываются веб-серверами и промежуточными прокси, которые могут находиться на пути к веб-серверу. И веб-сервер и прокси знают про особенности HTTP и в зависимости от параметров запроса могут делать различные оптимизации, например, кешировать результат.

Кеширование это техника, которая позволяет веб-серверу или прокси сохранить ответ от сервера и отдавать его при следующих запросах без обращения к самому серверу. Кеширование значительно ускоряет доступ к ресурсам и разгружает сервера. Например GET можно кешировать для ускорения доступа так как GET никогда не меняет данные, то есть это безопасно. Методы POST, PATCH и DELETE кешировать нельзя, они должны приходить на сервер, так как они вносят изменения.

Добавление пользователя

В соответствии с документацией для добавления пользователя мы должны отправить POST запрос на эндпоинт https://dummyjson.com/users/add. Данные могут быть отправлены в разных форматах, например, как данные обычной HTML-формы или как JSON. Для использования JSON, во время подготовки запроса нужно выполнить два шага:

  • Указать заголовок Content-Type со значением application/json
  • Преобразовать данные в JSON

В итоге запрос будет выглядеть так:

POST /users/add HTTP/1.1
HOST: dummyjson.com
Content-Type: application/json

{ "firstName": "Nik", "age": 20 }

Какие возможные варианты ответа от сервера:

  • 201 - ресурс успешно создан
  • 422 - ошибка валидации
  • 406 - некорректные данные, например не тот формат

Подробнее о HTTP-кодах можно прочитать здесь. Большая часть из них может встречаться с любым HTTP-методом.

Обновление пользователя

Для обновления пользователя мы должны отправить PATCH запрос на эндпоинт https://dummyjson.com/users/{id}. Обновлять можно любой набор параметров, не обязательно сразу все.

PATCH /users/1 HTTP/1.1
HOST: dummyjson.com
Content-Type: application/json

{ "firstName": "Nina" }

Если все прошло успешно, то возможны два варианта ответа:

  • Код 200 и какие-то данные, например JSON с обновленными данными ресурса
  • Код 204, в том случае, если тела ответа нет

Удаление пользователя

Для удаления пользователя мы должны отправить DELETE запрос на эндпоинт https://dummyjson.com/users/{id}. Тела запроса в таком случае нет, так как все и так понятно из адреса запроса

DELETE /users/1 HTTP/1.1
HOST: dummyjson.com

Если все прошло успешно, то возможны два варианта ответа:

  • Код 200 и какие-то данные
  • Код 204 и пустое тело ответа

Идемпотентность

Когда мы работаем с API, очень важным становится понятие идемпотентности запросов. Это свойство, которое говорит о том насколько безопасно выполнять HTTP вызов повторно. Идемпотентный запрос приводит к одному и тому же результату независимо от количества сделанных вызовов.

Возьмем эндпоинт /users. Он возвращает список пользователей и ничего не меняет на сервере. Каждый новый вызов этого эндпоинта, возвращает идентичный список пользователей. Он идемпотентный. Список пользователей может поменяться если его меняют где-то в другом месте, но даже это не делает GET запрос на /users не идемпотентным. Главное что он сам ничего не меняет.

А вот POST-запрос не идемпотентный. Каждый вызов /users/add добавляет нового пользователя, хотя и с теми же самыми данными. Или возвращает ошибку, если, например, на сервере добавлена проверка на уникальность каких-то данных. Именно поэтому при отправке форм из браузера после нажатия f5, браузер всегда спрашивает точно ли мы хотим выполнить этот запрос повторно.

PATCH по стандарту тоже не идемпотентный, хотя на практике, чаще, его делают идемпотентным. Но на это уже не могут рассчитывать браузеры или веб-сервера, так как они не знают про специфику конкретных приложений.

Самое интересное это DELETE, он по стандарту идемпотентный. То есть повторное удаление уже удаленного ресурса должно возвращать код 204 по спецификации HTTP. На практике про это знает не так много программистов, поэтому, обычно, повторное удаление приводит к ошибке 404.

Идемпотентность закреплена за методами HTTP в его спецификации, но то насколько HTTP API соответствует этим правилам зависит уже от программистов разрабатывающих его.


Самостоятельная работа

С помощью Telnet выполните CRUD операции для Todos.

Обратите внимание, что на сервере изменения не выполняются, поэтому результатом успешного выполнения запроса будет HTTP ответ.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
30 июня 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
30 июня 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
30 июня 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
30 июня 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
30 июня 16 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
30 июня 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу