Лучшая практика для добавления сложных ресурсов в коллекции? - PullRequest
2 голосов
/ 20 июня 2011

Представьте себе сервис RESTful, который позволяет игрокам в игре отправлять команды на сервер.Объект, обозначающий эту команду, может называться PlayerCommand и выглядеть примерно так:

PlayerCommand:
Player player;
Game game;
Command command;
String param1;
...etc.

Где Player, Game и Command также являются объектами / ресурсами в сервисе.Когда я выставляю ресурс PlayerCommand, чтобы позволить игрокам добавлять их, было бы лучше просто выставить конечную точку PlayerCommand, чтобы они публиковали правильно сформированные представления ресурсов PlayerCommand, то есть POST / playerCommand?Или было бы лучше позволить им замаскировать некоторые сложности объекта PlayerCommand, просто поместив идентификаторы для зависимых ресурсов в пути, например, POST / player / {id} / game / {id} / playerCommand?Похоже, что последний будет проще для клиентов, позволяя им передавать более редкие представления объекта (в основном только параметры Command и string), а затем позволяет стороне сервера создавать зависимые объекты на основе идентификаторов.

В основном, при представлении операций CRUD на вложенных / сложных ресурсах, что является лучшим методом здесь?

1 Ответ

1 голос
/ 22 июня 2011

Один хороший способ сузить требования к дизайну любого ресурса - представить, что GET на его URI будет отправлять клиенту точно такое же представление, которое клиент отправит на этот URI, и наоборот.

Когда вы размещаете представление PlayerCommand, я предполагаю, что вы хотите создать новый ресурс PlayerCommand.Когда вы возвращаете такую ​​вещь из GET на ресурсе PlayerCommand, что вы возвращаете?Полные объекты Player, Game и Command, встроенные в ответ?Лучше не делать этого;вместо этого возвращайте URI, указывающие на эти ресурсы.

Аналогично, представление POSTed не должно включать полные представления ресурсов Player, Game или Command;вместо этого он должен содержать идентификаторы для них в форме URI.Затем сервер может хранить ссылки без необходимости создавать для них новые объекты.Пример на основе JSON:

{"self": "/playerCommand/9803495",
 "player": "/players/84",
 "game": "/games/22980",
 "command": {"base": "/commands/fight",
             "params": ["kick", "Darrel"]
             }
 }
...