请求方法、状态码与重定向
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
方法表达操作意图,状态码表达本次 HTTP(Hypertext Transfer Protocol,超文本传输协议)结果。网络请求成功不等于业务操作成功;方法名也不会自动实现幂等。
1. 方法与状态速查#
| 方法 | 语义 | 安全/幂等 |
|---|---|---|
| GET/HEAD | 读取表示/仅响应头 | 安全且幂等;不要通过 GET 执行扣款等操作 |
| POST | 提交数据进行处理 | 默认不保证幂等 |
| PUT | 创建或替换指定资源状态 | 语义幂等,仍需处理并发覆盖 |
| PATCH | 局部修改 | 不保证幂等,例如“余额加一” |
| DELETE | 删除指定资源 | 语义幂等;重复删除可以返回不同状态码 |
| OPTIONS | 查询通信选项,也用于跨域预检 | 安全且幂等 |
“安全”指客户端不要求改变服务端业务状态,不代表完全没有日志等副作用。幂等指重复请求的预期业务效果相同,不要求响应字节一致。HTTP 语义标准。
| 状态 | 运维解读 |
|---|---|
| 200/201/202/204 | 成功/已创建/已接收但未完成/无响应正文;202 应配任务查询机制 |
| 304 | 缓存验证后复用已有正文;不是普通业务重定向 |
| 400/401/403/404/405 | 请求错误/需有效身份凭证/拒绝授权/不存在或隐藏存在性/方法不允许 |
| 409/412 | 业务冲突/If-Match 等前置条件不满足 |
| 413/415/429 | 请求体太大/媒体类型不支持/限流 |
| 500/502/503/504 | 内部错误/网关上游响应异常/暂不可用/网关等待上游超时 |
502/503/504 可能由不同代理或应用产生,必须看生成它的那一跳。401 通常应携带合适的 WWW-Authenticate 挑战;不能把所有认证故障都改成 200。
2. 重定向区别#
| 状态 | 意图 | POST 跟随后可能怎样 |
|---|---|---|
| 301/302 | 永久/临时移动 | 客户端可能改为 GET |
| 303 | 转到结果页面 | 通常改为 GET,适合提交后查看结果 |
| 307/308 | 临时/永久移动,保留方法 | 保留方法和请求体;目标必须适合接收原操作 |
不要让携带凭证的写接口跨域跳转;永久重定向可能被缓存,回退不只是修改服务端。
3. Hands-on:观察方法改变和错误来源#
先按 HTTP 专题实验环境 启动本地诊断 Nginx。以下只有诊断数据,不调用业务写接口。
for code in 301 302 303 307 308; do
printf '\nredirect=%s\n' "$code"
curl -sS --max-time 5 --max-redirs 3 -L --data 'probe=1' "http://127.0.0.1:18080/r$code"
done
curl -sS -D - -o /dev/null http://127.0.0.1:18080/unavailable
curl -sS -D - -o /dev/null http://127.0.0.1:18080/broken
docker logs "$HTTP_LAB_NAME" --tail 12预期 301/302/303 后输出 GET;307/308 后输出 POST。不要增加 -X POST,它会影响 curl 的自动方法选择,掩盖本次实验要观察的行为。
/unavailable 返回 503 + Retry-After,日志没有上游状态;/broken 连接关闭端口,返回 502,错误日志有 connection refused。两者展示“服务端主动拒绝”与“代理连接失败”的不同证据。
4. 迁移到真实业务验收#
选择测试租户和可回收资源,按接口契约逐一测试未登录、权限不足、不存在、非法方法、冲突;记录响应体错误码和请求 ID。不要假定每个服务都支持 PUT/PATCH。并发更新使用版本号/ETag + If-Match,陈旧版本应拒绝而非静默覆盖。失败时恢复本次路由配置,重测原始路径;本地环境按专题首页清理。