RESTful API设计最佳实践

时间:2011-08-11 13:39:20

标签: api rest

我目前正在为我的项目编写API层,并且正在努力为以下场景找出一个好的设计方法:

  1. 所有用户都有图书清单
  2. 每个列表都可以通过ID
  3. 访问
  4. 用户可以随意添加和删除图书
  5. 目前,我不确定哪种方法最好:

    1) PUT - /api/list/{listID}/{bookID} - Add book to specified list
       DELETE - /api/list/{listID}/{bookID} - Remove book from specified list
    2) PUT - /api/list/{listID} - Send XML data to server that contains bookID and action
       <list_payload>
           <action>{delete|add}</action>
           <bookID>{bookID}</bookID>
       </list_payload>
    

    任何见解都将受到赞赏。

6 个答案:

答案 0 :(得分:21)

我想是这样的

1)POST - /api/lists/{listID}/books - Add book to specified list
2)PUT - /api/lists/{listID}/books/{bookID} - Edit book from a specified list
3)DELETE - /api/lists/{listID}/books/{bookID} - delete

for List

POST - /api/lists Add list
PUT - /api/lists/{listID} Edit list
DELETE /api/lists/{listID} Delete list

答案 1 :(得分:3)

REST中没有约束,因为它更像是通过HTTP解决问题的方法,而不是像SOAP这样的强大标准的硬Web服务协议。

说这两个选项都是有效的,但为了简单起见,我认为你必须选择第一个选项。

答案 2 :(得分:1)

我认为这是了解如何设计正确的REST服务的非常好的明确指南。 它不仅涵盖了这个问题,而且为设计过程提供了更多线索。

您可以观看:https://www.youtube.com/watch?v=hdSrT4yjS1g 或者您可以快速查看:http://www.slideshare.net/stormpath/rest-jsonapis

答案 3 :(得分:0)

我会解释第一个例子,因为你正在更新列表中存在的书。这意味着,本书已自行设置数据,但在列表中它有更多属性,您可以通过 {listID} / books / {bookID} 网址更新。

如果您想更新列表内容(即添加或删除图书),那么在 lists / {listID} 网址上调用PUT对我来说最有意义。

-Dan

答案 4 :(得分:0)

正如@MartinRevert指出的那样,除了你自己设置的REST API设计之外,它实际上没有任何限制。

对于我自己,我建议关注可测试性和UI开发人员的简单性,而不是利用HTTP协议的所有功能。最后,他们是您的客户,如果他们的JavaScript框架不遵循所有HTTP资源约定(Angular didn't for the 201 Created redirect in an earlier version

GET用于检索数据。主要是因为它可以缓存。这将返回适当内容类型的数据。

POST将修改数据或接受复杂的搜索查询。在我的合同中,总是返回一个JSON对象。

通过将事物保持为POST,您可以创建一个简单的表单,而无需执行XHR操作来进行某些功能测试。

我在这里写了一个更深入的答案http://www.trajano.net/2014/07/rest-api-contract/

答案 5 :(得分:0)

这是一个实验性JSon服务的链接,其中包含网络和Android的源代码下载链接: developersfound.com/RESTExperiment/

我在业余时间使用REST做了很多实验性代码。我最近使用并试验了很多框架,并且我已经完成了整个循环,并意识到简单的HTTP JSon是最有效的。 大多数人都认为无状态是REST的优势,但HTTP也是无状态的。如果你需要,HTTP还有一个额外的优势:连接状态或会话状态。它也更安全。 但是,如果您坚持沿着REST路线前进,请尝试使用不使用自定义路由的路由引擎来查找框架。这依赖于正则表达式,因为这给服务器带来了很大的负担。非正则表达式路由对您设计和开发服务的方式提出了一些限制,但如果您重视具有最小瓶颈的快速服务器,那么它是值得的。另一种最小化瓶颈的好方法是使用存储过程而不是传递查询。对于那些不知道传递查询是什么的人。当开发人员在服务器上动态生成SQL字符串并将其传递给数据库时,它与使用存储过程正好相反。存储过程摆脱了瓶颈,因为传递查询会导致服务器在每次服务器受到攻击时动态生成sql。使用存储过程,您只需将请求中的参数直接传递给数据库。此外,存储过程也被编译,这意味着即使数据库也不必动态生成SQL。当SQL 92标准于1992年问世时,传递查询成为遗留问题。我上面的链接实际上是实验代码,但你会发现这个博客很有见地。