De Python HTTP-module definieert de klassen die de clientzijde van de HTTP- en HTTPS-protocollen leveren. In de meeste programma’s wordt de HTTP-module niet rechtstreeks gebruikt en wordt deze samengevoegd met de urllib
-module om URL-verbindingen te behandelen en interactie met HTTP-verzoeken. Vandaag zullen we leren hoe we een Python HTTP-client kunnen gebruiken om een HTTP-verzoek te verzenden en vervolgens de status van de respons te analyseren en responsgegevens van de body op te halen.
Python HTTP Client
In deze post over de python HTTP-module zullen we proberen verbindingen tot stand te brengen en HTTP-verzoeken te maken zoals GET, POST en PUT. Laten we beginnen.
HTTP-verbindingen maken
We beginnen met het eenvoudigste dat de HTTP-module kan doen. We kunnen eenvoudig HTTP-verbindingen maken met behulp van deze module. Hier is een voorbeeldprogramma:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
Laten we de uitvoer voor dit programma bekijken: In dit script hebben we verbinding gemaakt met de URL op poort 80 met een specifieke time-out.
Python HTTP GET
Nu zullen we een HTTP-client gebruiken om een reactie en een status van een URL te krijgen. Laten we eens kijken naar een codefragment:
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()
In het bovenstaande script hebben we een URL gebruikt en de status gecontroleerd met het verbindingsobject. Laten we de uitvoer voor dit programma bekijken: Onthoud om een verbinding te sluiten zodra je klaar bent met het verbindingsobject. Merk ook op dat we een
HTTPSConnection
hebben gebruikt om de verbinding tot stand te brengen omdat de website via het HTTPS-protocol wordt geserveerd.
Krijg je de foutmelding SSL: CERTIFICATE_VERIFY_FAILED?
Toen ik het bovenstaande programma voor het eerst uitvoerde, kreeg ik de volgende foutmelding met betrekking tot SSL-certificaten.
$ 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)
$
Uit de uitvoer bleek dat het iets te maken had met de SSL-certificaten. Maar het certificaat van de website is in orde, dus het moet iets met mijn configuratie zijn. Na wat googelen ontdekte ik dat op MacOS we het bestand Install Certificates.command
moeten uitvoeren dat zich in de Python-installatiedirectory bevindt om dit probleem op te lossen. Onderstaande afbeelding toont de uitvoer die door deze uitvoering van het commando wordt geproduceerd; het lijkt erop dat er de nieuwste certificaten worden geïnstalleerd die moeten worden gebruikt bij het maken van SSL-verbindingen. Merk op dat ik deze foutmelding kreeg op macOS. Op mijn Ubuntu-systeem werkte het echter perfect.

Het ophalen van de koppenlijst uit de respons
Uit de respons die we ontvangen, bevatten de headers meestal ook belangrijke informatie over het type gegevens dat vanaf de server wordt teruggestuurd en ook de status van de respons. We kunnen een lijst met headers krijgen vanuit het responsobject zelf. Laten we eens kijken naar een stukje code dat een licht aangepaste versie is van het vorige programma:
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))
Laten we de uitvoer van dit programma bekijken:
Python HTTP POST
We kunnen ook gegevens naar een URL POSTen met de HTTP-module en een respons terugkrijgen. Hier is een voorbeeldprogramma:
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())
Laten we de uitvoer van dit programma bekijken: Voel je vrij om de HTTP Bin-bibliotheek te gebruiken om meer verzoeken uit te proberen.
Python HTTP PUT-verzoek
Natuurlijk kunnen we ook een PUT-verzoek uitvoeren met behulp van de HTTP-module zelf. We zullen het laatste programma zelf gebruiken. Laten we eens kijken naar een codefragment:
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)
Laten we de uitvoer voor dit programma bekijken:
Conclusie
In deze les hebben we eenvoudige HTTP-operaties bestudeerd die kunnen worden uitgevoerd met behulp van http.client
. We kunnen ook een Python HTTP-server maken met behulp van de SimpleHTTPServer-module. Referentie: API Doc
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post