在RESTful应用程序中,我们如何“动作”和HTTP动词(区分GET
, POST
, PUT
, DELETE
)?
例如,我的理解是,一个GET
请求到资源/products
应返回的所有产品的列表。 一个POST
请求/products
应该创建一个新的产品。 那么,如何做的用户请求是用来创建产品的原始形式? 我的第一反应会是一个GET
请求相同的URI,但正如上面提到的,应该返回的所有产品的列表-不是一个空白表单创建产品。
在我研究最多的框架,这个问题是通过使URI的“行动”的一部分来解决。 例如,一个POST
请求/products/create
将创建一个新的产品,而GET
请求/products/create
会给空白窗体创建产品。 要获得所有产品清单将是一个GET
请求,要么/products
或/products/get
, /products/read
等,这取决于所讨论的框架。 这种方法解决了毫不含糊,但它与我所了解的传统REST设计相冲突。
恕我直言,最好的选择是让请求方法控制的行动的一部分。
比方说,你正在访问http://who.cares/product/42
或http://who.cares/product/42/specification
。 此查询的Web服务器将转化为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()"
我这里是喜欢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
我看不出有任何冲突,想法是,网址是人类可读的,你可以引入新的URI来显示相同资源的不同表示。 (如资料/ 1 /编辑和配置文件/ 1)/型材/新 - 个人资料的地址是空的(如资料/ 1,资料/ 2 ..等,在展会法)但是,如果你愿意,你可以建议资料/ 1 /编辑是某种不同 - 资料/ 1 /资源的嵌套的资源,但我喜欢的东西,它的配置文件/ 1 /资源只是其他代表=)
也就是最好先用,当你有很多资源或一个工作单数和复数URI,例如
/profile/1.html - gives you 1 resource
/profiles.html - gives you list of profiles
文章来源: In a RESTful application, how do we differentiate between an “action” and an HTTP verb (GET, POST, PUT, DELETE)?