首页 > 解决方案 > json.dumps 中的额外 &/ampersand 与 python 请求包 GET 请求

问题描述

我想使用 pythonrequests包对公共 api 执行一个简单的获取请求。我正在使用请求 2.25.1 和 python 3.6。

不幸的是,URL 参数有一个额外的&前缀,我无法弄清楚它来自哪里。下面的示例代码带有错误的 url 和正确的 url 删除 & 号。

import requests  
import json  

URL="https://search.rcsb.org/rcsbsearch/v1/query?json=" 
JSON={ 
"query": { 
 "type": "terminal", 
 "service": "text", 
 "parameters": { "value": "thymidine kinase" } 
  }, 
  "return_type": "entry"
} 

r=requests.get(url = URL,params=json.dumps(JSON, separators=(',', ':')))

r.url然后是 https://search.rcsb.org/rcsbsearch/v1/query?json=&%7B%22query%22:%7B%22type%22:%22terminal%22,%22service%22:%22text%22,%22parameters%22:%7B%22value%22:%22thymidine%20kinase%22%7D%7D,%22return_type%22:%22entry%22%7D

这会产生 500 错误。

如果对请求的更改json=&%7有效json=%7。我怎样才能摆脱多余的&符号?

https://search.rcsb.org/rcsbsearch/v1/query?json=%7B%22query%22:%7B%22type%22:%22terminal%22,%22service%22:%22text%22,%22parameters%22:%7B%22value%22:%22thymidine%20kinase%22%7D%7D,%22return_type%22:%22entry%22%7D

标签: pythonjsonpython-requests

解决方案


问题是您都在尝试使用params关键字参数,requests.get 并且您正在尝试自己构建参数字符串。由于在您的 URL 中,底层 url 操作代码假定已经存在参数并使用(如)?添加新参数。&someurl?param1=foo&param2=bar...

选择一种机制或另一种机制,例如:

import json
import requests

URL="https://search.rcsb.org/rcsbsearch/v1/query"
JSON={
"query": {
 "type": "terminal",
 "service": "text",
 "parameters": { "value": "thymidine kinase" }
  },
  "return_type": "entry"
}

r=requests.get(url = URL,params={'json': json.dumps(JSON, separators=(',', ':'))})
print(r)

推荐阅读