如何在RESTAPI中正确使用HTTP请求方法?

如何在RESTAPI中正确使用HTTP请求方法?,rest,api,express,httprequest,Rest,Api,Express,Httprequest,在我试图理解HTTP请求方法的过程中,特别是在我显然一直错误地使用PUT的情况下,我偶然发现了许多引语,其中指出“PUT不属于RESTAPI”和“在现代API中应该只使用GET和POST” 这让我想知道,为什么不在RESTAPI中使用PUT、PATCH或DELETE等呢?这不是他们在那里的目的吗?因为它们有助于语义和结构等 这可能与例如接收请求的方法主要是将数据定向到其他方法(如数据库方法)的方法有关吗?我在想更新文档时使用PUT,但它从未覆盖文档,即使我只向其发送了部分数据 下面有一个例子,使

在我试图理解HTTP请求方法的过程中,特别是在我显然一直错误地使用PUT的情况下,我偶然发现了许多引语,其中指出“PUT不属于RESTAPI”和“在现代API中应该只使用GET和POST”

这让我想知道,为什么不在RESTAPI中使用PUT、PATCH或DELETE等呢?这不是他们在那里的目的吗?因为它们有助于语义和结构等

这可能与例如接收请求的方法主要是将数据定向到其他方法(如数据库方法)的方法有关吗?我在想更新文档时使用PUT,但它从未覆盖文档,即使我只向其发送了部分数据

下面有一个例子,使用Express和MongoDB(在Express中显示put方法)

基本上,我的问题是:关于上述语句,您如何在REST API中正确使用这些方法,以及何时使用它们

编辑:两个参考上的示例:

-见关于问题的第三条评论

我偶然发现了很多这样的引语:“PUT不属于restapi”和“应该只在现代api中使用GET和POST”

我不会在这些报价中放太多的股票——它们意味着对REST、HTTP以及所有东西应该如何组合在一起缺乏理解

我建议从,谁有很好的理解开始

HTTP是一种应用程序协议,其应用程序域是通过网络传输文档

PUT、PATCH和DELETE都是描述文档更改的完美方法。我
从您那里获取一个文档,我使用我最喜欢的HTTP感知编辑器/库对文档进行更改,我向您发送一个请求,描述我对文档所做的更改,您可以决定自己该怎么做

这让我想知道,为什么不在RESTAPI中使用PUT、PATCH或DELETE等呢?这不是他们在那里的目的吗?因为它们有助于语义和结构等

您可能不这样做的一个原因是:您选择的媒体类型是HTML——HTML对链接(GET)和表单(GET/POST)具有本机支持,但在流中涉及其他方法的方式上没有很多直接支持。您可以为支持它的客户机按需使用代码

这可能与例如接收请求的方法主要是将数据定向到其他方法(如数据库方法)的方法有关吗?我在想更新文档时使用PUT,但它从未覆盖文档,即使我只向其发送了部分数据

了解HTTP方法的一个重要方面是,它们描述的是语义,而不是实现。这是:

HTTP并不试图要求GET的结果是安全的。它所做的是要求操作的语义是安全的,因此,如果发生任何导致财产损失的情况,则这是实现的错误,而不是接口或该接口的用户的错误

在的特定情况下,有一个额外的提示来说明语义的含义

对给定表示的成功PUT将表明,对同一目标资源的后续GET将导致在200(OK)响应中发送等效表示。然而,不能保证这种状态变化是可以观察到的

我认为Triynko提出了一个很好的观点:

大多数现代应用程序中标识的URI不是要替换、更新等的资源。它们不是文档。他们正在打电话

如果您正在创建一个以过程为中心的API,而不是以资源为中心的API,那么很有可能PUT/PATCH/DELETE实际上没有提供证明额外复杂性的好处


有一点暗示你是专注于程序的:你关注了多少?接受“统一接口”约束的一部分原因是,您需要通用组件可以提供的功能,而在HTTP中,缓存是一件大事。

您可以发布这些引用的引用吗?@cassiomolin编辑了两个引用的问题,但我周围的人一直在说同样的话。
app.put('/users/:id', (req, res, next) => {
    let id = req.params.id;
    userService.getOneUser({_id: ObjectID(id)}).then((user) => {

        let updatedData = req.body;

        userService.updateUser(user._id, updatedData)
           .then((doc) => res.json(doc))
           .catch((err) => errorHandler(err, res, next));

    }).catch((err) => errorHandler(err, res, next));
})