什么是 HTTP 方法(动词)?

What are HTTP methods (verbs) for?

我已经阅读了一些关于 HTTP 方法的资源,但我仍然不清楚最简单的事情:它们有什么用?

我看到的每个来源都指出了何时应该使用特定的方法,但它在实践中有什么变化?比方说,GET 和 POST?

之间请求的处理方式有什么不同吗

或者也许这些方法允许我们在一个 URL 上处理多个行为?

最后,浏览器呢?表单只能发出 GET 和 POST 请求,并且它们以不同的方式处理它们。 POST 表单发送数据 "in the background",而 GET 在 URL 中传递数据。它与协议有什么关系还是只是浏览器的约定?

提前感谢您为我澄清。 :)

从根本上说,是的,有方法允许每个 "entity" 有不同的 "interactions"。 HTTP 的设计让您可以将每个 URL 视为一个实体。

  • /users代表所有用户
  • /users/dave代表一个特定用户
  • POST /users 让您创建一个新用户
  • PUT /users/dave 允许您修改特定用户
  • GET /users 获取用户列表
  • GET /users?name=dave 允许您查询名为 "dave"
  • 的用户列表

等等...

这就是 HTTP 的设计用途,每个动词都有特定的隐含含义。您可以真正以任何方式使用这些动词,但 GET 表示 "passive" 信息检索,而 POSTPUTDELETE 表示破坏性更改。

浏览器和其他客户端确实以不同方式处理这些问题。预计任何东西 GET 都可以随时请求任意次数,可以缓存,可以 pre-fetched,大部分可以乱序查询。更多的破坏性操作应该只在请求时执行一次,而不是缓存,pre-fetched 或其他任何东西。如果您是 "reloading" 通过 POST.

请求的页面,浏览器将明确要求确认

POST form sends data "in the background", while GET passes them in the URL. Does it have anything to do with the protocol or is it just browsers' convention?

"In the background"是错误的思路。区别在于URL请求bodyGET 请求 not/must 的请求 body 中不应包含任何内容。同样,它只是被动信息检索,并且必须仅由 HTTP headers 组成。一个 POST 请求 可以 有一个请求 body。一个请求可以在其 URL 和 body 中同时包含 "data" 和 。同样,假设 GET URL 可以共享和传递,因为它只是链接到信息。 POST 另一方面,请求需要经过深思熟虑,因此其信息不应该也不需要出现在 URL.