如何RESTful返回随机项?

时间:2008-12-30 19:21:19

标签: rest random

我的设计暴露了两种资源:

  1. 图片
  2. 标签
  3. 我希望客户能够通过他们的标签请求随机图像。例如:给我标记为“纽约”和“冬季”的随机图像。在这种情况下,RESTful设计会是什么样子?

5 个答案:

答案 0 :(得分:4)

总结评论中的所有讨论,而不是改变我的初步提案,这就是我最终提出来的:

您想通过标签访问图片;每个标签与一组图像有关。由于给定标签可能比其他标签使用得多(比如纽约照片比芝加哥使用的更多),您应该使用允许缓存的RESTful配置,这样您就可以缓存纽约照片。恕我直言,解决方案是:

  • 每个图片都有一个固定的URI:

    http://www.example.com/images/12345
    
  • 每个标记都有一个URI:

    http://www.example.com/tags/New_York/random
    

    此URI充当集合上图像的随机调度程序;它返回303 See Other响应,重定向到该集的随机图像。 By definition,这个URI不能被缓存,而且固定的URI应该是,并且浏览器不应该理解重定向到第二个资源是永久性的,所以它是最优的。

  • 您甚至可以通过以下方式访问整套:

    http://www.example.com/tags/New_York
    

    此访问权限会导致300 Multiple Choices响应;它将整个集合(作为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。

答案 1 :(得分:2)

我一直在努力解决这个问题。我们最终实现的是一个HttpResponseRedirect,例如:

http://www.example.com/randomNewYorkImage

随机纽约图片:

http://www.example.com/images/New_York/1234

第一个资源可以被视为随机的纽约图像调度程序。这个解决方案将加载更多的服务器,因为它将被请求两个资源,但它是尽可能RESTful。

已编辑:另外,如果您正在缓存,则每个图像都将位于缓存中,并且您的服务器将从发送图像转到仅发送重定向,因为缓存将拦截第二个请求,从而减轻您的服务器负载。

答案 2 :(得分:1)

多维资源识别具有挑战性。

您的资源是图片,因此这是您的URI。此外,特定图像具有永不改变的特定URI。

您的“by tag”是资源的非标识属性。为此,可以使用查询字符串

这是我的第一个想法。

  • http://www.example.com/MyStuff/image/ id / - ID的特定图片
  • http://www.example.com/MyStuff/image/?tag= 标记名 - 带有给定标记的随机图片,隐含地count=1
  • http://www.example.com/MyStuff/image/?tag= 标记名 &count=all - 所有带有给定标记的图片都是随机顺序(count=1是默认设置,可以为您提供任意图片)

答案 3 :(得分:0)

我会做http://foo.com/image/tagged/sometag/random这样的事情并且不再为此失眠。

答案 4 :(得分:0)

我同意Triptych的观点。在某种程度上,将随机数添加到URI的末尾会使其感觉像是一个操作,但如果它的作用域是标记,那么您实际上只是在改进上下文。

在他的例子中:

/图​​像/标记/ sometag /随机

图片资源 - >标记范围(所有带标签的图像) - >特定标签(所有带标签X的图像) - > random(来自带有标记X的范围的图像列表中的资源)