In a RESTful application, how do we differentiate

2019-06-26 20:10发布

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

例如,我的理解是,一个GET请求到资源/products应返回的所有产品的列表。 一个POST请求/products应该创建一个新的产品。 那么,如何做的用户请求是用来创建产品的原始形式? 我的第一反应会是一个GET请求相同的URI,但正如上面提到的,应该返回的所有产品的列表-不是一个空白表单创建产品。

在我研究最多的框架,这个问题是通过使URI的“行动”的一部分来解决。 例如,一个POST请求/products/create将创建一个新的产品,而GET请求/products/create会给空白窗体创建产品。 要获得所有产品清单将是一个GET请求,要么/products/products/get/products/read等,这取决于所讨论的框架。 这种方法解决了毫不含糊,但它与我所了解的传统REST设计相冲突。

Answer 1:

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

比方说,你正在访问http://who.cares/product/42http://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()"


Answer 2:

我这里是喜欢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)?