如何以RESTful方式返回随机项目?

如何以RESTful方式返回随机项目?,rest,random,Rest,Random,我的设计公开了两种资源: 图像 标签 我希望客户能够要求他们的标签随机图像。例如:给我随机图像,标记为“纽约”和“冬天”。在这种情况下,RESTful设计会是什么样子?多维资源识别是一项挑战 您的资源是一个图像,因此这是您的URI。此外,特定图像具有永远不会更改的特定URI 您的“by标记”是资源的非标识属性。为此,可以使用查询字符串 这是我的第一个想法 http://www.example.com/MyStuff/image/id/--按id显示的特定图像 http://www.exampl

我的设计公开了两种资源:

  • 图像
  • 标签

  • 我希望客户能够要求他们的标签随机图像。例如:给我随机图像,标记为“纽约”和“冬天”。在这种情况下,RESTful设计会是什么样子?

    多维资源识别是一项挑战

    您的资源是一个图像,因此这是您的URI。此外,特定图像具有永远不会更改的特定URI

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

    这是我的第一个想法

    • http://www.example.com/MyStuff/image/
      id
      /
      --按id显示的特定图像
    • http://www.example.com/MyStuff/image/?tag=
      tagname——带有给定标记的随机图像,隐式地,
      count=1
    • http://www.example.com/MyStuff/image/?tag=
      标记名
      &count=all
      --具有给定标记的所有图像以随机顺序排列(
      count=1
      是默认值,这将为您提供任意图像)

    我一直在努力解决这个问题。我们最终实施的是一个直接来自的HTTPResponseResponseR,例如:

    随机选择一张纽约图片:

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


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

    我将执行类似于
    http://foo.com/image/tagged/sometag/random
    ,不要因为它而失眠

    在这一点上,我同意Triptych的观点。在某种程度上,向URI末尾添加random会让它感觉像是一个操作,但如果它的作用域是一个标记,那么您实际上只是在细化上下文

    在他的例子中:

    /图像/标记/某些标记/随机


    图像资源->标记范围(带标记的所有图像)->特定标记(带标记X的所有图像)->随机(带标记X的图像范围列表中的一个资源)

    为了总结评论中的所有讨论,而不是更改我最初的建议,我最后得出以下结论:

    您希望通过标签访问图像;每个标记都与一组图像相关。由于一个给定的标签可能比另一个标签使用得更多(比如说,纽约的照片使用得比芝加哥的多得多),您应该使用一个允许缓存的RESTful配置,这样您就可以缓存纽约的照片。依我看,解决办法是:

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

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

      http://www.example.com/tags/New_York/random
      
      此URI充当集合上图像的随机分派器;它返回一个响应,重定向到集合的随机图像,这个URI不能被缓存,而固定的URI应该被缓存,浏览器不应该理解到第二个资源的重定向是永久的,所以它是最佳的

    • 您甚至可以通过以下方式访问整个集合:

      http://www.example.com/tags/New_York
      
      这种访问将导致响应;它将整个集合(作为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。

    我认为如果每个标记都有一个URI(因为它是一个资源,但不是一个文件),那么它将更加RESTful。我看不太清楚的是标记集的随机顺序……RESTful很少涉及任何顺序规范(可以,但很少)。对于SQL查询,默认顺序是随机的。这里也是一样——默认顺序是随机的。我不知道在SQL中,但在REST中,集合的默认顺序可能是“未排序”,但不是特别随机的(如果可以的话,足够随机,统计上随机)。我的意思是,它不必像“成为第一个”一样随机。再次,我建议将这个特定的RESTful资源集合明确定义为“随机”。而且,这与SQL兼容,所以有一个先例。哦,好的,对不起。我理解你说它是在REST中定义的,而不是“为了方便起见,我们将这样定义”。我的错!该解决方案的问题在于,它不将URI与固定图像链接,因此,除其他外,您不能缓存它。当然,您不能直接缓存此URI——您要求的是随机图像。如果你想考虑缓存,请求这个资源可以将HTTP 302重定向到可缓存的URI(像这种情况下的真正权威的图像资源)。@革命,缓存仍然没有意义,因为你不应该期望一个随机访问的图像在短期内再次被请求。这取决于图像的数量和请求的数量;作为一个固定URI,它可以被许多客户端使用。你怎么能缓存一个随机资源呢?然后你会在重复请求的情况下缓存web服务器上的每个图像。反过来想想:图像缓存可能是因为另一个原因:在这种情况下,缓存将使用缓存副本。不管怎么说,缓存的职责不是你的,而是确定要缓存什么和不要缓存什么——至少你应该给它一个机会。缓存一个随机图像是愚蠢的,因为你不应该期望它很快会再次被请求。因为它是随机的。假设一个数百万人使用的web应用程序显示一组图像中的一个,比如说,三个。举个例子,我们喜欢在一个典型的公司网站上工作。你不会缓存它吗?假设一个web应用程序有成千上万的用户请求数百万随机图像。然后缓存,缓存就会中断。那么,在你看来