RESTful способ решить эту проблему - убедиться, что вы используете только идемпотентные запросы.Идемпотентный запрос более или менее определяется следующим образом:
Состояние на сервере после выполнения запроса один раз будет идентично выполнению того же запроса n раз.
ТамВот несколько HTTP-запросов, которые явно определены как идемпотентные, например:
Так что еслиВы можете спроектировать свое приложение таким образом, чтобы использовать PUT
для создания новых переводов, а PUT
реализован правильно, получение одного и того же запроса n раз не должно иметь побочных эффектов.
Это не такЭто всегда особенно просто, потому что, если вы «создаете» новый ресурс передачи с PUT
, это означает, что клиент должен определить, каким будет новый URI передачи.Например, клиент может сгенерировать UUID для URL.
Я думаю, что этот подход является наиболее желательным.Вы можете автоматически заставить сервер выдавать ошибку, если ресурс передачи уже существует, включая заголовок If-None-Match: *
.Если вы используете этот заголовок, вы можете вернуть 412 Precondition Failed
, если ресурс уже существует.
Я предполагаю, что ваша интуиция заключалась в том, чтобы использовать POST
для создания новых переводов, но идея в том, что POST = create & PUT = update
неверен.PUT
следует использовать как для создания, так и для обновления ресурсов, , если путь может быть известен клиенту.