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

时间:2019-03-07 12:22:35

标签: rest api express httprequest

在寻找HTTP请求方法的过程中,尤其是PUT,因为我似乎一直在错误地使用它,因此我偶然发现了很多引述“ PUT不属于REST API” “一个人只能在现代API中使用GET和POST”。

这让我感到奇怪,为什么不在REST API中使用PUT或PATCH或DELETE等?这不是他们的目的吗?是否可以使用,因为它们有助于语义和结构等?

可能与例如接收请求的方法主要是将数据定向到其他方法(如数据库方法)的方法,然后再处理这些方法?想要更新文档时,我使用了PUT,但是即使我只向其中发送了部分数据,也从未覆盖过它。

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

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));
})

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

编辑:关于两个参考的示例:

PUT doesn't belong in REST API

Only use GET and POST-查看有关问题的第三条评论

1 个答案:

答案 0 :(得分:1)

  

我偶然发现了很多引述,其中包括“ PUT不属于REST API”和“一个人仅应在现代API中使用GET和POST”。

我不会在这些引号中放很多东西-它们表示缺乏对REST,HTTP以及所有内容应该如何组合的理解。

我建议从Jim Webber开始,他确实了解得很好。

  

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

PUT,PATCH,DELETE都是描述文档更改的完美方法。我GET给您发送了一个文档,我使用了我最喜欢的HTTP感知编辑器/库来对该文档进行更改,我向您发送了一个请求,描述了对文档的更改,您可以弄清楚该怎么做

  

这让我感到奇怪,为什么不在REST API中使用PUT或PATCH或DELETE等?这不是他们的目的吗?是否可以使用,因为它们有助于语义和结构等?

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

  

可能与例如接收请求的方法主要是将数据定向到其他方法(如数据库方法)的方法,然后再处理这些方法?想要更新文档时,我使用了PUT,但是即使我只向其中发送了部分数据,也从未覆盖过它。

了解HTTP方法的重要一件事是它们描述语义,而不是实现。这是Fielding writing in 2002

  

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

PUT的特定情况下,语义的含义有一个额外的提示

  

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

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

  

大多数现代应用程序中标识的URI并非要替换,更新等的资源。它们不是文档。他们被称为程序。

如果您要创建针对 procedure 的API,而不是针对 resource 的API,则很有可能PUT / PATCH / DELETE实际上并没有提供证明额外复杂性的好处。

一个暗示您关注过程的提示:您对cache invalidation的关注度是多少?接受“统一接口”约束的部分原因是,您希望通用组件可以提供这些功能,而在HTTP中,缓存非常重要。