Должен ли REST API возвращать вложенные объекты или ссылки на эти объекты? - PullRequest
0 голосов
/ 08 февраля 2020

Какова наилучшая практика в отношении этого? Можете ли вы сказать, что это зависит от приложения или есть какая-либо рекомендация, которая указывает, что один вариант лучше другого?

Эти два параметра следующие:

1 - Возвращать вложенные объекты

{
  "id": 1,
  "title": "Game A",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"id":1,"name":"Xbox"},
    {"id":2,"name":"Playstation"}
  ]
}

2 - вернуть ссылки на эти объекты

{
  "id": 1,
  "title": "Game A",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"_self": "http://api.example.com/games/1/platforms/53"},
    {"_self": "http://api.example.com/games/1/platforms/34"},
  ]
}

1 Ответ

1 голос
/ 08 февраля 2020

«Это зависит».

Кэширование является одним из ключевых архитектурных ограничений в архитектурном стиле REST. Когда мы кэшируем представление ресурса, мы кэшируем все представление как один атом; когда мы делаем недействительным, мы делаем недействительным все представление.

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

Существует аналогичное соображение, когда вы собираетесь повторно использовать одно и то же представление в разных контекстах - представьте себе сайт, где каждая страница использует один и тот же lo go и согласованный стиль представления. Вы, вероятно, захотите кешировать lo go и таблицу стилей, а не встраивать их в каждое зависящее от них представление.

В случаях использования удаленной авторизации вы, скорее всего, будете встраивать. Проблема возникает, когда модификация одной сущности собирается каскадно в другую - HTTP поддерживает аннулирование кэша для небезопасных запросов, но у него нет общего механизма для объявления other ресурсы, которые также должны быть признаны недействительными.

...