所以我想知道在不改变对象状态的对象上执行操作的最佳实践是什么。如果这对我没有意义,我认为推文的例子解释了我想说的话。
我理解这里描述的基础知识:
What are the best/common RESTful url verbs and actions?
更新/获取/删除等对象时的工作原理。但是那些不会改变对象状态的动作呢?
例如说我们有一个推文对象:
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)
或者没有“标准方式”。 无论如何感谢你的帮助!
答案 0 :(得分:3)
很棒的问题。
与往常一样,它有助于将框架切换为名词而不是动词。你回复/等时你会采取什么资源?那些资源也可以获取/解决吗?
在你提到的每一个案例中,我认为第二个问题的答案是肯定的。事实上,Facebook's Graph API和GitHub's REST API都遵循这种方法。
E.g。回复:
GET /tweets/:id/replies
获取回复给定推文的推文列表
POST /tweets/:id/replies
创建新的推文以回复给定的推文。这里的重要部分是成功是201 Created
w / Location
标头设置为创建的推文的端点,例如/tweets/1234
。
(删除回复只是删除推文。)
关注/转发/收藏有点棘手,因为“名词”是轻量级连接,事实上,我刚刚问了一个Stack Overflow问题,以“揭示那些”最佳“方式:
RESTful API design: best way to CRUD lightweight connections?
您可以在该主题上看到您可能在/转发/收藏后实施的具体方式。
希望这有帮助!