2011-08-11 138 views
5

我现在写我的项目的API层,并正在与试图找出下列情形良好的设计方法挣扎:的RESTful API设计的最佳实践

  1. 所有用户都拥有的书籍
  2. 列表
  3. 每个清单都可以通过ID访问
  4. 用户可以添加,并在会删除书籍

目前,我不知道它的最好的办法是:

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> 

任何洞察力将不胜感激。

回答

19

我觉得像这样的

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 

的列表

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

是的。重要的是所有非幂等动作都需要通过POST进行; PUT必须是幂等的(即,如果浏览器默默地重复它,它不应该是一件坏事)。 –

+1

因此,在#2 PUT的情况下,您是否会通过“编辑操作”(即添加或删除)作为URL上的参数? – jfrey

+1

您可以在这里了解您的REST API的一些最佳实践saipraveenblog.wordpress.com/2014/09/29/rest-api-best-practices/ –

3

在REST中没有约束,因为更多的是通过HTTP解析事物的方式,而不是像SOAP这样的强标准的硬Web服务协议。

说,这两个选项可能是有效的,但为了简单起见,我认为你必须按照你的第一个选项去。

0

我会解释的第一个例子,你要更新的列表中存在的书。这意味着,图书本身已经设置了数据,但在列表中它具有更多属性,您可以通过{listID}/books/{bookID} url进行更新。

如果您要更新列表中的内容(即添加或删除书籍),然后在列表/ {listID}列表中调用PUT对我最有意义。

-Dan

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/

0

下面是一个实验性的JSON服务的链接与源代码的下载链接,Web和Android版本:0​​http://developersfound.com/RESTExperiment/restExperiment.html

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