HTTP 请求方法:GET 与 POST 核心区别,以及 PUT/DELETE/PATCH 的实际应用

说到 HTTP 请求方法,很多新手第一反应就是「GET 用来拿数据,POST 用来发数据」。这话没错,但太笼统了。我在爬虫和数据采集项目里摸爬滚打这么多年,发现真正理解这几个方法的区别,能帮你少踩很多坑。

今天咱们就掰开揉碎,把 GET、POST、PUT、DELETE、PATCH 这几个最常用的方法讲透。嗯,尤其是那些容易让人迷糊的细节。

HTTP 请求方法核心知识体系 HTTP 请求方法 GET POST PUT DELETE 核心特征 幂等 · 可缓存 参数在 URL 中 长度有限制 核心特征 非幂等 · 不可缓存 参数在 Body 中 无长度限制 核心特征 幂等 · 全量替换 指定资源 ID 不存在则创建 核心特征 幂等 · 删除资源 指定资源 ID 重复调用无副作用 典型场景 数据采集 · 页面抓取 典型场景 表单提交 · 登录 典型场景 更新用户 · 修改配置 典型场景 删除记录 · 取消订单

GET 与 POST:最核心的两个方法

先说说 GET。它的设计初衷就是「获取资源」。你想想看,浏览器地址栏输入网址回车,那就是 GET 请求。爬虫采集网页数据,绝大多数也是 GET。

GET 有个重要特性——幂等性。什么意思?就是同一个 GET 请求发 1 次和发 100 次,服务器上的资源状态不会改变。我刚开始写爬虫时没注意这个,写了个循环去抓数据,结果把人家服务器搞挂了。后来才知道,GET 请求不应该有副作用。

POST 就不一样了。它用来「提交数据」,通常会产生副作用。比如用户注册、发表评论、上传文件。POST 不是幂等的,你提交两次订单,可能会下两个单。

GET vs POST 核心区别速查表

对比维度 GET POST
幂等性 是 否
参数位置 URL 查询字符串 请求体 (Body)
长度限制 有(浏览器/服务器限制) 理论上无限制
可缓存 是(浏览器默认缓存) 否(除非特殊配置)
安全性 参数暴露在 URL 中 参数在 Body 中,相对安全
数据类型 仅 ASCII 字符 任意二进制数据
书签/历史记录 可保存 不可保存

我的经验:做爬虫时,如果目标网站用 GET 传大量参数,URL 会变得很长。有些老旧的服务器对 URL 长度有限制,超过 2048 个字符就可能被截断。这时候我会改用 POST 来采集数据,把参数放在 Body 里,稳得多。

PUT 和 PATCH:更新资源的两种姿势

这两个方法很多人分不清。我简单说——PUT 是全量替换,PATCH 是局部更新。

举个例子。假设你有一个用户信息:

{
  "id": 1,
  "name": "张三",
  "age": 25,
  "email": "zhangsan@example.com"
}

如果你用 PUT 只传 {"age": 26},那结果可能是 name 和 email 都被清空了。因为 PUT 要求你提供完整的资源表示。我踩过这个坑,有一次写接口,用 PUT 更新用户信息,忘了传 email 字段,结果用户邮箱全丢了。那叫一个惨。

PATCH 就聪明多了。它只更新你指定的字段:

PATCH /api/user/1
Content-Type: application/json

{
  "age": 26
}

这样只会把 age 改成 26,其他字段纹丝不动。

注意:PUT 是幂等的,PATCH 不一定是。同一个 PUT 请求发两次,结果一样。但 PATCH 如果设计成「每次调用 age 加 1」,那就不是幂等的了。设计 API 时要注意这个区别。

DELETE:删除资源

DELETE 顾名思义,就是删除指定的资源。它是幂等的——第一次删除成功,第二次再删,服务器返回 404 或者 204,但资源状态不会再变。

我在做数据采集时,有时候需要清理测试数据。比如采集了一批商品信息,测试完了要删掉。这时候用 DELETE 就很合适:

DELETE /api/products/12345

返回 204 No Content 表示删除成功。如果资源不存在,返回 404。

实际应用场景:数据采集中的方法选择

说了这么多理论,咱们看看实际爬虫项目里怎么选。

场景一:采集公开页面数据

用 GET。比如抓取新闻列表、商品详情、用户主页。参数简单,直接拼在 URL 里。

GET /news?page=1&size=20
GET /product/1001

场景二:模拟登录或提交表单

用 POST。用户名密码、验证码这些敏感信息不能暴露在 URL 里。而且登录请求通常有反爬机制,POST 请求更容易模拟。

POST /api/login
Content-Type: application/x-www-form-urlencoded

username=admin&password=123456

场景三:更新已有数据

看情况。如果是全量更新,用 PUT;如果是局部修改,用 PATCH。我建议优先用 PATCH,更安全,不容易误伤其他字段。

场景四:删除测试数据

用 DELETE。注意,很多网站对 DELETE 请求有权限校验,爬虫里很少直接用。但如果你在写自动化测试脚本,DELETE 是标配。

一个完整的例子:用 Python 演示五种方法

最后,我写个简单的 Python 示例,用 requests 库演示这五种方法。你可以在本地跑跑看。

import requests

BASE_URL = "https://jsonplaceholder.typicode.com"

# 1. GET - 获取数据
response = requests.get(f"{BASE_URL}/posts/1")
print("GET:", response.json())

# 2. POST - 创建数据
new_post = {"title": "foo", "body": "bar", "userId": 1}
response = requests.post(f"{BASE_URL}/posts", json=new_post)
print("POST:", response.json())

# 3. PUT - 全量更新
update_data = {"id": 1, "title": "updated", "body": "new body", "userId": 1}
response = requests.put(f"{BASE_URL}/posts/1", json=update_data)
print("PUT:", response.json())

# 4. PATCH - 局部更新
patch_data = {"title": "patched title"}
response = requests.patch(f"{BASE_URL}/posts/1", json=patch_data)
print("PATCH:", response.json())

# 5. DELETE - 删除资源
response = requests.delete(f"{BASE_URL}/posts/1")
print("DELETE status:", response.status_code)  # 200 或 204

小技巧:调试接口时,可以用 requests.Session() 来保持会话,这样 cookie 会自动管理。我写爬虫时几乎必用 Session,省心不少。

总结一下

五种方法各有各的用途。GET 和 POST 是基础,必须掌握。PUT 和 PATCH 在写 API 或对接第三方接口时经常遇到。DELETE 虽然用得少,但理解它的幂等性很重要。

我个人建议,刚开始做爬虫的同学,先把 GET 和 POST 玩熟。等遇到需要更新或删除数据的场景,再回头看看 PUT、PATCH 和 DELETE。一口吃不成胖子,对吧?