#api #domain-driven-design
#API #доменно-ориентированный дизайн
Вопрос:
У меня есть rest API для приложения, которое я разрабатываю. Одна из конечных точек получает поля имени, электронной почты и телефона для создания нового пользователя (без пароля). Очевидно, что конечной точкой будет /пользователи [СООБЩЕНИЕ] Было бы правильно воспользоваться этой конечной точкой, чтобы, если пользователь уже существует, обновить ее новыми данными? Или лучше создать другую конечную точку (PUT) для обновления пользователя? Если бы это было так, мне пришлось бы вывести бизнес-логику за рамки этого API, и мне не нравится эта идея.
Ответ №1:
Этот вопрос не связан с DDD, так как DDD не предоставляет рекомендаций по проектированию API.
Но чтобы ответить на ваш вопрос, следует ли вам использовать PUT или POST, будет зависеть от того, должно ли действие быть идемпотентным.
СООБЩЕНИЕ обычно используется для создания нового ресурса
СООБЩЕНИЕ не является идемпотентным, если один и тот же запрос отправляется несколько раз, результаты будут разными (каждый раз создается новый ресурс). Один и тот же запрос, отправленный на POST /users
, каждый раз будет создавать новый ресурс.
PUT используется либо для создания, либо для замены существующего ресурса (не обязательно для обновления).
Метод PUT является идемпотентным, поэтому, если один и тот же запрос отправляется несколько раз, он будет таким же, как если бы он был отправлен один раз. Тот же запрос, отправленный на PUT /users/1
, будет иметь тот же результат.
Если вы хотите обновить часть ресурса (обновить, а не заменить), вы можете использовать ИСПРАВЛЕНИЕ.
Комментарии:
1. Спасибо за ответ. Я не знаю, что делать, логично было бы: попытаться вставить (через конечную точку POST) нового пользователя, но если пользователь уже существует, мне нужно обновить информацию о пользователе. Я не знаю, лучший ли способ-делать все в одной конечной точке или в разных конечных точках
2. Я бы рекомендовал иметь две отдельные конечные точки: запись для создания и запись для обновления. Таким образом, вам не придется беспокоиться об обработке этой логики. Я не уверен, что представляет собой ваше приложение, но если пользователь вошел в систему, вы можете предположить, что пользователь уже создан.