【问题标题】:Naming Rest URLs [closed]命名休息 URL [关闭]
【发布时间】:2011-03-19 11:40:27
【问题描述】:

我正在构建一个 REST 服务器(向我的客户提供书籍)

其余架构建议这样构造 URL

  • /book/{id} GET 获取图书 ID
  • /page/{id} GET 获取页面ID
  • 等等...

    如果我需要提供以下内容,最好的做法是:

    第一

  • json格式的页面信息(如页数,..)
  • doc格式的页面信息(供下载)

    我在考虑 /page/{id} (用于 json 信息)和 /page/{id}/download 用于文档格式 (有推荐的吗?)

    第二

  • 返回图书 json 信息(类似于 /book/{id}
  • 返回图书状态 (0,1)

    我应该构建一个像 /bookstatus 这样的新资源,还是应该为主要资源 /book/{id}/status 和 /book/{id} 提供多个选项以获取所有信息

    我只需要知道在这种情况下是否有一些 url 的最佳实践和命名约定!

  • 【问题讨论】:

      标签: c# java php web-services rest


      【解决方案1】:

      [学术咆哮] REST 不推荐使用 URI 模板,因为客户端需要知道这些带外信息。您可以添加一些您喜欢的内容,但要便于猜测或编码。 [/学术咆哮]

      方法是获取应用程序的入口点,然后使用链接来引导您的客户。像这样发现您的应用程序接口并将带外信息保持在最低限度。

      您提供的代表类型是通过内容协商或客户明确要求完成的。例如一些想法:

      GET /mybooks (Content negotiation or server decides - feel like html?)
      GET /mybooks.xml 
      GET /mybooks.json
      GET /mybooks.csv
      GET /mybooks.xhtml
      GET /mybooks/{id}.doc (Download)
      PUT /mybooks/{id} (Add a book / id to my list)
      DELETE /mybooks/{id} (Remove from my list)
      POST /mybooks (Add a book / id to my list)
      

      注意:PUT 是幂等的,POST 不是。

      书籍列表将以这种媒体类型编码,例如带有指向特定书籍的链接的描述。您可以按照您想要的方式对超媒体(JSON 或 xHtml)中的链接进行编码,但最好使用一些标准(如 <link><a> 标签)来覆盖更广泛的受众。然后,您可以命名/类型链接到您想要的格式。例如一些想法:

      GET /book/{id}.html (Status and other info)
      GET /book/{id}/summary (Status and other info)
      GET /book/{id}.doc (Download)
      GET /book/{id}.zip (Download)
      GET /book/{id}/chapter/{id}.doc 
      POST /book (add book to database)
      DELETE /book/{id} (Burn the book)
      

      您可以根据需要设计 URI。但是,如果可以通过链接发现资源,那就更好了。您可以使用其他动词,例如 OPTIONS、HEAD、GETBOOKINFO 等,但最好使用标准动词。

      【讨论】:

        【解决方案2】:

        据我所知,命名约定由您决定(显然有一些逻辑)。您可能会对相同的资源/url 使用不同的动词。

        /book/{id} 与 PUT、GET、DELETE / 使用 POST 预订

        【讨论】:

        • 动词不是问题,但多个答案才是问题。
        • 如另一个答案中所述,最好选择 /book/{id}.{format} ,其中 {format} 将是 html、json 等。
        【解决方案3】:

        最好的做法是使 URI 独一无二(意味着在功能方面没有冗余),无论您提供什么类型的内容。考虑统一 URI 并使用内容协商和 HTTP 接受标头传递不同的内容。

        因此,理想情况下,GET /book/{id} 会根据客户端指定的接受标头以 text/html、application/json 等形式提供图书详细信息。

        http://www.w3.org/QA/2006/02/content_negotiation.html http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html

        【讨论】:

          【解决方案4】:

          正如 Irido 所说,命名完全取决于你。如果我站在你的立场上,我会使用参数来确定返回数据的格式,例如。 format=json 或 format=doc 什么的。如果没有指定格式参数,则返回默认格式。 这样,如果你想要不同的格式,你就不必做一些花哨的 url 操作(只需在 url 中添加另一个参数)。而且您可以轻松添加新格式,无需重新考虑 url。

          【讨论】:

            猜你喜欢
            • 2015-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-25
            • 2012-01-27
            • 2017-05-31
            • 1970-01-01
            相关资源
            最近更新 更多