Мое предпочтительное решение - создать три ресурса: Players
, Teams
и TeamsPlayers
.
Итак, чтобы собрать всех игроков команды, просто перейдите на ресурс Teams
и получитевсем своим игрокам, позвонив по номеру GET /Teams/{teamId}/Players
.
С другой стороны, чтобы получить все команды, в которые играл игрок, получите ресурс Teams
в пределах Players
.Позвоните GET /Players/{playerId}/Teams
.
И, чтобы получить отношение «многие ко многим», позвоните GET /Players/{playerId}/TeamsPlayers
или GET /Teams/{teamId}/TeamsPlayers
.
Обратите внимание, что в этом решении при вызове GET /Players/{playerId}/Teams
вы получаете массив Teams
ресурсов, то есть тот же ресурс, который вы получаете при вызове GET /Teams/{teamId}
.Обратное действие следует тому же принципу: вы получаете массив Players
ресурсов при вызове GET /Teams/{teamId}/Players
.
При любом вызове информация о связи не возвращается.Например, contractStartDate
не возвращается, поскольку возвращаемый ресурс не имеет информации об отношении, а только о своем собственном ресурсе.
Чтобы справиться с отношением nn, вызовите GET /Players/{playerId}/TeamsPlayers
или GET /Teams/{teamId}/TeamsPlayers
.Эти вызовы возвращают точно ресурс TeamsPlayers
.
Этот ресурс TeamsPlayers
имеет атрибуты id
, playerId
, teamId
, а также некоторые другие, чтобы описать отношения.Кроме того, у него есть методы, необходимые для борьбы с ними.GET, POST, PUT, DELETE и т. Д., Которые будут возвращать, включать, обновлять, удалять ресурс отношений.
Ресурс TeamsPlayers
реализует некоторые запросы, например GET /TeamsPlayers?player={playerId}
, чтобы вернуть все отношения TeamsPlayers
, идентифицированные игроком.на {playerId}
имеет.Следуя той же идее, используйте GET /TeamsPlayers?team={teamId}
, чтобы вернуть все TeamsPlayers
, которые сыграли в команде {teamId}
.При любом вызове GET
возвращается ресурс TeamsPlayers
.Возвращаются все данные, связанные с отношением.
При вызове GET /Players/{playerId}/Teams
(или GET /Teams/{teamId}/Players
) ресурс Players
(или Teams
) вызывает TeamsPlayers
, чтобы вернуть соответствующие команды (илиигроки), используя фильтр запросов.
GET /Players/{playerId}/Teams
работает следующим образом:
- Найти все TeamsPlayers , которые игрок имеет id = playerId .(
GET /TeamsPlayers?player={playerId}
) - Зацикливание возвращенных TeamsPlayers
- Используя teamId , полученный из TeamsPlayers , вызов
GET /Teams/{teamId}
и сохраните возвращенные данные - После завершения цикла.Верните все команды, которые были включены в цикл.
Вы можете использовать тот же алгоритм, чтобы получить всех игроков из команды, при вызове GET /Teams/{teamId}/Players
, но при обмене командами и игроками.
Мои ресурсы выглядят так:
/api/Teams/1:
{
id: 1
name: 'Vasco da Gama',
logo: '/img/Vascao.png',
}
/api/Players/10:
{
id: 10,
name: 'Roberto Dinamite',
birth: '1954-04-13T00:00:00Z',
}
/api/TeamsPlayers/100
{
id: 100,
playerId: 10,
teamId: 1,
contractStartDate: '1971-11-25T00:00:00Z',
}
Это решение использует только ресурсы REST.Хотя для получения данных от игроков, команд или их отношений могут потребоваться дополнительные вызовы, все методы HTTP легко реализуются.POST, PUT, DELETE просты и понятны.
При создании, обновлении или удалении отношений ресурсы Players
и Teams
автоматически обновляются.