4

所以我想知道在不改变对象状态的对象上执行操作的最佳实践是什么。如果这对我没有意义,我认为推文示例解释了我想说的。

我了解这里描述的基础知识:

什么是最好的/常见的 RESTful url 动词和动作?

以及在更新/获取/删除等对象时它是如何工作的。但是不改变对象状态的动作呢?

例如,假设我们有一个 tweet 对象:

GET     `/tweets  (gets a list of tweets)
GET     `/tweets/new (gets a new page to create a new tweet)
POST    `/tweets (posts data to server to create new tweet)
GET     `/tweets/:id (get a single tweet)
GET    `/tweets/:id/edit (get a page to edit an exisiting tweet)
PUT    `/tweets/:id (put data to server to edit exisiting tweet)
Delete `/tweets/:id (delete an exisiting tweet)

这对我来说很有意义。但是我如何形成回复/关注/转发/收藏的 URL,其中一些实际上并没有改变推文的状态?

我应该做下面的事情吗?

POST   `/tweets/:id/reply       (post the reply message to the server)
POST    `/tweets/:id/follow     (post a boolean? yes I follow?)
POST    `/tweets/:id/retweet    (again post a boolean?)
POST    `/tweets/:id/favorite   (ditto)

或者做一个

POST     `/tweet/:id/actions  (Do a post with the action I want to take as a parameter)

还是没有“标准方式”。无论如何感谢您的帮助!

4

1 回答 1

3

好问题。

与往常一样,它有助于将框架切换为名词而不是动词。当您回复/等时,您使用的资源是什么?这些资源也可以获取/寻址吗?

在你提到的每个案例中,我认为第二个问题的答案是肯定的。事实上,Facebook 的 Graph APIGitHub 的 REST API都遵循这种方法。

例如回复:

  • GET /tweets/:id/replies获取回复给定推文的推文列表

  • POST /tweets/:id/replies创建一条新推文来回复给定的推文。这里的重要部分是成功是一个201 Created带有Location设置为创建的推文端点的标头,例如/tweets/1234.

  • (删除回复只是删除推文。)

关注/转发/收藏有点棘手,因为“名词”是轻量级连接,事实上,我只是问了一个 Stack Overflow 问题,以寻找“最好”的方式来公开这些:

RESTful API 设计:CRUD 轻量级连接的最佳方式?

您可以在该线程上看到您可能实现关注/转发/收藏的特定方式。

希望这可以帮助!

于 2012-12-01T16:43:11.057 回答