2014-11-24 5 views
2

Мне нужно создать взаимно-однозначное соотношение между Game и Site - каждая игра происходит на одном сайте. В моей базе данных site является атрибутом объекта Game, который указывает на объект Site.Создание взаимно-однозначного отношения RESTful API

я не мог найти много в интернете об этом, это мои идеи:

GET /game/<game_id>/site 

Gets сайт игра, в, скрывая идентификатор сайта.

POST /game/<game_id>/site 

Создает сайт игры, используется только один раз при создании игры.

PUT /game/<game_id>/site 

Обновление сайт игра, в

DELETE /game/<game_id>/site 

Удаляет сайт игры, в.

Но что, если кто-то хочет получить список всех сайтов? Должен ли я добавить URI /sites и использовать метод get для объекта Site, чтобы определить, был ли передан game_id? Должен ли я также позволить людям получить доступ к сайту по адресу /sites/<site_id> Или я должен разрешить клиенту заполнять свой собственный список sites, итерируя все games? Наконец, у меня обычно есть атрибут «href» для каждого объекта, который является ссылкой на себя. Если бы я пошел с вышеупомянутой конструкцией (включая /sites/ URI), ссылку на /game/<game_id>/site или /sites/<site_id>? Должны ли быть два места для доступа к одной и той же информации?

Есть ли я на правильном пути? Или есть лучший способ моделирования отношений «один к одному» в REST?

Если это имеет значение, я использую Flask-RESTful для создания своих API.

ответ

0

Ваши идеи имеют большой смысл.

Большое различие заключается в том, может ли существовать site независимо от game. Похоже, это возможно. Например, две игры могут указывать на один и тот же сайт.

Насколько я понимаю, с дизайном API RESTful нет проблем с предоставлением одного и того же ресурса site как через /game/<game_id>/site, так и через /sites/<side_id>. Но REST рекомендует вам связывать данные с помощью гипермедиа.

Публикация site в двух разных местах может усложнить ситуацию, так как вы ожидаете, что сможете взаимодействовать с объектами сайта через оба этих URL-адреса.

Моя рекомендация, чтобы сохранить структуру четко и просто будет:

  • Есть набор ресурсов сайта на /sites
  • Expose site ресурсы на /site/<site_id>
  • Использование объектассылка с game до site. См. Thoughts on RESTful API design by Geert Jansen.

После проектирования объекта ссылки, ваше представление game ресурса будет включать в себя что-то вроде этого:

{ 
    "game_id": 10, 
    ..., 
    "link": { 
    rel: resource/site 
    href: /api/sites/14 
    } 
} 

Без дополнительной проектной работы, это будет означать, вы сделаете второй звонок, чтобы получить информацию сайта. Каждый проект имеет свои компромиссы :)