Я создаю коллекцию ресурсов RESTful, которые работают следующим образом: (я буду использовать «людей» в качестве примера):
GET /people/{key}
- returns a person object (JSON)
GET /people?first_name=Bob
- returns a list of person objects who's "first_name" is "Bob" (JSON)
PUT /people/{key}
- expects a person object in the payload (JSON), updates the person in the
datastore with the {key} found in the URL parameter to match the payload.
If it is a new object, the client specifies the key of the new object.
Пока что я чувствую себя довольно комфортно с дизайном (хотя приветствуются любые замечания / замечания).
Я также хотел бы иметь возможность ставить список людей, однако я не уверен в RESTfulness моего дизайна. Вот что я имею в виду:
PUT /people
- expects a list of objects in JSON form with keys included in the object
("key":"32948"). Updates all of the corresponding objects in the datastore.
Эта операция будет идемпотентной, поэтому я бы хотел использовать «PUT». Однако это нарушает правило, потому что запрос GET к этому же ресурсу не будет возвращать эквивалент того, что клиент просто PUT, а скорее вернет все объекты "люди" (так как в запросе не будет фильтров). Я подозреваю, что есть также несколько других правил, которые могут быть нарушены здесь.
Кто-то упоминал об использовании запроса «PATCH» в моем предыдущем вопросе: Ресурс REST со свойством List
"PATCH" звучит фантастически, но я не хочу его использовать, потому что он еще не широко используется и еще не совместим со многими программами и API.
Я бы предпочел не использовать POST, потому что POST подразумевает, что запрос не идемпотентен.
У кого-нибудь есть комментарии / предложения?
Последующие действия :::
Хотя я не решался использовать POST, потому что он представляется наименьшим общим знаменателем, всеобъемлющим для операций RESTful и многое другое можно сказать об этой операции (в частности, что она идемпотентна), PUT не может быть использован, поскольку его требования слишком узки В частности: ресурс переписывается не полностью, а эквивалентный ресурс не отправляется обратно из запроса GET к тому же ресурсу. Использование PUT со свойствами, выходящими за пределы его спецификаций, может вызвать проблемы, когда приложения, API и / или программисты пытаются работать с ресурсом и сталкиваются с неожиданным поведением ресурса.
В дополнение к принятому ответу у Даррела Миллера было отличное предложение, если операция обязательно должна быть PUT, и это должно было добавить UUID в конец пути ресурса, чтобы эквивалентный запрос GET возвратил эквивалентный ресурс.