You need to enable JavaScript to run this app. Python requests发GET请求传json参数时URL出现多余&符号导致500报错
优惠活动
大模型
产品
解决方案
定价
更多

Python requests发GET请求传json参数时URL出现多余&符号导致500报错

问题根因

生成的多余&来自requests的URL拼接逻辑:

  • 提前在基础URL里写了?json=,让URL本身已经携带了query参数前缀
  • 给params传入的是纯序列化JSON字符串,而非键值对结构
  • requests的params参数仅能正确处理字典、键值对列表结构,传入纯字符串时会直接追加到现有query字符串末尾
  • requests检测到原URL已经存在?标记后,会默认用&作为分隔符做拼接,最终就生成了json=&{序列化JSON内容}的错误结构。

解决方案

方案1:规范使用params参数(推荐)

不要在基础URL里手动写?json=,把json作为键、序列化后的JSON作为值放到params的字典里,让requests自动完成拼接与URL编码:

import requests  
import json  

# 基础URL去掉手动拼接的?json=
URL="https://search.rcsb.org/rcsbsearch/v1/query"
JSON={ 
    "query": { 
        "type": "terminal", 
        "service": "text", 
        "parameters": { "value": "thymidine kinase" } 
    }, 
    "return_type": "entry"
} 
# params传键值对结构,requests会自动处理编码与拼接
r=requests.get(url=URL, params={'json': json.dumps(JSON, separators=(',', ':'))})
print(r.url) # 输出为正确的URL,无多余&

方案2:手动拼接完整URL

如果需要保留原URL里的?json=结构,就不要使用params参数,先对序列化后的JSON做URL编码,再拼接到URL末尾后直接发起请求:

from urllib.parse import quote
import requests  
import json  

JSON={ 
    "query": { 
        "type": "terminal", 
        "service": "text", 
        "parameters": { "value": "thymidine kinase" } 
    }, 
    "return_type": "entry"
} 
json_str = json.dumps(JSON, separators=(',', ':'))
# 编码后拼接,避免非法字符导致请求异常
full_url = "https://search.rcsb.org/rcsbsearch/v1/query?json=" + quote(json_str)
r=requests.get(url=full_url)
print(r.url) # 输出为正确的URL,无多余&

内容的提问来源于stack exchange,提问作者3im0n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 03:36:04