Website-Suche

Python HTTP-Client-Anfrage - GET, POST


Das Python-HTTP-Modul definiert die Klassen, die den Client-Seitigen der HTTP- und HTTPS-Protokolle bereitstellen. In den meisten Programmen wird das HTTP-Modul nicht direkt verwendet und ist zusammen mit dem urllib-Modul zur Handhabung von URL-Verbindungen und der Interaktion mit HTTP-Anfragen gebündelt. Heute werden wir lernen, wie man einen Python-HTTP-Client verwendet, um eine HTTP-Anfrage zu senden und dann den Status der Antwort zu analysieren und die Daten des Antwortkörpers zu erhalten.

Python HTTP-Client

In diesem Beitrag über das Python HTTP-Modul werden wir versuchen, Verbindungen herzustellen und HTTP-Anfragen wie GET, POST und PUT durchzuführen. Lassen Sie uns anfangen.

HTTP-Verbindungen herstellen

Wir beginnen mit dem einfachsten, was das HTTP-Modul tun kann. Wir können mit diesem Modul ganz einfach HTTP-Verbindungen herstellen. Hier ist ein Beispielprogramm:

import http.client

connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)

Lass uns die Ausgabe dieses Programms sehen:

In diesem Skript haben wir uns mit der URL über Port 80 mit einer bestimmten Zeitüberschreitung verbunden.

Python HTTP GET

Jetzt werden wir einen HTTP-Client verwenden, um eine Antwort und einen Status von einer URL zu erhalten. Schauen wir uns einen Codeausschnitt 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. Lassen Sie uns die Ausgabe für dieses Programm ansehen:

Denken Sie daran, eine Verbindung zu schließen, sobald 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.

Erhalten Sie den Fehler: CERTIFICATE_VERIFY_FAILED?

Als ich das oben genannte Programm zum ersten Mal ausgeführt habe, erhielt ich den folgenden Fehler im Zusammenhang mit SSL-Zertifikaten.

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 mit den SSL-Zertifikaten zu tun haben muss. Aber das Website-Zertifikat ist in Ordnung, also muss es etwas mit meiner Einrichtung zu tun haben. Nach etwas Googeln fand ich heraus, dass wir auf MacOS die Datei Install Certificates.command, die im Python-Installationsverzeichnis vorhanden ist, ausführen müssen, um dieses Problem zu beheben. Das unten stehende Bild zeigt die Ausgabe, die durch die Ausführung dieses Befehls erzeugt wurde; es sieht so aus, als würde es die neuesten Zertifikate installieren, die bei der Herstellung von SSL-Verbindungen verwendet werden sollen.

Python HTTP-Client Ubuntu

Die Header-Liste aus der Antwort abrufen

Aus der Antwort, die wir erhalten, enthalten die Header normalerweise auch wichtige Informationen über die Art der vom Server zurückgesendeten Daten und den Status der Antwort. Wir können eine Liste von Headern aus dem Antwortobjekt selbst abrufen. Lassen Sie uns einen Codeausschnitt ansehen, 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))

Lass uns die Ausgabe dieses Programms sehen:

Python HTTP POST

Wir können Daten auch an eine URL mit dem HTTP-Modul POSTEN und eine Antwort zurückbekommen. 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())

Lass uns die Ausgabe dieses Programms 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 eine PUT-Anfrage mithilfe des HTTP-Moduls selbst durchführen. Wir werden das letzte Programm verwenden. Lassen Sie uns einen Code-Snippet ansehen:

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)

Lass uns die Ausgabe dieses Programms sehen:

Schlussfolgerung

In dieser Lektion haben wir einfache HTTP-Operationen studiert, die mit http.client durchgeführt werden können. Wir können auch einen Python-HTTP-Server mit dem SimpleHTTPServer-Modul erstellen. Referenz: API-Dokumentation