Python HTTP Client Aanvraag – GET, POST

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.

Python HTTP Client Ubuntu

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