Должны ли данные json в спокойном ответе содержать информацию о типе объекта? - PullRequest
2 голосов
/ 09 января 2012

Допустим, мы хотим заполнить некоторые модели javascript (например, модели backbone.js), учитывая ответ json от сервера, подобный этому:

{
  "todo": {
    "title": "My todo",
    "items": [
      { "body": "first item." },
      { "body": "second item"}
    ]
  }
}

Эти данные не содержат информацию о типе, поэтому мыне знаю, какую модель заполнять, когда мы видим клавишу "todo".

Конечно, можно создать некоторый пользовательский стандарт, чтобы связать ключи в объекте ответа json с моделями на стороне клиента.Например:

{
  "todo": {
    "_type": "Todo",
    "title": "My todo",
    ...
  }
}

Хотя это работает для объектов, становится неловко, когда дело доходит до списков:

"items": {
  "_type": "TodoItem",
  "_value": [
    { "body": "first item." },
    { "body": "second item"}
  ]
}

Перед созданием этих пользовательских правил возникают вопросы:

  • Существуют ли какие-либо рекомендации RESTful по включению информации о типе стороны клиента в данные ответа?

  • Если нет, целесообразно ли включать информацию о типе стороны клиентав ответе json?

  • Помимо всего этого подхода к заполнению моделей, каковы другие альтернативы?

Редактировать

Хотя тип модели можно извлечь из URL-адреса, например, /todo и /user, проблема этого подхода состоит в том, что первоначальная совокупность N моделей будет означать N http запросов.

Вместо этого начальная популяция может быть сделана из одного большого объединенного дерева только с одним запросом.В этом случае информация о типе модели в URL теряется.

Ответы [ 4 ]

2 голосов
/ 09 января 2012

Разная конечная точка (url) используется для каждого объекта REST.Таким образом, URL включает информацию «какая модель».

И каждая модель представляет собой фиксированный набор переменных и (фиксированных) типов.

Таким образом, обычно нет необходимости отправлять динамическую информацию о типе по проводам.

Добавлено Re комментарий от @ali -

Исправить.Но теперь вы задаете другой / более точный вопрос: «Как мне справиться с начальной загрузкой моделей Backbone, не вызывая много запросов http?»Я не уверен в лучшем ответе на этот вопрос.Одним из способов было бы указать магистрали загружать несколько коллекций моделей.

Это уменьшило бы количество вызовов до одного для модели по сравнению с одним для экземпляра модели.

Вторым способом был бы вызов / ответ без REST для загрузки текущего дерева данных изсервер.Это хорошая идея.Браузер-клиент может получить ответ и затем передать его модель за моделью в магистраль.Не забудьте дать пользователю некоторую обратную связь о том, что происходит.

Re: вложенные модели.Вот это SO q .

1 голос
/ 09 января 2012

Учтите, что, как уже говорилось в других ответах, в REST каждый ресурс имеет свою конечную точку, и, следовательно, то, что вы пытаетесь сделать (т.е. скрыть все свои модели за одной конечной точкой), не полностью соответствует REST, IMHO,Ничего страшного как такового.

Здесь могут быть вложенные коллекции.

Коллекция «обертка» извлекает все модели из одной конечной точки во время инициализации и отправляет их в соответствующие коллекции.Конечно, вы должны отправить информацию о типе в json.

С этого момента каждая «внутренняя» коллекция реагирует на свои собственные события и имеет дело со своей собственной конечной точкой.

Я неНе вижу огромных проблем с такой оптимизацией, если вы знаете об этом.

0 голосов
/ 10 января 2012

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

0 голосов
/ 09 января 2012
  1. REST не имеет ничего общего с контентом, отправляемым туда и обратно.Он имеет дело только с как состояние передается.JSON (это протокол, который вы, похоже, используете) будет тем, который указывает, что должно быть отправлено, и, насколько я знаю, это не диктует это.
  2. Включение информации о типе вполезная нагрузка JSON действительно зависит от библиотек, которые вы используете.Если вам будет проще использовать JSON для включения типов, я бы сказал, вставьте его. Если нет, оставьте его.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...