python-requests chunked response
Ich bin mit dem Python-Requests-Paket zu schreiben, einen einfachen rest-client.
Hier ist mein code -
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)
Hier ist die Ausgabe -
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
Die Antwort auf diese Anfrage ist XML. Wie es aussieht, ist der aufgeteilte.
Gibt es eine Besondere Art und Weise zu Lesen chunked response? Ich würde gerne mal die gesamte XML-Antwort in einen string.
InformationsquelleAutor Quest Monger | 2013-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du immer nur
stream=True
wenn Sie planen, in der Iteration über den Inhalt der Antwort. Wenn Sie planen, drucken Sie den Inhalt dann sofortstream=True
wird Ihnen keine performance-Vorteile. Es wird immer nur verzögern das laden der Inhalte in den Speicher, bis Sie Sie rufenr.text
oderr.content
und dann wird es in den Arbeitsspeicher geladen werden. Wenn Sie verhindern möchten, laden Sie den gesamten Inhalt in den Speicher, schauen Sie unter. Für das andere Problem, versuchen Sie dies:oder
Wenn du auf 2.x,
r.text
ist ein unicode-Objekt, das möglicherweise nicht in der Lage zu sein, umgewandelt in ASCII.Ich bin mir nicht ganz sicher, warum, chunked responses würde nicht funktionieren ohne
stream=True
, aber der einzige Weg, um es richtig zu nutzen (ohne Download alles auf einmal, wie Sie mitr.content
oderr.text
) ist entweder die Verwendungiter_content
oderiter_lines
. Zu sammeln alle die response-Inhalte in einem string, können Sie Folgendes tun:Auf ein zugehöriger Hinweis: die Verwendung des
decode
Methode auf der string zurückgegeben wird, bieten sehr inkonsistente Ergebnisse. Wenn Ihre API erlaubt es, senden Sie dieAccept-Encoding
- header, so können Sie immer sicher sein, zurück zu erhalten Daten, die Sie entschlüsseln können.Sind Sie nicht bereits tun, so dass ich nicht schlagen, aber wenn Sie beharrlich auf die Informationen ausdrucken, dann sind Sie gehen zu müssen, besonders, wenn es eine API zu einer International beliebten website.
Setzte - nicht mit der 'stream=true' für chunked responses Ergebnisse in wirklich komische Fehler wie die, die ich oben gezeigt. ich habe es gerade ausprobiert, und ich habe diesen Fehler - "UnicodeDecodeError: 'utf-8' codec kann nicht decodieren byte 0x96 in position 2: invalid start byte" ich habe versucht, die anderen Optionen, die Sie erwähnt, und ich bekomme den gleichen Fehler. howvever, das funktioniert - rString = r.raw.Lesen(224).decode() hier, 224 darstellen der response byte Länge.
Ich weiß
stream=True
ist nicht die Ursache derUnicodeDecodeError
. Das ist ein encoding-Problem zwischen dem server und Sie (D. H., Sie versuchen, zu drucken der Daten). Egal, ich aktualisierte meine Antwort, einen Weg zu sammeln alle die Antwort in einem string.der UnicodeDecodeError problem war mit der restful-api. es hatte einige encoding - /response-Fragen. ich bin dabei zu akzeptieren, obige Antwort als die am nächsten an eine Lösung, die wir bekamen.
InformationsquelleAutor Ian Stapleton Cordasco