Python3 Геррит просит получить ответ Json начинается с)]} - PullRequest
0 голосов
/ 25 марта 2020

Я делаю вызов REST на сервер Gerrit. Довольно прямое ожидание. Я не понимаю ответ. Глядя на сетевой трафик c из 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, кроме начала )]} .

Как мне разобрать это?

1 Ответ

1 голос
/ 25 марта 2020

Вы должны удалить префиксные символы перед передачей этого значения в 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 начинается с строки префикса magi c, которую необходимо удалить перед передачей остальной части тела ответа анализатору JSON:

  )]}'
  [ ... valid JSON ... ]
...