在RESTful应用程序中,我们如何区分“动作”和HTTP动词(GET,POST,PUT,DELETE)?

时间:2012-08-07 23:27:56

标签: api model-view-controller http url rest

在RESTful应用程序中,我们如何区分“动作”和HTTP动词(GETPOSTPUTDELETE)?

例如,据我了解,对资源GET的{​​{1}}请求应返回所有产品的列表。向/products发送POST请求应创建新产品。那么,用户如何请求用于创建产品的原始表单?我的初始响应是对同一URI的/products请求,但如上所述,应该返回所有产品的列表 - 而不是用于创建产品的空白表单。

在我研究过的大多数框架中,这个问题是通过将“action”作为URI的一部分来解决的。例如,对GET的{​​{1}}请求会创建新产品,而对POST的{​​{1}}请求会提供创建产品的空白表单。要获取所有产品的列表,请/products/createGET/products/createGET请求,具体取决于相关框架。这种方法解决了上面的模糊性,但它与我读到的传统REST设计相矛盾。

2 个答案:

答案 0 :(得分:2)

恕我直言,最好的选择是让请求方法成为控制器动作的一部分。

假设您正在访问http://who.cares/product/42http://who.cares/product/42/specification。对webserver的此查询将转换为Product控制器。应该通过组合请求方法和命令来创建动作名称:

DELETE "http://who.cares/product/42"

    controller: "Product", 
    action:     "deleteProduct()" 


GET "http://who.cares/product/42/details"

    controller: "Product", 
    action:     "getDetails()"


POST "http://who.cares/product/42/review"

    controller: "Product", 
    action:     "postReview()"


GET "http://who.cares/products/ 

    controller: "Products", 
    action:     "getProducts()"


POST "http://who.cares/products/ 

    controller: "Products", 
    action:     "postProducts()"

答案 1 :(得分:1)

这里的例子就像Rails那样

REST request path    |  action name | Description
---------------------|-------------------|-------------
GET    /profile/new  | new               | Render a form for creating the profile
POST   /profile      | create            | Create a the profile from the received data
GET    /profile      | show              | Render a the profile
GET    /profile/edit | edit              | Render a form for editing the profile
PUT    /profile      | update            | Update the profile based on the received data
DELETE /profile      | destroy           | Destroy the profile

我没有看到任何冲突,想法就是这样 url是人类可读的,您可以引入新的URI来显示相同​​资源的不同表示。 (如个人资料/ 1 /编辑和个人资料/ 1) / profile / new - 空的配置文件的地址(如show方法中的profile / 1,profile / 2 ..等) 但是如果你想要你可以建议profile / 1 / edit是某种不同的 - profile / 1 / resource的嵌套资源,但我喜欢它只是profile / 1 / resource =的其他表示<)>

当您使用多个资源或使用一个,例如

时,使用复数和单数URI也是个好主意
/profile/1.html - gives you 1 resource
/profiles.html - gives you list of profiles