Spring REST - правильная функциональность PUT, когда ресурс еще не существует - PullRequest
0 голосов
/ 21 января 2020

Я создаю REST API с использованием Spring и реализую функциональность PUT. Я пытаюсь обработать сценарий, в котором клиент пытается PUT на URI, где ресурс еще не существует. В этом сценарии согласно спецификации PUT c должен быть создан новый ресурс с этим идентификатором. Однако из-за стратегии генерации идентификаторов, которую я использую (@GeneratedValue(strategy = GenerationType.IDENTITY)), я не могу создавать ресурсы с идентификаторами вне последовательности. База данных должна использовать следующее доступное значение. Однако в соответствии с w3 spe c on PUT ...

Если Request-URI не указывает на существующий ресурс и этот URI может быть определен как новый ресурс с помощью запрашивающий пользовательский агент, сервер-источник может создать ресурс с этим URI.

Если сервер желает, чтобы запрос был применен к другому URI, он ДОЛЖЕН отправить ответ 301 (перемещен навсегда); Затем пользовательский агент МОЖЕТ принять собственное решение относительно того, следует ли перенаправить запрос.

В этом случае я не могу выполнить ни одно из этих действий. Я не могу создать новый ресурс на существующем URI из-за ограничений на генерацию идентификатора, и я не могу отправить ответ 301 Moved Permanently, потому что согласно Как узнать идентификатор перед сохранением объекта в jpa , это невозможно знать следующий идентификатор в последовательности, прежде чем сохранить объект. Поэтому у меня не было бы возможности сообщить клиенту, на какой URI перенаправлять, чтобы правильно создать новый ресурс.

Я бы предположил, что эта проблема решалась много раз, поскольку это стандартная функциональность PUT, но пока У меня проблемы с поиском других людей, которые пытались это сделать. Кажется, что большинство людей просто игнорируют часть PUT «создать новый ресурс» и просто используют ее только для обновления.

Что я хочу сделать, это просто go вперед и создать новый ресурс, а затем отправить 301 Moved Permanently, чтобы перенаправить клиента в истинное местоположение созданного ресурса - но, как мы видим выше, это нарушает определение PUT.

Есть ли какой-нибудь способ решить эту проблему? Или проблема не решена, и стандартная практика true состоит в том, чтобы просто не разрешать создание новых ресурсов через PUT?

1 Ответ

1 голос
/ 22 января 2020

Если сервер не может обработать запрос из-за ошибки в запросе, просто верните 400.

400 Неправильный запрос - сервер не может или не будет обрабатывать запрос из-за очевидного клиента ошибка (например, неправильно сформированный синтаксис запроса, слишком большой размер, неверное формирование кадра сообщения запроса или ложная маршрутизация запроса).

...