我可以有一个没有集合URI的REST元素URI吗?

我可以有一个没有集合URI的REST元素URI吗?,rest,Rest,一个基本的休息问题。。我设计了一个RESTAPI,希望能够根据图书id获得图书推荐列表(即,客户端向服务器发送图书id=w,服务器回复推荐图书列表,id=x,y,z) 我认为有两种方法可以做到这一点: /推荐?bookId=标题 /推荐/标题 选项2对我来说似乎有点干净,但我不确定它是否会被视为良好的REST设计?因为/recommendation/thetitle看起来像元素URI,而不是集合URI(尽管在本例中它将返回集合)。此外,资源的第一部分(/建议)本身没有任何意义 感谢您的建议。此类

一个基本的休息问题。。我设计了一个RESTAPI,希望能够根据图书id获得图书推荐列表(即,客户端向服务器发送图书id=w,服务器回复推荐图书列表,id=x,y,z)

我认为有两种方法可以做到这一点:

  • /推荐?bookId=标题
  • /推荐/标题
  • 选项2对我来说似乎有点干净,但我不确定它是否会被视为良好的REST设计?因为
    /recommendation/thetitle
    看起来像元素URI,而不是集合URI(尽管在本例中它将返回集合)。此外,资源的第一部分(
    /建议
    )本身没有任何意义


    感谢您的建议。

    此类URL模式与REST无关。REST的所有定义属性都不需要可读的URL

    同时,如果正确遵循其中一个核心原则(HATEOAS),API客户机(应用程序,而不是人!)可以浏览API并获得执行基于已知消息格式的应用程序状态或资源状态所需转换所需的每个链接

    如果您觉得您的API必须具有可读的URL,那么它的设计可能根本不是RESTful的,这是一个好迹象。这意味着开发人员需要理解URL结构,并在客户端应用程序中的某个位置对其进行硬编码。REST原则上应该避免的事情

    引用罗伊·菲尔丁的话:

    RESTAPI不能定义固定的资源名称或层次结构(客户端和服务器的明显耦合)。服务器必须有控制自己名称空间的自由。相反,允许服务器通过在媒体类型和链接关系中定义这些指令来指导客户机如何构造适当的URI,例如在HTML表单和URI模板中完成。[此处的失败意味着客户端由于带外信息(例如特定于域的标准,它是面向数据的,相当于RPC的功能耦合)而采用资源结构]

    显然,无论API的RESTful程度如何,都没有什么能阻止您真正使URL有意义。即使它的目的不是由REST本身决定的(如果可以阅读,那么在我的脑海中,查看一个适当RESTful API的客户机留下的日志可能会更容易)

    最后,如果您对开发一个不完全RESTful的Web API很在行,并且希望客户机开发人员阅读此类文档并关心路径构建,那么您实际上可能会从可理解的URL中获益。据介绍,这在所谓的0-3级API中非常有用

    就REST而言,重要的是如何利用底层协议(本例中为HTTP)以及它允许您做什么。如果我们从这个角度考虑你的例子,<>代码>推荐/标题>代码>似乎更好。这是因为使用查询参数可能会阻止浏览器(如果您正在编写JS客户端,这一点很重要)或代理缓存响应,从而使重用现有工具和基础设施变得更加困难。

    选项2对我来说似乎更干净,但我不确定它是否被视为良好的REST设计?不。