Como devolver itens aleatórios restfully?
Pergunta
Meu projeto expõe dois tipos de recursos:
- Images
- Etiquetas
Gostaria clientes para ser capaz de solicitar imagens aleatórias pelo seu tag (s). Por exemplo: Dê-me imagens aleatórias que estão marcados com o "New York" e "Inverno". O que seria um olhar projeto RESTful como neste caso?
Solução
Para resumir toda a discussão nos comentários, e não para mudar a minha proposta inicial, este é o que eu chegar finalmente:
Você deseja acessar imagens através de etiquetas; cada etiqueta refere-se a um conjunto de imagens. Como uma determinada tag pode ser usada muito mais do que o outro (digamos, Nova York Fotos usado muito mais do que de Chicago), você deve usar uma configuração RESTful que permite o armazenamento em cache, assim você pode armazenar em cache New York fotos. IMHO, a solução seria:
-
Cada imagem tem um URI fixo:
http://www.example.com/images/12345
-
Cada marca tem também um URI:
http://www.example.com/tags/New_York/random
Este URI atua como um despachante aleatória de imagens no conjunto; ele retorna um 303 See Outros resposta, redirecionando para uma imagem aleatória do conjunto. por definição, este URI não deve ser armazenada em cache, e um fixo deve, e o navegador não devem entender que o redirecionamento para o segundo recurso é permanente, por isso é ideal.
-
Você pode até mesmo acessar todo o conjunto via:
http://www.example.com/tags/New_York
Este acesso resultaria em uma 300 múltiplas escolhas resposta; ele retorna todo o conjunto (como URIs, não como imagens!) para o navegador eo navegador decide o que fazer com ele.
-
Você também pode usar intersecção de várias tags:
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.
Então você tem um URI fixo para cada imagem, um URI fixo para cada tag e seu conjunto relacionado de fotos, e uma URI fixo para um despachante aleatório que cada marca tem. Você não precisa usar quaisquer parâmetros GET como outras soluções possíveis, então isso é como RESTful como você pode começar.
Outras dicas
Eu tenho lutado sozinho com esta questão. O que acabamos implementação foi um HttpResponseRedirect de, por exemplo:
http://www.example.com/randomNewYorkImage
para uma imagem New York aleatória:
http://www.example.com/images/New_York/1234 .
O primeiro recurso pode ser concebida como um aleatória New York imagens despachante. Esta solução irá carregar mais o servidor, uma vez que irá ser solicitada dois recursos, mas é como RESTful como você pode começar.
Editado: Além disso, se você estiver cache, cada imagem será no cache, e seu servidor vai de enviar uma imagem para enviar apenas o redirecionamento, como o cache irá interceptar o segundo pedido, e, assim, aliviar a sua carga do servidor.
identificação de recursos multi-dimensional é um desafio.
Seu recurso é uma imagem, de modo que é o seu URI. Além disso, uma imagem específica tem um URI específico que nunca muda.
Seu "pela tag" é um atributo de não-identificação do recurso. Para isso, uma string de consulta pode BELP.
Aqui é o meu primeiro pensamento.
-
http://www.example.com/MyStuff/image/
id/
- imagem específica por id -
http://www.example.com/MyStuff/image/?tag=
tagname -. Image aleatória com uma determinada tag, implicitamente,count=1
-
http://www.example.com/MyStuff/image/?tag=
tagname&count=all
- todas as imagens com uma determinada tag em uma ordem aleatória (count=1
é o padrão, o que lhe daria uma imagem arbitrária)
Eu faria algo como http://foo.com/image/tagged/sometag/random
e parar de perder o sono por isso.
Eu concordo com Tríptico em um presente. De uma forma adicionando aleatória para o fim do URI faz sentir como uma operação, mas se ele tem como escopo a um tag, então você está realmente apenas refinando o contexto.
Em seu exemplo de:
/ image / marcado / sometag / random
recursoimagens -> marcar escopo (todas as imagens com as tags) -> tag específica (todas as imagens com tag X) -> aleatório (um recurso da lista escopo de imagens com tag X)