Разрешено ли возвращать только идентификаторы для коллекции JSON API? - PullRequest
0 голосов
/ 05 ноября 2019

Итак, допустим, у меня есть ресурс с именем articles. Они имеют числовой идентификатор, и вы можете получить к ним доступ под чем-то вроде:

GET /articles/1 для конкретной статьи.

И скажем, что возвращает что-то вроде:

{
  "data": {
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "JSON:API paints my bikeshed!",
      "body": "A bunch of text here"
    }
  }
}

Теперь у меня вопрос, как обработать запрос к GET /articles. Т.е. как поступить с запросом к коллекции.

Видите ли, доступ к телу статьи идет медленно и мучительно. Последнее, что я хочу, чтобы этот REST API - это попытка получить всю эту информацию. Тем не менее, насколько я могу судить, схема JSON API, по-видимому, предполагает, что вы всегда можете вернуть полные ресурсы.

Существует ли какой-либо "разрешенный" способ для возврата только идентификаторов (или частичных атрибутов, таких как "title")под JSON API, хотя активно не предоставляет возможность получить полный ресурс?

Что-то вроде:

GET /articles возврат:

{
  "data": [
    {
      "type": "article_snubs",
      "id": 1,
      "attributes": {
         "title": "JSON:API paints my bikeshed!"
      }
    }, {
      "type": "article_snubs",
      "id": 2,
      "attributes": {
         "title": "Some second thing here"
      }
    }
  ]
}

Может быть, со ссылками на полныйстатьи?

По сути, это вообще возможно при соблюдении JSON API или стандарта REST? Потому что GET /articles никогда не будет возвращать полные ресурсы из-за сопутствующих затрат на получение данных, что, я не думаю, является редкой ситуацией.

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Насколько я понимаю, в спецификации JSON API нет требования, чтобы API по умолчанию возвращал все поля (атрибуты и отношения) ресурса. Единственное заявление MUST , касающееся включения полей, которое мне известно, относится к Sparse Fieldsets (fields параметр запроса):

Разреженные наборы полей

[...]

Если клиент запрашивает ограниченный набор полей для данного типа ресурса, конечная точка НЕ ​​ДОЛЖНА включать дополнительные поля в объекты ресурсов этого типав своем ответе.

https://jsonapi.org/format/#fetching-sparse-fieldsets

Даже если это не запрещено спецификацией, я бы не рекомендовал такой подход. Возврат только подмножества полей значительно усложняет использование вашего API, так как вам приходится обращаться к документации, чтобы получить список всех поддерживаемых полей. Гораздо больше смысла спецификации в том, чтобы позволить клиенту решить, какую информацию (и связанных ресурсов ) следует включить.

0 голосов
/ 05 ноября 2019

Объект атрибутов документа JSON-API не обязательно должен быть полным представлением:

атрибуты: объект атрибутов, представляющий некоторые данных ресурса.

Вы можете предоставить ссылку на себя, чтобы получить полное представление, или, возможно, ссылку на тело, чтобы получить только тело:

ссылки: ссылкиобъект, содержащий ссылки, связанные с ресурсом.

Например:

{
  "data": [
    {
      "type": "articles_snubs",
      "id": "1",
      "attributes": {
        "title": "JSON API paints my bikeshed!"
      },
      "links": {
        "self": "/articles/1",
        "body": "/articles/1/body"
      }
    }, 
    {
      "type": "article_snubs",
      "id": "2",
      "attributes": {
        "title": "Some second thing here"
      },
      "links": {
        "self": "/articles/2",
        "body": "/articles/2/body"
      }
    }
  ]
}
...