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
相关产品推荐
相关产品推荐

