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 JSONrequests.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 up

base = 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, Session

s = 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 协议的规范行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shix .

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值