HTTP 请求方法:GET 与 POST 核心区别,以及 PUT/DELETE/PATCH 的实际应用
说到 HTTP 请求方法,很多新手第一反应就是「GET 用来拿数据,POST 用来发数据」。这话没错,但太笼统了。我在爬虫和数据采集项目里摸爬滚打这么多年,发现真正理解这几个方法的区别,能帮你少踩很多坑。
今天咱们就掰开揉碎,把 GET、POST、PUT、DELETE、PATCH 这几个最常用的方法讲透。嗯,尤其是那些容易让人迷糊的细节。
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。一口吃不成胖子,对吧?