Den Inhalt der von HTTP-Anfragen zurückgegebenen Response-Objekte enthält deren Attribut »text
«
im Rohtext. Im »content
«
-Attribut hält das Response-Objekt die Antwortdaten Byte für Byte vor. Das ist hilfreich, falls es sich beim Inhalt um Binärdaten statt um Text handelt, beispielsweise um Bilder. Fürs Json-Format bringt Requests einen passenden Parser mit: Die »json()
«
-Methode eines Reponse-Objekts bereitet den Inhalt als Python-Dictionary auf.
Standardmäßig holt ein HTTP-Request die Antwort direkt vollständig vom Server ab. Setzt man den Parameter »stream
«
auf »True
«
, wartet die Response-Klasse damit, bis man über das »content
«
-Attribut den Inhalt abruft. Das eröffnet die Möglichkeit, die Antwort stückchenweise und auf Wunsch auch direkt vom Socket abzuholen, etwa mit »r.raw.read(Bytes)
«
.
»r.iter_content()
«
und »r.iter_lines()
«
liefern daneben Iteratoren, die eine Antwort Byte- beziehungsweise zeilenweise durchlaufen. Das Beispiel in Listing 1 holt die Antwort in 64 Byte großen Einzelteilen und schreibt sie nacheinander in eine Datei »index.html
«
.
Listing 1
Stückchenweiser Abruf einer Datei
Streaming funktioniert auch in die andere Richtung. Beim Hochladen von Daten mit »post()
«
übergibt man lediglich dem »data
«
-Parameter ein geöffnetes »File
«
-Objekt. Dann lädt »post()
«
dessen gesamten Inhalt nach und nach hoch:
post(URL, data=open("bild.png"))
Alternativ nimmt der »data
«
-Parameter ein »Generator
«
-Objekt entgegen; auch ein Iterator ist hier erlaubt, wenn er keine feste Länge definiert. Die »post()
«
-Methode hat damit die Möglichkeit den Generator beziehungsweise Iterator immer wieder aufzurufen und jedes Ergebnis als separate Einheit an den Server zu schicken.
Ein HTTP-Server schickt als Teil seiner Antwort auf eine Anfrage stets einen Status-Code mit. Das Attribut »status_code
«
eines Response-Objekts verrät dieses Ergebnis. War bei einem Aufruf alles in Ordnung, enthält »r.status_code
«
den Wert 200. Bei fehlgeschlagenen Zugriffsversuchen beginnt der Antwort-Code mit 4 oder 5. Die »Response
«
-Methode »raise_for_status()
«
verwendet den Status-Code und löst im Fehlerfall eine »HTTPError
«
-Exception aus. Sie kommt deshalb zum Prüfen des Verbindungsstatus mit Try-Except-Konstruktionen zum Einsatz.
Die Kopfzeilen der HTTP-Antwort eines Servers führt das »headers
«
-Attribut eines Response-Objekts auf (siehe Abbildung 1). Im abgebildeten Beispiel verrät die Zeile »set-cookie
«
bereits, dass der Server dem Client einen Cookie geschickt hat. Ihn hält das Attribut »cookies
«
in einem Objekt der Klasse »requests.cookies.RequestsCookieJar
«
vor, das als Behälter für »Cookie
«
-Objekte dient.
Die Methode »get()
«
eines Objekts der Klasse »RequestsCookieJar
«
holt unter Angabe des Cookie-Namens die einzelnen Kekse in die Dose. Wie bei einem Dictionary zeigt die »keys()
«
-Methode der gleichen Klasse alle verfügbaren Cookie-Namen an. Auch andere Methoden wie »values()
«
, »items()
«
, »iteritems()
«
, »iterkeys()
«
und »itervalues()
«
funktionieren bei RequestsCookieJar-Objekten auf die gleiche Weise wie bei Dictionaries.