Python requests get方法params参数未拼接查询字符串问题
问题根因
requests默认会自动跟随HTTP重定向,2.27.0之前的旧版本requests在处理GET请求的重定向逻辑时,会直接丢弃原请求传入的params查询参数,不会将参数追加到重定向后的目标地址上。
你的代码中访问https://bitmex.com/api/v1/user/margin时,实际触发了bitmex站点的域名重定向(从无www的根域名跳转到带www的https://www.bitmex.com域名),重定向过程中传入的{'currency': 'all'}参数被直接丢弃,所以最终看到的请求URL没有带查询串。
你测试的google.com地址没有触发会丢参数的重定向流程,因此params可以正常拼接,表现符合预期。
解决方案
- 直接使用重定向后的最终域名发起请求,从源头避开重定向流程,将请求URL替换为
https://www.bitmex.com/api/v1/user/margin即可,params会正常拼接到URL上。 - 升级requests库到2.27.0及以上版本,新版本已经修复了GET请求重定向时丢弃查询参数的bug。
- 若需要兼容旧版本requests,可在请求时传入
allow_redirects=False关闭自动重定向,手动从响应头的Location字段获取重定向地址,自行拼接查询参数后再发起二次请求。
验证代码
import requests # 直接使用重定向后的域名请求 r = requests.get('https://www.bitmex.com/api/v1/user/margin', params={'currency': 'all'}) print(r.request.url) # 输出结果:https://www.bitmex.com/api/v1/user/margin?currency=all
内容的提问来源于stack exchange,提问作者Sofya Kaminskaya
相关产品推荐
相关产品推荐

