Остальные гипермедиа / ссылки на коллекции


Часть наилучшей практики 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 2

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-ссылок.