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.