HTTP请求方法的幂等性
| HTTP方法 | 幂等性 | 说明 |
|---|---|---|
| GET | 是 | 获取资源数据,不会对服务器上的资源产生副作用。 |
| PUT | 是 | 更新现有资源或创建资源,重复执行不会产生额外副作用。 |
| DELETE | 是 | 删除资源,重复执行不会产生额外副作用。 |
| HEAD | 是 | 获取资源的头部信息,不返回具体的资源内容。 |
| OPTIONS | 是 | 获取服务器支持的HTTP请求方法,不对服务器上的资源进行修改。 |
| TRACE | 是 | 执行一个回环诊断,并回显收到的请求内容,不对服务器上的资源进行修改,因此是安全的。但需要注意,TRACE请求可能泄露敏感信息,所以在生产环境中通常会被禁用或限制使用。 |
| POST | 否 | 创建新资源或提交数据,重复执行会产生不同结果或创建多个资源。 |
| PATCH | 否 | 部分更新资源,重复执行可能会产生累积效果。 |
每个请求方法的例子
GET 方法
GET 请求用于从服务器获取资源数据,不会对服务器上的资源产生副作用。
示例:获取用户信息
GET /users/1 HTTP/1.1
Host: example.com
Accept: application/json
{
"id": 1,
"name": "John Doe",
"email": "john.doe@example.com"
}
PUT 方法
PUT 请求用于创建或更新资源,多次执行相同的请求会产生相同的效果(幂等)。
示例:更新用户信息
PUT /users/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
{
"id": 1,
"name": "Jane Doe",
"email": "jane.doe@example.com"
}
DELETE 方法
DELETE 请求用于删除资源,多次执行相同的请求会产生相同的效果(幂等)。
示例:删除用户
DELETE /users/1 HTTP/1.1
Host: example.com
响应:
HTTP/1.1 204 No Content
HEAD 方法
HEAD 请求用于获取资源的头部信息,不返回具体的资源内容。
示例:获取用户信息的头部信息
HEAD /users/1 HTTP/1.1
Host: example.com
响应:
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 123
OPTIONS 方法
OPTIONS 请求用于获取服务器支持的HTTP请求方法。
示例:获取服务器支持的HTTP方法
OPTIONS /users HTTP/1.1
Host: example.com
响应:
HTTP/1.1 200 OK
Allow: GET, POST, PUT, DELETE, OPTIONS
TRACE 方法
TRACE 请求用于执行一个回环诊断,并回显收到的请求内容,不对服务器上的资源进行修改,因此是安全的。但需要注意,TRACE请求可能泄露敏感信息,所以在生产环境中通常会被禁用或限制使用。
示例:回显请求
TRACE /users/1 HTTP/1.1
Host: example.com
响应:
HTTP/1.1 200 OK
Content-Type: message/http
TRACE /users/1 HTTP/1.1
Host: example.com
POST 方法
POST 请求用于在服务器上创建新资源或提交数据,多次执行相同的请求会产生不同结果或创建多个资源(非幂等)。
示例:创建新用户
POST /users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "john.doe@example.com"
}
响应:
{
"id": 2,
"name": "John Doe",
"email": "john.doe@example.com"
}
PATCH 方法
PATCH 请求用于对资源进行部分更新,多次执行相同的请求可能会产生累积效果(非幂等)。
示例:部分更新用户信息
PATCH /users/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"email": "new.email@example.com"
}
{
"id": 1,
"name": "John Doe",
"email": "new.email@example.com"
}