我正在对gerrit服务器进行REST调用。很直接地说,我不理解反应。看看Chrome的网络流量,Chrome也得到了同样的反应。所以我猜我根本不明白如何解析响应。这是我的代码和一些响应:
import requests
from requests.auth import HTTPBasicAuth
url = 'https://my.gerrit.server.com/changes/?n=1&q=owner=me'
headers = { 'Content-Type': 'application/json', 'charset' : 'UTF-8'}
response = requests.get(url, verify=False, auth=HTTPBasicAuth('usernmae', 'password'), headers=headers)
如果我们打印response.text,我们得到的是:
')]}'n[n {n "id": "some_id, ... ,n "requirements": []n }n]n'
除了开头(]}之外,它看起来都像有效的JSON。
我该如何解析?
在将该值传递给JSON解析器之前,必须去掉前缀字符。
s[4:] if s.startswith(')]}'') else s
>>> s = ')]}'n[n {n "id": "some_id",n "requirements": []n }n]n'
>>> json.loads(s[4:] if s.startswith(')]}'') else s)
[{'id': 'some_id', 'requirements': []}]
来自Gerrit文档https://gerrit-review.googlesource.com/Documentation/rest-api.html#output
为了防止跨站点脚本包含(XSSI(攻击,JSON响应体以一个神奇的前缀行开始,在将响应体的其余部分提供给JSON解析器之前,必须剥离该前缀行:
)]}' [ ... valid JSON ... ]