如何处理对象上的平静“动作”。

haj*_*poj 5 api rest web-services

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

我了解此处描述的基础知识:

最好/常见的 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)
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义。但是我如何形成回复/关注/转发/收藏的 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)
Run Code Online (Sandbox Code Playgroud)

或者做一个

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

或者说没有“标准方法”。无论如何,感谢您的帮助!

Ase*_*ore 4

很好的问题。

与往常一样,将框架切换为名词而不是动词会有所帮助。当您回复/等时,您正在利用哪些资源?这些资源也可以被获取/寻址吗?

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

例如回复:

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

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

  • (删除回复就相当于删除一条推文。)

关注/转发/收藏有点棘手,因为“名词”是轻量级连接,事实上,我只是在 Stack Overflow 上提出了公开这些连接的“最佳”方式:

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

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

希望这可以帮助!