Я использую пакет Python Requests, чтобы написать простой клиент для отдыха. Вот мой код -python request chunked response
r = requests.get(url, auth=(user, passwd), stream=True, verify=False)
print('headers: ')
pprint.pprint(r.headers)
print('status: ' + str(r.status_code))
print('text: ' + r.text)
Вот выход -
headers:
{'content-type': 'text/xml;charset=UTF-8',
'date': 'Thu, 16 May 2013 03:26:06 GMT',
'server': 'Apache-Coyote/1.1',
'set-cookie': 'JSESSIONID=779FC39...5698; Path=/; Secure; HttpOnly',
'transfer-encoding': 'chunked'}
status: 200
Traceback (most recent call last):
File "C:\...\client.py", line 617, in _readinto_chunked
chunk_left = self._read_next_chunk_size()
File "C:\...\client.py", line 562, in _read_next_chunk_size
return int(line, 16)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte
Ответ на этот запрос является XML. Похоже, что это чанк. Есть ли специальный способ читать ответный ответ? Я хотел бы поместить весь XML-ответ в одну строку.
извините, но ваше утверждение о потоке не соответствует действительности. Документация по запросам - «По умолчанию при отправке запроса тело ответа загружается немедленно. Вы можете переопределить это поведение и отложить загрузку тела ответа до тех пор, пока не получите доступ к атрибуту Response.content с параметром потока« –
Продолжение - не использовать 'stream = true' для фрагментированных ответов, приводит к действительно странным ошибкам, подобным тем, которые я показал выше. Я просто попробовал это, и я получил эту ошибку - «UnicodeDecodeError:« utf-8 »кодек не может декодировать байт 0x96 в позиции 2: недопустимый стартовый байт« Я пробовал другие варианты, о которых вы упомянули, и я получаю то же самое ошибка. howvever, это работает - rString = r.raw.read (224) .decode() здесь, 224 представляют длину ответа байт. –
@QuestMonger Я знаю 'stream = True' не вызывает' UnicodeDecodeError'. Это проблема кодирования между сервером и вами (т. Е. Попытка распечатать данные). Несмотря на это, я обновил свой ответ, чтобы собрать весь ответ в одну строку. –