命名其余URL

时间:2011-03-19 11:40:27

标签: c# java php web-services rest

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

其他架构建议构建这样的URL

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

    如果我需要提供以下内容,那将是一个很好的做法:

    第一

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

    我在考虑/ page / {id}(用于json信息)和/ page / {id} /下载用于doc格式 (有推荐吗?)

    第二

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

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

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

  • 4 个答案:

    答案 0 :(得分:3)

    [学术咆哮] 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不是。

    书籍列表将以此媒体类型进行编码,例如descritpion,其中包含链接。您可以按照自己的方式对超媒体(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等,但最好坚持标准动词。

    答案 1 :(得分:1)

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

    带有PUT,GET,DELETE的

    / book / {id} /用POST预订

    答案 2 :(得分:1)

    最佳做法是使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

    答案 3 :(得分:0)

    正如Irido所说,命名完全取决于你。如果我在你的鞋子里,我会使用参数来确定返回数据的格式,例如。 format = json或format = doc或者其他东西。如果未指定format参数,则返回默认格式。 这样,如果你想要不同的格式(只需在url中添加另一个参数),你就不必做一些花哨的url操作。您可以轻松添加新格式,而无需重新思考网址。