Die Python-HTTP-Modul definiert die Klassen, die die Client-Seite der HTTP- und HTTPS-Protokolle bereitstellen. In den meisten Programmen wird das HTTP-Modul nicht direkt verwendet und wird mit dem urllib
-Modul kombiniert, um URL-Verbindungen zu handhaben und mit HTTP-Anfragen zu interagieren. Heute werden wir lernen, wie man einen Python-HTTP-Client verwendet, um HTTP-Anfragen zu senden und dann den Antwortstatus zu analysieren und Antwortkörperdaten zu erhalten.
Python HTTP-Client
In diesem Beitrag zum Python-HTTP-Modul werden wir versuchen, Verbindungen herzustellen und HTTP-Anfragen wie GET, POST und PUT zu senden. Lass uns anfangen.
HTTP-Verbindungen herstellen
Wir werden mit dem einfachsten beginnen, was das HTTP-Modul tun kann. Wir können ganz einfach HTTP-Verbindungen mit diesem Modul herstellen. Hier ist ein Beispielprogramm:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
Lasst uns das Ergebnis dieses Programms sehen: In diesem Skript haben wir uns mit der URL auf Port 80 mit einem spezifischen Timeout verbunden.
Python HTTP GET
Jetzt werden wir den HTTP-Client verwenden, um eine Antwort und einen Status von einer URL zu erhalten. Schauen wir uns einen Code-Schnipsel an:
import http.client
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
print("Status: {} and reason: {}".format(response.status, response.reason))
connection.close()
Im obigen Skript haben wir eine URL verwendet und den Status mit dem Verbindungsobjekt überprüft. Schauen wir uns die Ausgabe für dieses Programm an: Denken Sie daran, eine Verbindung zu schließen, wenn Sie mit dem Verbindungsobjekt fertig sind. Beachten Sie auch, dass wir eine
HTTPSConnection
verwendet haben, um die Verbindung herzustellen, da die Website über das HTTPS-Protokoll bereitgestellt wird.
SSL: CERTIFICATE_VERIFY_FAILED Fehler erhalten?
Als ich das obige Programm zum ersten Mal ausgeführt habe, habe ich folgenden Fehler im Zusammenhang mit SSL-Zertifikaten erhalten.
$ python3.6 http_client.py
Traceback (most recent call last):
File "http_client.py", line 4, in <module>
connection.request("GET", "/")
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1239, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1285, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1234, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1026, in _send_output
self.send(msg)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 964, in send
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 1400, in connect
server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 401, in wrap_socket
context=self, session=session)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 808, in init
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 1061, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/ssl.py", line 683, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748)
$
Aus der Ausgabe war klar, dass es etwas mit den SSL-Zertifikaten zu tun hat. Aber das Website-Zertifikat ist in Ordnung, also muss es etwas mit meiner Konfiguration zu tun haben. Nach einigem Googeln fand ich heraus, dass wir auf MacOS die Datei Install Certificates.command
im Python-Installationsverzeichnis ausführen müssen, um dieses Problem zu beheben. Das untenstehende Bild zeigt die Ausgabe, die durch die Ausführung dieses Befehls erzeugt wird. Es sieht so aus, als würde es die neuesten Zertifikate installieren, die beim Herstellen von SSL-Verbindungen verwendet werden sollen. Beachten Sie, dass ich diesen Fehler auf Mac OS erhalten habe. Auf meinem Ubuntu-System hat es jedoch einwandfrei funktioniert.

Abrufen der Kopfzeilenliste aus der Antwort
Aus der Antwort, die wir erhalten, enthalten die Header in der Regel auch wichtige Informationen über den Typ der vom Server zurückgesendeten Daten und den Antwortstatus. Wir können eine Liste der Header direkt aus dem Antwortobjekt erhalten. Schauen wir uns einen Codeausschnitt an, der eine leicht modifizierte Version des letzten Programms ist:
import http.client
import pprint
connection = http.client.HTTPSConnection("www.journaldev.com")
connection.request("GET", "/")
response = connection.getresponse()
headers = response.getheaders()
pp = pprint.PrettyPrinter(indent=4)
pp.pprint("Headers: {}".format(headers))
Lassen Sie uns die Ausgabe für dieses Programm sehen:
Python HTTP POST
Wir können auch Daten an eine URL senden und mit dem HTTP-Modul eine Antwort erhalten. Hier ist ein Beispielprogramm:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
Lassen Sie uns die Ausgabe für dieses Programm sehen: Fühlen Sie sich frei, die HTTP-Bin-Bibliothek zu verwenden, um weitere Anfragen auszuprobieren.
Python-HTTP-PUT-Anfrage
Natürlich können wir auch einen PUT-Request mit dem HTTP-Modul selbst durchführen. Wir werden das letzte Programm verwenden. Werfen wir einen Blick auf einen Code-Schnipsel:
import http.client
import json
conn = http.client.HTTPSConnection('www.httpbin.org')
headers = {'Content-type': 'application/json'}
foo = {'text': 'Hello HTTP #1 **cool**, and #1!'}
json_data = json.dumps(foo)
conn.request("PUT", "/put", json_data)
response = conn.getresponse()
print(response.status, response.reason)
Lassen Sie uns die Ausgabe für dieses Programm sehen:
Schlussfolgerung
In dieser Lektion haben wir einfache HTTP-Operationen studiert, die mit dem http.client
-Modul durchgeführt werden können. Wir können auch einen Python-HTTP-Server mit dem SimpleHTTPServer-Modul erstellen. Referenz: API-Dokumentation
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post