get和post的请求在request里的应用与区别
今天遇到了一些问题,算是搞懂了get和post请求在request里的区别,用错了就请求不到,这里把总结的ai回答发一下,作为笔记
一句话记忆:
- GET → 把参数放在 URL 查询串 → 用
params=
- POST → 把参数放在 请求体 → 用
data=
(表单)或json=
(JSON)
对照表
场景 | requests 写法 | 最终出现在 |
---|---|---|
GET 查询参数 | requests.get(url, params={'a':1}) | ?a=1 |
POST 表单 | requests.post(url, data={'a':1}) | body,Content-Type: application/x-www-form-urlencoded |
POST JSON | requests.post(url, json={'a':1}) | body,Content-Type: application/json |
常见误区
- GET 用
data=
→ 会被忽略 - POST 用
params=
→ 只会追加到 URL,不会进 body
所以 “GET → params,POST → data/json” 是 99 % 场景下的正确配对。
你看到的
https://haowallpaper.com/link/common/file/getCompleteUrl/
后面 没有自动带上 data 参数,是因为你用的是 POST 并把 pp
放进了 data=
;
requests
只在 GET 或 手动拼 URL 时才会把 params
拼到 URL 上。
✅ 如何同时看到「完整 URL + data 内容」
1. 改成 GET,让 requests 自动拼接
import urllib.parse as upbase = f"https://haowallpaper.com/link/common/file/getCompleteUrl/{wtid}"
full_url = f"{base}?{up.urlencode(pp)}"
print("完整 URL =>", full_url)resp = session.get(full_url, headers=headers, timeout=10)
print("响应 =>", resp.text)
输出示例
完整 URL => https://haowallpaper.com/link/common/file/getCompleteUrl/17151990488157568?data=0sSpEAt8pd%2BMHt1R%2F6e6X...
2. 如果仍坚持 POST
# POST 时 URL 不会带 data,但你可以手动打印
print("POST URL =>", resp.url) # 只打印基础路径
print("POST 体 =>", pp) # 手动看 data
⚠️ 网络 / 链接异常提示
当前服务器对这条 fileId
返回 500 Internal Server Error,
并非参数缺失,而是 服务器拒绝该轨迹密文 或 文件已失效。
- 确认轨迹加密格式(浏览器抓包对比长度)。
- 换一个
wtid
重试 或 等待数分钟。
你的疑问可以一句话说清楚:
POST 本身不会把
data
拼到 URL 上;你看到“URL 是拼接过的”是因为后端在 30X 重定向时把参数又回写到 Location 里,或者你实际发的是 GET。
✅ 如何 100 % 确认真实请求 URL
用 requests
自带的 PreparedRequest
:
from requests import Request, Sessions = Session()
req = Request('POST',f'https://haowallpaper.com/link/common/file/getCompleteUrl/{wtid}',data=pp, # 这里是 POST 体headers=headers).prepare()print('真实 URL =>', req.url) # 不含 data
print('POST 体 =>', req.body) # 这里才是 data
resp = s.send(req) # 发送
print('响应 URL =>', resp.url) # 如果有 30X 重定向,这里才会带参数
🔍 常见误区
场景 | 你看到的 URL | 原因 |
---|---|---|
POST + data= | 原始 URL 不变 | 参数放在 请求体 |
POST + params= | URL 带 ?data=... | 参数被拼到 查询串 |
后端 30X 重定向 | Location 带 ?data=... | 服务器把参数 回写 |
✅ 一句话结论
POST 不会把 data
拼到 URL;
若 URL 带参数,要么你用了 params=
,要么被重定向,要么实际发的是 GET。
content-Length
Content-Length
的含义一句话:它只表示「请求/响应体」占用的字节数,与 URL 里的查询参数、Cookie 等头部字段 毫无关系。
场景 | Content-Length 值 | 说明 |
---|---|---|
GET / 空体 | 0 | 没有请求体,URL 参数再多也不计入 |
POST + data=... 放在 URL 查询串 | 0 | 参数在 URL,不在请求体 |
POST + 表单/JSON 放在 请求体 | 实际字节数 | 例如 {"a":1} 长度 7,就被计为 7 |
因此:
- 你抓到的包
POST ...?data=xxx
请求体确实为空,所以Content-Length: 0
是 正确的。 - 只要 body 里没有任何数据,无论 URL 多长,都写 0;这才是 HTTP 协议的规范行为。