除了语义之外,不同的 HTTP 请求方法之间的实际区别是什么?

What is the actual difference between the different HTTP request methods besides semantics?

我看过很多关于这个的讨论,比如PUT是幂等的而POST不是等。但是,这最终不取决于服务器是如何实现的吗?开发人员始终可以构建后端服务器,使 PUT 请求不是幂等的,并为多个请求创建多个记录。开发人员还可以为 PUT 请求构建端点,使其像 DELETE 请求一样运行并删除数据库中的记录。

所以我的问题是,考虑到我们不考虑任何服务器端代码,HTTP 方法之间是否存在真正的区别?例如,GET 和 POST 的真正区别在于您不能使用 GET 请求发送正文,但可以使用 POST 请求发送正文。另外,据我了解,大多数浏览器通常默认缓存 GET 请求。

HTTP 请求方法是否不仅仅是一种逻辑结构(语义),以便作为开发人员我们可以 "expect" 基于我们发送的 HTTP 请求类型的特定行为?

超文本传输​​协议 (HTTP) 旨在实现客户端和服务器之间的通信。

HTTP 作为客户端和服务器之间的请求-响应协议。

Web 浏览器可能是客户端,而托管网站的计算机上的应用程序可能是服务器。

示例:客户端(浏览器)向服务器提交HTTP请求;然后服务器 returns 对客户端的响应。响应包含有关请求的状态信息,也可能包含请求的内容。

HTTP 方法

得到

POST

放置

删除

补丁

选项

GET 方法

GET用于从指定资源请求数据。

GET 是最常见的 HTTP 方法之一。

请注意,查询字符串(name/value 对)在 GET 请求的 URL 中发送。

POST 方法

POST 用于将数据发送到服务器到 create/update 资源。

用POST发送到服务器的数据存储在HTTP请求的请求体中。

POST 是最常见的 HTTP 方法之一。

PUT 方法

PUT 用于将数据发送到服务器 create/update 资源。

POST和PUT的区别在于PUT请求是幂等的。也就是说,多次调用同一个 PUT 请求将始终产生相同的结果。相反,重复调用 POST 请求会产生多次创建相同资源的副作用。

HEAD 方法

HEAD 与 GET 几乎相同,但没有响应主体。

换句话说,如果 GET /users return 是用户列表,那么 HEAD /users 将发出相同的请求,但不会 return 用户列表。

HEAD 请求可用于在实际发出 GET 请求之前检查 GET 请求的内容 return - 比如在下载大文件或响应正文之前。

删除方法

DELETE 方法删除指定的资源。

OPTIONS 方法

OPTIONS 方法描述了目标资源的通信选项。

来源。 w3schools

你是对的,大多数差异都在语义层面上,如果你的组件决定分配其他语义,这也会起作用。 除非涉及您无法控制的组件(库、代理、负载平衡器等)。

例如,某些组件可能利用 PUT 是幂等的这一事实,因此可以重试,而 POST 则不是。