מתרגם HTTP של פייתון
בפוסט זה על מודול HTTP של פייתון, ננסה לבצע חיבורים ובקשות HTTP כמו GET, POST ו-PUT. בואו נתחיל.
יצירת חיבורי HTTP
נתחיל עם הדבר הפשוט ביותר שהמודול HTTP יכול לעשות. אנו יכולים בקלות ליצור חיבורי HTTP באמצעות מודול זה. הנה תכנית דוגמה:
import http.client
connection = http.client.HTTPConnection('www.python.org', 80, timeout=10)
print(connection)
בואו נראה את הפלט של התכנית הזו: בתסריט זה, התחברנו ל-URL בפורט 80 עם זמן קצר מסוים.
בקשת HTTP GET בפייתון
עכשיו, נשתמש בלקוח HTTP כדי לקבל תגובה ומצב מ-URL. בואו נסתכל על קטע קוד:
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()
בקטע הקוד לעיל, השתמשנו ב-URL ובדקנו את המצב עם אובייקט החיבור. בואו נסתכל על הפלט של תוכנית זו: זכור לסגור את החיבור לאחר שסיימת עם אובייקט החיבור. כן כדאי לשים לב שהשתמשנו ב-
HTTPSConnection
כדי להקים את החיבור מאחר והאתר משתמש בפרוטוקול HTTPS.
מקבלים שגיאת SSL: CERTIFICATE_VERIFY_FAILED?
כאשר הרצתי את התוכנית לעיל בפעם הראשונה, קיבלתי את השגיאה הבאה הקשורה לתעודות SSL.
$ 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)
$
מהפלט, היה ברור שיש לזה קשר לתעודות SSL. אך תעודת האתר בסדר, כך שזה צריך להיות משהו שקשור להגדרת המערכת שלי. לאחר חיפוש ב-Google, מצאתי כי ב-MacOS, עלינו להריץ את הקובץ Install Certificates.command
הנמצא בתיקיית ההתקנה של Python כדי לתקן את הבעיה הזו. בתמונה למטה מוצג הפלט שנוצר על ידי ביצוע פעולה זו, נראה כי הוא מתקין תעודות עדכניות לשימוש בעת ביצוע חיבורי SSL. שימו לב שקיבלתי את השגיאה הזו ב-Mac OS. אך, על המערכת שלי ב-Ubuntu, זה עבד באופן מושלם.

לקבלת רשימת הכותרות מהתגובה
מהתגובה שאנו מקבלים, הכותרות בדרך כלל מכילות מידע חשוב גם על סוג הנתונים שנשלחים חזרה מהשרת וגם על מצב התגובה. אנו יכולים לקבל רשימת כותרות מעצם אובייקט התגובה עצמו. בואו נסתכל על קטע קוד שהוא גרסה מעט משונה של התוכנית האחרונה:
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))
בואו נראה את הפלט של התוכנית הזו:
HTTP POST בפייתון
אנו יכולים לשלוח נתונים POST לכתובת URL גם עם המודול HTTP ולקבל תגובה חזרה. הנה תוכנית דוגמה:
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())
בואו נראה את הפלט של התוכנית הזו: תרגישו חופשי להשתמש בספריית HTTP Bin כדי לנסות יותר בקשות.
בקשת PUT ב-HTTP של פייתון
כמובן, נוכל גם לבצע בקשת PUT באמצעות המודול HTTP עצמו. נשתמש בתוכנית האחרונה עצמה. בואו נסתכל על קטע קוד:
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)
בואו נראה את הפלט של התוכנית:
מסקנה
בשיעור זה, למדנו פעולות HTTP פשוטות שניתן לבצע באמצעות http.client
. ניתן גם ליצור שרת http בפייתון באמצעות מודול SimpleHTTPServer. קישור: מסמך API
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post