HTTP的请求方法
2022 http networkHTTP 定义了一组请求方法,包括:GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH。
每个请求方法实现了不同的语义,但也有一些共同的特性,如一个请求方法可以是 safe(安全),idempotent(幂等)或 cacheable(可缓存)。
请求方法
GET
用于请求服务器发送某个资源。Get 只是用来请求数据,而不应该包含数据。
特性 | 是否 |
---|---|
Request has body | ❌ |
Successful response has body | ✅ |
Safe | ✅ |
Idempotent | ✅ |
Cacheable | ✅ |
HEAD
HEAD 与 GET 有类似请求,但是在响应中只返回首部,不返回实体中的主体部分。
特性 | 是否 |
---|---|
Request has body | ❌ |
Successful response has body | ❌ |
Safe | ✅ |
Idempotent | ✅ |
Cacheable | ✅ |
部分应用场景:
- 通过响应中的状态码,判断资源是否存在
- 通过首部信息,判断资源是否修改
POST
用于将实体提交到服务器,通常会导致服务器上的状态变化或副作用。
特性 | 是否 |
---|---|
Request has body | ✅ |
Successful response has body | ✅ |
Safe | ❌ |
Idempotent | ❌ |
Cacheable | 仅在包含新鲜度信息的情况 |
PUT
用请求的有效载荷替换服务器的当前资源。
特性 | 是否 |
---|---|
Request has body | ✅ |
Successful response has body | 可能 |
Safe | ✅ |
Idempotent | ✅ |
Cacheable | ❌ |
DELETE
用于删除指定的资源。
特性 | 是否 |
---|---|
Request has body | 可能 |
Successful response has body | 可能 |
Safe | ❌ |
Idempotent | ✅ |
Cacheable | ❌ |
CONNECT
建立一个到服务器的隧道。
特性 | 是否 |
---|---|
Request has body | ❌ |
Successful response has body | ✅ |
Safe | ❌ |
Idempotent | ❌ |
Cacheable | ❌ |
OPTIONS
要求为一个给定的 URL 或服务器提供允许的通信选项。
特性 | 是否 |
---|---|
Request has body | ❌ |
Successful response has body | ✅ |
Safe | ✅ |
Idempotent | ✅ |
Cacheable | ❌ |
客户端可以在这里指定一个 URL 或者用 *
指代整个服务器。
OPTIONS /index.html HTTP/1.1
OPTIONS * HTTP/1.1
TRACE
TRACE 方法沿着通往目标资源的路径进行消息回环测试,提供了一个有用的调试机制。
特性 | 是否 |
---|---|
Request has body | ❌ |
Successful response has body | ❌ |
Safe | ✅ |
Idempotent | ✅ |
Cacheable | ❌ |
当客户端发起一个请求时,这个请求可能要穿过防火墙、代理、网关或其他一些应用程序。每个中间节点都可能会修改原始的 HTTP 请求。TRACE 允许客户端在最终将请求发送给服务器时,看看它变成什么样子。
PATCH
PATCH 方法对一个资源进行部分修改。
特性 | 是否 |
---|---|
Request has body | ✅ |
Successful response has body | ✅ |
Safe | ❌ |
Idempotent | ❌ |
Cacheable | ❌ |
跟 PUT 相比,PUT 更新整个资源列表,而 PATCH 只是部分更新列表。PUT 更像是替换,而 PATCH 是更新。
Safe
HTTP 定义了一组被称为安全方法的方法。如果一个 HTTP 方法不改变服务器状态,不会对服务器产生任何结果,那么它就是安全的。
常见的安全方法有 GET, HEAD, OPTIONS 或 TRACE。
常见的非安全方法有 PUT, DELETE, POST 或 PATCH。
Idempotent
HTTP 方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。
所有的安全方法都是幂等的,包括 GET, HEAD, OPTIONS 和 TRACE。PUT 和 DELETE 也是幂等的。
而 POST 非幂等的,每次请求都会增加一个资源,而 PATCH 也非幂等的,因为服务器上可能有自动增量的值,而 PATCH 并非每次都更新。
Get 与 Post 异同
作为面试中最频繁遇到的问题,有必要总结一下:
- get 与 post 请求都有返回实体。
- post 有请求实体,get 是通过 URL 参数。
- get 是安全的,幂等的。而 post 是非安全,非幂等的。