Как вернуть случайные элементы без проблем?
Вопрос
Мой дизайн предоставляет два вида ресурсов:
- Изображения
- Теги
Я бы хотел, чтобы клиенты могли запрашивать случайные изображения по своим тегам.Например:Дайте мне случайные изображения с пометками "Нью-Йорк" и "Зима".Как бы выглядел дизайн RESTful в этом случае?
Решение
Чтобы подвести итог всему обсуждению в комментариях, и не менять мое первоначальное предложение, вот к чему я пришел в конце концов:
Вы хотите получить доступ к изображениям с помощью тегов;каждый тег относится к набору изображений.Поскольку данный тег может использоваться намного чаще, чем другой (скажем, фотографии Нью-Йорка используются намного чаще, чем фотографии Чикаго), вам следует использовать конфигурацию RESTful, которая допускает кэширование, чтобы вы могли кэшировать фотографии Нью-Йорка.ИМХО, решением было бы:
Каждое изображение имеет фиксированный URI:
http://www.example.com/images/12345
Каждый тег также имеет URI:
http://www.example.com/tags/New_York/random
Этот URI действует как случайный диспетчер изображений на множестве;он возвращает 303 См . Другое ответ, перенаправляющий на случайное изображение из набора. По определению, этот URI не должен быть кэширован, а фиксированный должен быть, и браузер не должен понимать, что перенаправление на второй ресурс является постоянным, поэтому оно оптимально.
Вы даже можете получить доступ ко всему набору через:
http://www.example.com/tags/New_York
Такой доступ привел бы к 300 Вариантов выбора ответ;он возвращает весь набор (в виде URI, а не в виде изображений!) браузеру, и браузер решает, что с ним делать.
Вы также можете использовать пересечение различных тегов:
http://www.example.com/tags/New_York/Autumn/Manhattan/random http://www.example.com/tags/Autumn/Manhattan/New_York/random (equivalent to the previous one) http://www.example.com/tags/New_York/girls/Summer/random etc.
Таким образом, у вас есть фиксированный URI для каждого изображения, фиксированный URI для каждого тега и связанного с ним набора фотографий и фиксированный URI для случайного диспетчера, который есть у каждого тега.Вам не нужно использовать какие-либо параметры GET в качестве других потенциальных решений, так что это настолько RESTful, насколько вы можете получить.
Другие советы
Я сам боролся с этим вопросом.В итоге мы реализовали HttpResponseRedirect из, например:
http://www.example.com/randomNewYorkImage
к случайному изображению Нью-Йорка:
http://www.example.com/images/New_York/1234.
Первый ресурс можно представить как случайный диспетчер изображений из Нью-Йорка.Это решение больше загрузит сервер, так как ему будут запрошены два ресурса, но оно настолько RESTful, насколько вы можете получить.
Отредактированный:Кроме того, если вы выполняете кэширование, каждое изображение будет находиться в кэше, и ваш сервер перейдет от отправки изображения к отправке только перенаправления, поскольку кэш перехватит второй запрос и, таким образом, снизит нагрузку на ваш сервер.
Многомерная идентификация ресурсов является сложной задачей.
Ваш ресурс - это изображение, так что это ваш URI.Кроме того, конкретное изображение имеет определенный URI, который никогда не меняется.
Ваш "по тегу" - это неидентифицирующий атрибут ресурса.Для этого может использоваться строка запроса belp.
Вот моя первая мысль.
http://www.example.com/MyStuff/image/
ID/
-- конкретное изображение по идентификаторуhttp://www.example.com/MyStuff/image/?tag=
название тега -- случайное изображение с заданным тегом, неявно,count=1
.http://www.example.com/MyStuff/image/?tag=
название тега&count=all
-- все изображения с заданным тегом в случайном порядке (count=1
является значением по умолчанию, которое даст вам произвольное изображение)
Я бы сделал что-то вроде http://foo.com/image/tagged/sometag/random
и перестань терять из-за этого сон.
В этом я согласен с "Триптихом".В некотором смысле добавление random в конец URI делает это похожим на операцию, но если она ограничена тегом, то на самом деле вы просто уточняете контекст.
В его примере:
/изображение/с тегом/sometag/ случайное
ресурс изображений -> область тегирования (все изображения с тегами) -> определенный тег (все изображения с тегом X) -> случайный (ресурс из ограниченного списка изображений с тегом X)