Магистральные коллекции, REST и Bare Arrays
В Backbone, кажется, рекомендуется, чтобы ресурсы коллекции возвращали пустые массивы. Похоже, что это обусловлено моделью ведения дел в Rails, которая вовсе не является хорошей причиной что-либо делать. У меня есть несколько проблем с этим:
- Часто ресурсу 'collection' также необходим контекст вокруг него. По крайней мере, мне нравится соглашение о включении URI ресурса в ответ. Другие вещи, такие как подкачка страниц, промежуточные итоги (например, в корзине) и т. Д., Означают, что коллекции редко бывают "голыми".
- У голых массивов предположительно есть проблемы с безопасностью. Я слышал это в нескольких местах, но мне нужны ссылки, чтобы подтвердить это.
С другой стороны, я вижу, как "голые" массивы делают API более естественным:
- Формат каждого объекта в коллекции будет таким же, как формат при создании / обновлении объекта в этой коллекции.
- "Коллекция" семантически хорошо согласуется с идеей коллекции предметов.
Отказ от ответственности: предпосылка здесь может быть совершенно ошибочной. Я понимаю, что REST - это гораздо больше, чем HTTP-глаголы и JSON.
1 ответ
Проблема безопасности, которую вы цитируете, является уязвимостью CSRF, вызванной тем фактом, что массивы JSON, запрошенные сценарием, могут быть оценены путем переопределения собственного типа массива JavaScript. Вот хорошее объяснение уязвимости. AFAIK, это невозможно с простыми объектами JSON.
Тем не менее, Backbone не мешает вам обернуть ваши ответы коллекции. Вы можете переопределить Backbone.Collection.parse, чтобы "развернуть" или иным образом изменить необработанный ответ перед заполнением коллекции.
var MyCollection = Backbone.Collection.extend({
model:MyModel,
parse: function(response) {
//Assume the response looks like { "data": [ ... ] }
return response.data;
}
});
Обычно я предпочитаю обернуть ответы коллекции не только по соображениям безопасности, но и потому, что это обеспечивает большую гибкость и устойчивость к изменениям в API.