2009-09-18 2 views
2

У меня есть приложение rails с URL-адресами RESTful-ish, где мне нужно передать коллекцию строк (тегов), и я не хочу использовать строку запроса.Каков наилучший способ RESTful передать коллекции строк в качестве параметров?

В настоящее время я использую маршрут, похожий на /controller/tagged/:tags/foo/:foo/bar/:bar.:format

Это требует «метки», чтобы быть закодирован, который является боль и подвержена ошибкам, если вы хотите вручную ввести URL-адрес.

Другие подходы, такие как/controller/tagged/tag1/tag2/tag3/foo ..., сложны в том, что они неоднозначны (неясно, где заканчивается конец тегов и запускаются другие параметры).

Как другие люди подходят к подобным вещам и каково ваше решение для выражения его как маршрута рельсов?

ответ

-1

Ну, вы всегда можете ПОСТ.

+1

REST использует POST для специального назначения (создания нового ресурса), поэтому, если он пытается получить ресурс, он не будет использовать POST ... – SingleShot

+1

Он на самом деле не говорит, что он делает, хотя:) – SingleShot

+0

@SingleShot хорошая точка, хорошо сделанная :-) В основном я пытаюсь получить набор ресурсов, отфильтрованных параметрами. Они на самом деле являются местоположениями - поэтому они отфильтрованы по тегу, точке происхождения, расстоянию и т. Д. Поэтому да, это должно быть GET. Я хочу иметь возможность кэшировать его. – frankodwyer

4

Предположим, вы пытаетесь найти ресурс, возможно, «Список вопросов», и вы хотите отфильтровать список на основе набора «Метки» (что отличная идея!).

Ваш URL должен быть путь к ресурсу. Возможно, /questions будет хорошим URL. Я знаю, что вы не хотите использовать параметры URL для своих тегов, но в GET, для чего они предназначены, - фильтрации или настройки представления ресурса. Таким образом, чтобы фильтровать несколько предметов, представляющих интерес, а не получать все вопросы, ваш URL может выглядеть следующим образом:

/questions?tag=ruby-on-rails&tag=restful&tag=url-routing 

Я считаю, что это RESTful способ. Альтернативы могут быть приемлемыми, но я думаю, что они будут нарушать «пуристскую» форму REST.

+0

моя проблема с строкой запроса здесь заключается в том, что рельсы, похоже, не учитывают ее при кэшировании к кешу страницы. Другими словами, тег/тег = foo и/questions? Tag = bar перейдет в одно и то же место в кеше страницы:/questions – frankodwyer

+0

Мне нужно будет с этим разобраться, поэтому ушел и выкопал немного. Поиск показывает общую тему: используйте подключаемый модуль rails, который позволяет вам настраивать ключи кеша (позволяя параметрам быть частью ключа). Вопрос в том, делает ли это нарушение REST или является проблемой кэширования? Вот ссылка на плагин: http://agilewebdevelopment.com/plugins/action_cache – SingleShot

+0

для кэширования действий, я смог получить это, используя ванильные рельсы, например: caches_action: controller,: expires_in => 1.hour, : cache_path => Proc.new {| c | "control/# {c.params [: bar]}/# {c.params [: foo]}". gsub (/ /, '')} Это подталкивает параметры в путь кэш-памяти и гарантирует, что отдельные запросы кэшируются отдельно. Однако я не уверен, какая версия рельсов это требует - я использую 2.3.2. Кроме того, я не знаю, можно ли сделать подобное в отношении кеша страницы. – frankodwyer

2

Используйте строку запроса. Именно для этой цели: передача закодированных аргументов в ресурс.

Ваша версия с использованием элементов пути скрывает тот факт, что /controller/tagged является фактическим запрашиваемым ресурсом, с тегами в качестве параметров для запроса.

Чтобы понять, почему подход путь не RESTful, рассмотрим следующие два адреса:

http://example.com/controller/tagged/foo/bar

http://example.com/controller/tagged/bar/foo

По описанию вы дали, они должны относиться к одной и той же виртуальной коллекции помеченные элементы. Однако в системе RESTful URL-адреса однозначно относятся к одному и только одному ресурсу. Ваша адресная адресация связывает множество URL-адресов с одним результатом.

+0

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

+0

btw +1 за наблюдение, что два URL-адреса сопоставляются с одной и той же коллекцией ресурсов - не думал об этом. Не уверен, что это проблема на практике, но было бы неплохо избежать этого. – frankodwyer

+0

В этом случае вам может понадобиться управлять кешем непосредственно в контроллере, а не кэшировать на уровне страницы. Попробуйте что-то вроде 'cache (: key =>" tagged/# {params [: tag] .join (',')} ") do ...' в вашем действии контроллера, фиксируя результат запроса и получения шаблона для возврата списка отмеченных ресурсов. – rcoder

1

Сэм Руби и Леонард Ричардсон рекомендуют в своей книге Restful Web Services для разделения неиерархических данных запятыми или точками с запятой (и переменными запроса для алгоритмических ресурсов).

+0

Можете ли вы уточнить «и переменные запроса для алгоритмических ресурсов»? Не получилось - какие-нибудь примеры? – frankodwyer

+0

Поиски, например, должны быть лучше адресованы как www.google.com/search?q=jellyfish, чем как www.google.com/search/jellyfish –

Смежные вопросы