Подход, который я использовал бы здесь, - это гипермедиа и ссылки:
/property
/property/{id}
/property/{id}/features/{id}
В зависимости от вашего домена вам может даже не понравиться:
/property/{id}/features/{name}
или
/property/{id}/features/byname/{name}
Таким образом, вы можете выполнять REST операции и обслуживать JSON или XHTML гипермедиа .
Сведения об объекте:
Request: GET /property/1
Response:
{
..
"name": "Brentwood",
"features": "/property/1/features"
..
}
Особенности Brentwood:
GET /property/1/features
{
..
"Kitchen": "/property/1/features/1",
"Dog Room": "/property/1/features/dog%20room",
..
}
GET /property/1/features/1
{
..
"Induction hob": "/property/1/features/1/1",
"900W microwave": "/property/1/features/1/23",
"nav-next" : "/property/1/features/dog%20room",
..
}
Чтобы добавить отношение, вы можете сделать что-то вроде этого:
POST /property/1/features
{
..
"Name": "Oven Hob"
..
}
Если вы знаете, каким будет отношение, вы используете PUT:
PUT /property/1/features/23
{
..
"Name": "Oven Hob"
..
}
Вы можете использовать несколько типов мультимедиа:
GET http://host/property/1/features/dog%20room.json
GET http://host/property/1/features/dog%20room.xhtml
Для ответа в формате xhtml ответ может использовать именованные ссылки, например:
..
<a href="http://host/property/1/features/1" rel="prev">Kitchen</a>
..
Существуют и другие аспекты REST, которые вы можете использовать, например:в качестве кода ответа, который я не включил выше.
Таким образом, для моделирования отношений вы используете ссылки, которые сами по себе могут быть ресурсом, с которым можно работать при помощи GET, PUT, POST и DELETE или даже пользовательских глаголов.такие как ASSOCIATE или LINK.Но первые четыре - это те, к которым привыкли люди.Помните, что PUT идемпотент , но не POST.См. PUT против POST в REST
Редактировать: Вы можете сгруппировать ссылки в массивы JSON, чтобы придать структуру вашим гипермедиа.