Различные типы дочерних ресурсов - PullRequest
0 голосов
/ 13 декабря 2011

Предположим, мне нужно реализовать ресурс игрового персонажа.Персонаж может иметь только одно оружие.Типы оружия различны (меч, нож, пистолет и т. Д.) И имеют различный набор свойств.Персонаж и оружие являются отдельными ресурсами для удобства использования.В модели ООП это будет выглядеть следующим образом

enter image description here

Каков наилучший способ создания URI и ресурсов для такой структуры?

edit: Inгенеральный.Можно ли использовать в ресурсе Персонаж ссылку на ресурс оружия, который возвращает Нож, Меч или Пистолет, или это должна быть ссылка на определенный ресурс, такой как http: \ game.com \ персонаж \ меч?

1 Ответ

1 голос
/ 25 апреля 2012

Как правило, модель REST может быть отображена непосредственно как «Объект» <-> «Представление» и «OID / References» <-> «URI». Итак, во-первых, вам нужно назначить каждому из элементов, присутствующих в игре, свой URI.

Вариант 1

Допустим, вы используете JSON для описания персонажа, поэтому у вас будет что-то вроде этого:

URL : / персонаж / Воин

Содержание

{ "name" : "Warrior", "weapon" : "/weapons/id_of_weapon" }

Обратите внимание, что «оружие» включает в себя ссылку (или массив из них) на различные виды оружия, которыми обладает персонаж. Каждый из них, следуя принципу REST, идентифицируется URI.

Теперь у вас есть два варианта поддержки варианта типа / подтипа:

Использовать разные типы MIME

Когда вы получите ресурс /weapons/id_of_weapon, вы получите, скажем, ответ от сервера, в котором заголовки выглядят так:

HTTP/1.1 200 OK
...
Content-Type: my-game/Knife
... (more headers)

Knife data Content

Указывает фактический тип возвращаемого элемента и может использоваться для сопоставления его с другим подтипом. Вы можете использовать разные схемы, такие как Weapon/Knife или MyGameObject/Weapon_Knife.

Использовать сопоставление объектов на основе содержимого

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

HTTP/1.1 200 OK
...
Content-Type: application/json
... (more headers)

{ "type" : ["Weapon", "Knife"] , ... (rest of fields) }

Обратите внимание, как параметр JSON type используется в качестве стандарта в вашей игре для указания различных типов, поддерживаемых этими возвращаемыми данными.

Вариант 2

Вы также можете подумать, что после редактирования вы можете имитировать архитектуру содержания ресурса в URI. Тем не менее, вы предлагаете http://whatever/character/sword. Это не подходит, потому что вы называете классы, а не ресурсы. Более подходящая схема URL будет выглядеть примерно так:

http://whatever/character/idc/weapon/idw

где idc и idw - идентификаторы персонажа и оружия соответственно. Обратите внимание, что вы не фиксируете точный тип оружия в URI ресурса (то есть вы должны сказать weapon, а не knife), , но может случиться так, что на самом деле оружие с id idw на самом деле имеет тип Knife (используя любой из параметров, указанных выше).

Если вы сопоставите локализацию с URI, вы также можете иметь более компактный формат для символа:

{ "id": "idc",
  "name" : "Warrior", 
  "weapon" : { "id": "idw", "type": "Knife", (rest of knife properties) }
}

Обратите внимание, как: у каждого элемента есть свой id. Сдерживание наблюдается посредством включения рекурсивного объекта JSON, вы также указываете тип оружия, и, тем не менее, вы можете сопоставить только что описанную схему URL, чтобы получить доступ к внутренним элементам персонажа.

...