Остальные гипермедиа / ссылки на коллекции
Часть наилучшей практики REST заключается в использовании ссылок в ответах, чтобы позволить клиентам переходить от одной сущности к другой.
Например, если бы у меня был тип объекта customer, который имеет дочернюю учетную запись. Если бы я запросил клиента, используя /customers/1
, то я мог бы предоставить следующий ответ
{
"self": "http://localhost:43002/rest/v1/customers/1",
"id": 1,
"name": "Isabella Button",
"number": "000001",
"forename": "Isabella",
"surname": "Button",
"accounts": [
{
"self": "http://localhost:43002/rest/v1/accounts/1",
"id": 1,
"name": "Main Account",
"number": "000001",
"currency": "GBP",
"fromDate": "2013-01-01",
"toDate": "9999-01-01",
"createdDttm": "2013-01-01T00:00:00.000"
}
]
}
Обратите внимание, что свойство self
содержит ссылки.
Однако, скажем, я не хотел возвращать счета в запросе клиента, возможно, количество счетов может быть очень большим. большие, поэтому я не хочу возвращать их по умолчанию.
{
"self": "http://localhost:43002/rest/v1/customers/1",
"id": 1,
"name": "Isabella Button",
"number": "000001",
"forename": "Isabella",
"surname": "Button"
}
URL ресурса для счетов клиента может быть /customers/1/accounts
/customers/1/accounts
.
Существует ли наилучшая практика предоставления гиперссылок в ответе, которые указывают на" дочерние " коллекции возвращаемого ресурса?
2 ответа:
Предоставлять ссылки атрибутом, как в этом примере http://caines.ca/blog/programming/json-is-under-defined-for-rest/
{ "links": { "self" : { "href": "{id}" }, "up" : { "href": "{upId}" }, "children" : { "href": "{id}/children" } } }
Одна практика состоит в том, чтобы использовать элемент
links
следующим образом:{ "self": "http://localhost:43002/rest/v1/customers/1", "id": 1, "name": "Isabella Button", "number": "000001", "forename": "Isabella", "surname": "Button", "links" : [ { "rel" : "http://www.yourapi.com/rels/accounts", "href" : "http://localhost:43002/rest/v1/customers/1/accounts" }, { "rel" : "http://www.yourapi.com/rels/someOtherCollection", "href" : "http://localhost:43002/rest/v1/customers/1/someOtherCollection", } ] }
Или, если вам проще построить/прочитать ответ,вы можете поместить те же ссылки, что и заголовки HTTP-ссылок.