HTTP 协议里15种请求方法及示例
一、HTTP请求方法概述
HTTP(HyperText Transfer Protocol)是互联网上应用最广泛的协议之一,定义了客户端与服务器之间的通信规则。根据HTTP标准,不同的请求方法(Request Methods)用于执行不同的操作。
HTTP请求方法(HTTP Request Methods)并不属于
某一种特定的编程语言(如 JavaScript、Python 或 Java),而是 HTTP协议(Hypertext Transfer Protocol)的一部分,属于网络通信标准,适用于所有基于HTTP的客户端-服务器交互。
1. HTTP请求方法属于什么?
- 协议层:HTTP(超文本传输协议),是Web通信的基础标准,由 IETF(互联网工程任务组)定义。
- 与编程语言的关系:
- 任何支持HTTP请求的编程语言(如 JavaScript、Python、Java、PHP、Go 等)都可以使用这些方法。
- 前端(如JavaScript)通过
fetch
、XMLHttpRequest
、axios
发送HTTP请求。 - 后端(如Node.js、Python Flask、Java Spring)接收并处理这些请求。
2. 不同语言中如何使用HTTP方法?
(1)JavaScript(前端)
// GET 请求
fetch("https://api.example.com/data", { method: "GET" });// POST 请求
fetch("https://api.example.com/users", {method: "POST",body: JSON.stringify({ name: "John" }),
});// PUT 请求
fetch("https://api.example.com/data/123", {method: "PUT",body: JSON.stringify({ title: "Updated Data" }),
});
(2)Python(后端,如 Flask)
from flask import Flask, requestapp = Flask(__name__)@app.route("/data", methods=["GET"])
def get_data():return "This is a GET request"@app.route("/data", methods=["POST"])
def post_data():data = request.jsonreturn f"Received POST data: {data}"
(3)Java(后端,如 Spring Boot)
@RestController
public class ApiController {@GetMapping("/data") // GETpublic String getData() {return "GET request";}@PostMapping("/data") // POSTpublic String postData(@RequestBody String data) {return "Received: " + data;}
}
(4)命令行(如 curl
)
# GET
curl -X GET https://api.example.com/data# POST
curl -X POST -H "Content-Type: application/json" -d '{"name":"John"}' https://api.example.com/users
3. 总结
分类 | 说明 |
---|---|
协议层 | HTTP请求方法属于 HTTP协议,与编程语言无关。 |
前端使用 | JavaScript(fetch /axios )、浏览器(地址栏默认GET ,表单默认POST )。 |
后端使用 | 任何后端语言(Node.js、Python、Java、PHP等)均可处理这些方法。 |
工具使用 | curl 、Postman、浏览器开发者工具等均可发送不同HTTP方法的请求。 |
结论:
HTTP请求方法不是JavaScript或其他语言的特性,而是 Web通信的通用标准,所有支持HTTP的编程语言和工具都可以使用它们。
- HTTP/1.0 定义了3种基本方法:
GET
、POST
、HEAD
。 - HTTP/1.1 新增了5种方法:
OPTIONS
、PUT
、DELETE
、TRACE
、CONNECT
。 - 其他方法(如
PATCH
、MOVE
、COPY
等)由扩展标准(如WebDAV)引入。
二、HTTP请求方法对照表
以下是15种HTTP请求方法的详细说明及示例:
序号 | 方法 | 描述 | 示例 | 备注 |
---|---|---|---|---|
1 | GET | 请求指定资源,返回实体主体(通常用于读取数据)。 | GET /products/123 HTTP/1.1 | 参数在URL中传递,可被缓存,不应有副作用(如修改数据)。 |
2 | HEAD | 与GET相同,但仅返回响应头(无响应体),用于检查资源状态。 | HEAD /products/123 HTTP/1.1 | 常用于预检请求(如检查文件大小或最后修改时间)。 |
3 | POST | 向服务器提交数据(如表单、文件),可能导致资源创建或修改。 | POST /users HTTP/1.1 {"name": "John"} | 数据在请求体中,无长度限制,适用于非幂等操作(如创建订单)。 |
4 | PUT | 替换目标资源的全部内容(全量更新)。 | PUT /products/123 HTTP/1.1 {"name": "New Name"} | 幂等方法(多次调用结果相同),若资源不存在可能创建新资源。 |
5 | DELETE | 请求删除指定资源。 | DELETE /products/123 HTTP/1.1 | 服务器可能返回204 No Content 或404 Not Found 。 |
6 | CONNECT | 建立与目标资源的隧道(如HTTPS代理)。 | CONNECT example.com:443 HTTP/1.1 | 主要用于SSL代理,客户端与服务器直接通信。 |
7 | OPTIONS | 获取服务器支持的HTTP方法或跨域预检(CORS)。 | OPTIONS /products/123 HTTP/1.1 | 响应头包含Allow: GET, POST, PUT 等支持的方法。 |
8 | TRACE | 回显客户端请求,用于测试或诊断(可能暴露敏感信息)。 | TRACE / HTTP/1.1 | 默认禁用(防止XST攻击),需服务器显式启用。 |
9 | PATCH | 对资源进行部分修改(与PUT的全量更新区别)。 | PATCH /products/123 HTTP/1.1 {"price": 199} | 非幂等方法(依赖补丁内容),适用于增量更新。 |
10 | MOVE | 请求服务器将资源移动到新URI(类似文件剪切)。 | MOVE /old-path HTTP/1.1 Destination: /new-path | WebDAV扩展方法,需服务器支持。 |
11 | COPY | 请求服务器复制资源到新URI(类似文件复制)。 | COPY /source-file HTTP/1.1 Destination: /target-file | WebDAV扩展方法,需服务器支持。 |
12 | LINK | 建立资源间的关联(如超链接)。 | LINK /article/123 HTTP/1.1 Link: </tags/tech>; rel="tag" | 极少使用,WebDAV扩展的一部分。 |
13 | UNLINK | 断开资源间的关联。 | UNLINK /article/123 HTTP/1.1 Link: </tags/tech>; rel="tag" | 极少使用,WebDAV扩展的一部分。 |
14 | WRAPPED | 发送封装请求(如加密或压缩的请求体)。 | WRAPPED /api HTTP/1.1 Content-Type: application/wrapped-json | 非标准方法,依赖服务器实现。 |
15 | Extension-method | 自定义方法(需服务器支持)。 | PURGE /cache HTTP/1.1 | 如CDN专用方法PURGE 用于清除缓存。 |
三、HTTP方法详细解释与示例
1. GET
描述:请求指定的资源,通常只用于数据读取,不应有副作用(如修改数据)。
示例:
GET /products/123 HTTP/1.1
Host: example.com
备注:参数通过URL传递(如/products?id=123
),有长度限制,且会被浏览器缓存。
2. HEAD
描述:与GET相同,但服务器只返回响应头(无响应体),用于检查资源是否存在或获取元数据。
示例:
HEAD /products/123 HTTP/1.1
Host: example.com
备注:常用于预检请求,节省带宽(如检查文件大小或最后修改时间)。
3. POST
描述:向服务器提交数据(如表单、文件),可能导致资源创建或修改。
示例:
POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
{"name":"John", "email":"john@example.com"}
备注:数据在请求体中,安全性高于GET(参数不可见),无长度限制。
4. PUT
描述:替换目标资源的全部内容(全量更新),需提供完整资源数据。
示例:
PUT /products/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{"id":123, "name":"New Product", "price":99}
备注:幂等方法(多次调用结果相同),若资源不存在可能创建新资源。
5. DELETE
描述:请求删除指定资源。
示例:
DELETE /products/123 HTTP/1.1
Host: example.com
备注:实际删除行为由服务器决定(可能返回状态码204 No Content
或404 Not Found
)。
6. CONNECT
描述:建立与目标资源的隧道(如HTTPS代理)。
示例:
CONNECT example.com:443 HTTP/1.1
Host: example.com
备注:主要用于SSL隧道,客户端与服务器之间直接通信。
7. OPTIONS
描述:获取服务器支持的HTTP方法或跨域预检(CORS)。
示例:
OPTIONS /products/123 HTTP/1.1
Host: example.com
Origin: https://foo.example
备注:响应头包含Allow: GET, POST, OPTIONS
等支持的方法。
8. TRACE
描述:回显客户端请求,用于诊断(可能暴露敏感信息)。
示例:
TRACE / HTTP/1.1
Host: example.com
备注:默认禁用(防止XST攻击),需服务器显式启用。
9. PATCH
描述:对资源部分修改(与PUT的全量更新区别)。
示例:
PATCH /products/123 HTTP/1.1
Host: example.com
Content-Type: application/json
{"price":199}
备注:非幂等方法(依赖补丁内容),需用Content-Type: application/json-patch+json
等格式。
10. MOVE
描述:移动资源到新URI(类似文件系统剪切)。
示例:
MOVE /old-path HTTP/1.1
Host: example.com
Destination: /new-path
备注:需配合Destination
头,实际由WebDAV扩展实现。
11. COPY
描述:复制资源到新URI(类似文件系统复制)。
示例:
COPY /source-file HTTP/1.1
Host: example.com
Destination: /target-file
备注:WebDAV扩展方法,需服务器支持。
12. LINK / 13. UNLINK
描述:建立或断开资源间的关联(如超链接)。
示例:
LINK /article/123 HTTP/1.1
Host: example.com
Link: </tags/tech>; rel="tag"
备注:极少使用,WebDAV扩展的一部分。
14. WRAPPED
描述:发送封装请求(如加密或压缩的请求体)。
示例:
WRAPPED /api HTTP/1.1
Host: example.com
Content-Type: application/wrapped-json
[Encrypted Data]
备注:非标准方法,依赖服务器实现。
15. Extension-method
描述:自定义方法(需服务器明确支持)。
示例:
PURGE /cache HTTP/1.1
Host: example.com
备注:如PURGE
(清除缓存)是某些CDN的私有方法。
四、HTTP方法分类与最佳实践
1. 按安全性分类
- 安全方法(Safe Methods):
GET
、HEAD
、OPTIONS
(不应修改服务器数据)。 - 非安全方法:
POST
、PUT
、DELETE
等(可能修改数据)。
2. 按幂等性分类
- 幂等方法(Idempotent Methods):
GET
、PUT
、DELETE
、HEAD
(多次调用结果相同)。 - 非幂等方法:
POST
、PATCH
(多次调用可能产生不同结果)。
3. 最佳实践
- RESTful API设计:
- 使用
GET
读取数据,POST
创建资源,PUT
全量更新,PATCH
部分更新,DELETE
删除资源。 - 避免滥用
GET
传递敏感数据(参数在URL中可见)。
- 使用
- 缓存优化:
GET
和HEAD
可被缓存,POST
通常不缓存。
- 跨域请求(CORS):
- 复杂请求(如
POST
带自定义头)会先发送OPTIONS
预检请求。
- 复杂请求(如
五、总结
HTTP请求方法是客户端与服务器交互的核心,不同的方法对应不同的操作语义。合理选择方法能提升API的规范性、安全性和可维护性。
典型场景 | 推荐方法 | 示例 |
---|---|---|
读取数据 | GET | GET /api/products |
创建资源 | POST | POST /api/users |
全量更新资源 | PUT | PUT /api/products/123 |
部分更新资源 | PATCH | PATCH /api/products/123 |
删除资源 | DELETE | DELETE /api/products/123 |
检查服务器支持方法 | OPTIONS | OPTIONS /api/products |
掌握这些方法的使用场景,能帮助开发者构建更高效、安全的Web应用。