get和post的请求在request里的应用与区别

发布于:2025-08-02 ⋅ 阅读:(19) ⋅ 点赞:(0)

今天遇到了一些问题,算是搞懂了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 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 协议的规范行为。

网站公告

今日签到

点亮在社区的每一天
去签到