在寻找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-查看有关问题的第三条评论
答案 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中,缓存非常重要。