קליינט HTTP של פייתון – בקשה GET, POST

מתרגם 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, זה עבד באופן מושלם.

Python HTTP Client 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