HTTP 请求方法详解:GET、POST、PUT、DELETE 等

在 HTTP 协议中,请求方法(也称为 HTTP 动词)定义了客户端希望对指定资源执行的操作类型。这些方法是 HTTP 报文的核心组成部分,决定了请求的目的和行为。

主要 HTTP 请求方法

1. GET

  • 用途获取资源

  • 特点

    • 只读操作,不应修改服务器状态
    • 数据通过 URL 查询字符串传递(?key=value
    • 可被缓存、收藏、保留在浏览器历史中
    • 有长度限制(约 2048 字符)
  • 示例

    GET /products?id=123 HTTP/1.1
    Host: example.com
    
  • 响应状态码

    • 200 OK(成功)
    • 404 Not Found(资源不存在)
    • 304 Not Modified(资源未改变)

2. POST

  • 用途创建新资源或提交数据

  • 特点

    • 非幂等操作(多次调用产生不同结果)
    • 数据通过请求体传输(支持多种格式)
    • 无长度限制
    • 不可缓存
  • 示例

    POST /users HTTP/1.1
    Host: example.com
    Content-Type: application/json{"name": "John", "email": "john@example.com"}
    
  • 响应状态码

    • 201 Created(资源创建成功)
    • 400 Bad Request(请求错误)
    • 409 Conflict(资源冲突)

3. PUT

  • 用途更新整个资源(全量替换)

  • 特点

    • 幂等操作(多次调用效果相同)
    • 需要提供资源的完整表示
    • 如果资源不存在,可能创建新资源
  • 示例

    PUT /users/123 HTTP/1.1
    Host: example.com
    Content-Type: application/json{"name": "John Updated", "email": "john.new@example.com"}
    
  • 响应状态码

    • 200 OK(更新成功)
    • 204 No Content(更新成功无返回内容)
    • 404 Not Found(资源不存在)

4. DELETE

  • 用途删除指定资源

  • 特点

    • 幂等操作
    • 通常不需要请求体
  • 示例

    DELETE /users/123 HTTP/1.1
    Host: example.com
    
  • 响应状态码

    • 200 OK(删除成功)
    • 202 Accepted(已接受删除请求)
    • 204 No Content(删除成功无返回内容)
    • 404 Not Found(资源不存在)

5. PATCH

  • 用途部分更新资源

  • 特点

    • 非幂等(取决于实现)
    • 只需提供需要修改的字段
  • 示例

    PATCH /users/123 HTTP/1.1
    Host: example.com
    Content-Type: application/json{"email": "john.updated@example.com"}
    
  • 响应状态码

    • 200 OK(更新成功)
    • 204 No Content(更新成功无返回内容)

其他重要方法

6. HEAD

  • 用途:获取资源的元数据(不返回响应体)

  • 特点

    • 与 GET 相同但不返回内容
    • 用于检查资源是否存在或验证缓存
  • 示例

    HEAD /document.pdf HTTP/1.1
    Host: example.com
    

7. OPTIONS

  • 用途:获取资源支持的通信选项

  • 主要应用

    • CORS 预检请求(跨域资源共享)
  • 示例响应

    HTTP/1.1 204 No Content
    Allow: GET, POST, OPTIONS
    Access-Control-Allow-Methods: GET, POST, PUT
    

8. TRACE

  • 用途:回显服务器收到的请求(用于诊断)
  • 注意:存在安全风险(XST攻击),通常禁用

9. CONNECT

  • 用途:建立到目标资源的隧道(用于 HTTPS 代理)

  • 格式

    CONNECT proxy.example.com:443 HTTP/1.1
    Host: proxy.example.com
    

方法特性对比表

方法安全幂等缓存请求体典型状态码RESTful 对应操作
GET不可200, 304获取资源
POST不可201, 400创建资源
PUT不可200, 204全量更新资源
DELETE不可可选200, 204, 404删除资源
PATCH可能不可200, 204部分更新资源
HEAD不可200获取元数据
OPTIONS不可可选204获取选项
TRACE不可不可200诊断
CONNECT不可200建立隧道

关键概念解释

  • 安全方法:不会修改服务器状态(GET、HEAD、OPTIONS)
  • 幂等方法:多次执行效果相同(GET、PUT、DELETE、HEAD)

RESTful API 设计规范

在 RESTful 架构中,HTTP 方法与资源操作有明确对应关系:

资源: /users+----------+---------------------+-----------------+
| 方法     | URL                 | 操作            |
+----------+---------------------+-----------------+
| GET      | /users              | 获取用户列表    |
| POST     | /users              | 创建新用户      |
| GET      | /users/{id}         | 获取单个用户    |
| PUT      | /users/{id}         | 更新整个用户    |
| PATCH    | /users/{id}         | 部分更新用户    |
| DELETE   | /users/{id}         | 删除用户        |
+----------+---------------------+-----------------+

实际应用场景

1. 创建订单(POST)

POST /orders HTTP/1.1
Content-Type: application/json{"product_id": 456,"quantity": 2,"payment_method": "credit_card"
}

2. 更新用户邮箱(PATCH)

PATCH /users/789 HTTP/1.1
Content-Type: application/json{"email": "new.email@example.com"
}

3. 分页获取产品(GET)

GET /products?page=2&per_page=20 HTTP/1.1

4. 删除评论(DELETE)

DELETE /comments/12345 HTTP/1.1
Authorization: Bearer xyz123

安全注意事项

  1. 敏感操作限制

    • 避免使用 GET 执行写操作(防止 CSRF 攻击)
    • 关键操作(如删除)应要求二次确认
  2. 幂等性设计

    • 重要操作(如支付)应设计为幂等
    • 使用唯一 ID 防止重复提交
  3. 方法覆盖攻击防护

    • 某些框架允许通过 _method 参数覆盖方法(如 POST _method=DELETE
    • 确保覆盖方法有与原方法相同的访问控制

浏览器支持情况

方法HTML 表单支持Fetch/XHR 支持
GET
POST
PUT
DELETE
PATCH
HEAD
OPTIONS

注意:HTML 表单只原生支持 GET 和 POST 方法。其他方法需要通过 JavaScript(Fetch/XHR)实现。

实践

  1. 方法选择原则

    创建
    更新
    删除
    操作类型
    查询数据?
    GET
    修改数据?
    POST
    全量更新?
    PUT
    PATCH
    DELETE
  2. API 版本控制

    GET /v2/products/123 HTTP/1.1
    
  3. 状态码规范

    • 成功:2xx
    • 重定向:3xx
    • 客户端错误:4xx
    • 服务器错误:5xx
  4. HATEOAS 应用

    {"id": 123,"name": "Product","_links": {"self": {"href": "/products/123", "method": "GET"},"update": {"href": "/products/123", "method": "PUT"}}
    }
    

理解 HTTP 请求方法的区别和适用场景是设计高质量 API 的基础。正确使用这些方法可以创建出符合 RESTful 原则、易于理解且安全的 Web 服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914512.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 代码热度统计(概述)

1. 前言 代码热度统计,在测试中一般也叫做代码覆盖率。一般得到代码覆盖率后就能了解整体样本在线上的代码使用情况,为无用代码下线提供依据。 做了一下调研,在Android中一般比较常用的是:JaCoCO覆盖率统计工具,它采…

RAG优化

RAG搭建本地AI知识库,在使用过程中遇到的三大痛点,以及相应的进阶方案。1. RAG知识库的三大痛点-- 内容理解不足:AI难以全面理解导入资料的内容,比如在向量编码时候,生硬的截断等导致分析结果不理想。eg: 知识库分割器…

Ubuntu 24.04 启用 root 图形登录

关键词:Ubuntu 24.04、root 登录、GDM、SSH、nano、配置文件一、前言 Ubuntu 默认禁用 root 账户 的图形与 SSH 登录,这是为了安全。但在某些场景(如测试、救援、自动化脚本)你可能需要 直接用 root 登录 GNOME 桌面。本文以 Ubun…

Jekyll + Chirpy + GitHub Pages 搭建博客

Chirpy 是适用于技术写作的简约、响应迅速且功能丰富的 Jekyll 主题,文档地址:https://chirpy.cotes.page/ ,Github 地址:jekyll-theme-chirpy 。 1.开始 打开 chirpy-starter 仓库,点击按钮 Use this template -->…

学习 Flutter (一)

学习 Flutter (一) 1. 引言 什么是 Flutter? Flutter 是 Google 开发的一套开源 UI 框架,主要用于构建高性能、高保真、跨平台的应用程序。使用一套 Dart 编写的代码,开发者可以同时构建适用于: Android iOS Web Windows、mac…

Spring Boot 实现图片防盗链:Referer 校验与 Token 签名校验完整指南

Spring Boot 实现图片防盗链教程(Referer 校验 Token 签名校验)本文将详细讲解两种防盗链实现方案,并提供完整代码示例。方案一:Referer 校验通过检查 HTTP 请求头中的 Referer 字段判断来源是否合法。实现步骤创建 Referer 拦截…

从 JSON 到 Python 对象:一次通透的序列化与反序列化之旅

目录 一、为什么要谈 JSON 二、最快速上手:两把钥匙 dumps 与 loads 三、深入 dumps:参数是魔法棒 四、深入 loads:把风险挡在门外 五、文件级序列化:dump 与 load 六、处理中文与编码陷阱 七、异常场景与调试技巧 八、实…

Leetcode 3315. 构造最小位运算数组 II

1.题目基本信息 1.1.题目描述 给你一个长度为 n 的质数数组 nums 。你的任务是返回一个长度为 n 的数组 ans ,对于每个下标 i ,以下 条件 均成立: ans[i] OR (ans[i] 1) nums[i] 除此以外,你需要 最小化 结果数组里每一个 a…

黑搜小知识 | DNS域名解析过程是什么样的?

什么是DNS?DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工作。举例来说,如果你要访问域…

MyBatis 使用教程及插件开发

作者:小凯 沉淀、分享、成长,让自己和他人都能有所收获! 本文的宗旨在于通过简单干净实践的方式教会读者,使用 SpringBoot 配置 MyBatis 并完成对插入、批量插入、修改、查询以及注解事务和编程事务的使用,通过扩展插件…

Maui劝退:用windows直接真机调试iOS,无须和Mac配对

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

【极客日常】后端任务动态注入执行策略的一种技术实现

近期做项目时遇到一个场景,是需要在后端任务执行时动态注入策略。具体而言,笔者负责的后端服务,可以理解是会在线上服务发布时,对服务风险做实时扫描,那么这个扫描就需要根据当前线上服务发布上下文,匹配对…

8. JVM类装载的执行过程

1. JVM介绍和运行流程-CSDN博客 2. 什么是程序计数器-CSDN博客 3. java 堆和 JVM 内存结构-CSDN博客 4. 虚拟机栈-CSDN博客 5. JVM 的方法区-CSDN博客 6. JVM直接内存-CSDN博客 7. JVM类加载器与双亲委派模型-CSDN博客 8. JVM类装载的执行过程-CSDN博客 9. JVM垃圾回收…

Linux操作系统之信号:信号的产生

前言:上篇文章我们大致讲解了信号的有关概念,为大家引入了信号的知识点。但光知道那些是远远不够的。本篇文章,我将会为大家自己的讲解一下信号的产生的五种方式,希望对大家有所帮助。一、键盘(硬件)产生信…

pdf拆分

文章目录 背景目标实现下载 背景 好不容易下载的1000页行业报告,领导非要按章节拆分成20份!学术论文合集需要按作者拆分投稿,手动分页到怀疑人生…客户发来加密合同,要求每5页生成独立文档,格式还不能乱! …

vue3使用mermaid生成图表,并可编辑

效果图实际代码<template><div class"mermaid-container" style"z-index: 99999" ref"wrapperRef"><!-- 控制栏 --><div class"control-bar"><div class"control-bar-flex control-bar-tab-wrap"…

tcp/quic 的滑动窗口

一、滑动窗口 rwnd&#xff1a; 接收端窗口&#xff0c;接收方在每次发送ACK确认报文时&#xff0c;会包含一个 rwnd (Receive Window Size) 字段&#xff0c;指明自己当前剩余的接收缓冲区大小&#xff08;即可用窗口&#xff09;&#xff0c;这里是否是socket的接收缓冲区&am…

JVM监控及诊断工具-命令行篇

18.1. 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题&#xff0c;在用户体验至上的今天&#xff0c;解决好应用的性能问题能带来非常大的收益。 Java 作为最流行的编程语言之一&#xff0c;其应用性能诊断一直受到业界广泛关注。可能造成 Java 应用出现性能…

Jenkins 版本升级与插件问题深度复盘:从 2.443 到 2.504.3 及功能恢复全解析

前言&#xff1a;问题溯源与升级必要性 在 Jenkins 持续集成体系中&#xff0c;插件生态是其强大功能的核心驱动力。然而&#xff0c;某次例行维护中&#xff0c;团队对 Jenkins 2.443 环境的插件进行批量升级后&#xff0c;意外触发连锁反应 &#xff1a; SSH Server 插件功能…

Ribbon实战

一、前置知识 1.1 负载均衡定义 负载均衡指的是将网络请求通过不同的算法分配到不同的服务器上的技术&#xff0c;从而提升系统的性能。 1.2 负载均衡工具 负载均衡工具可以分分为客户端负载均衡工具和服务端负载均衡工具&#xff0c;它们的区别如下。 表1-1 负载均衡工具…