Какой лучший способ RESTful передать коллекции строк в качестве параметров? - PullRequest
2 голосов
/ 19 сентября 2009

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 19 сентября 2009

Допустим, вы пытаетесь GET ресурс, возможно, «Список вопросов», и вы хотите отфильтровать список на основе набора «Теги» (Какая отличная идея!)

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

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

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

2 голосов
/ 19 сентября 2009

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

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

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

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

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

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

1 голос
/ 19 сентября 2009

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

0 голосов
/ 19 сентября 2009

Ну, вы всегда можете ПОСТАВИТЬ их.

...