تحدد وحدة HTTP في Python الفئات التي توفر الجانب العميل لبروتوكولات HTTP و HTTPS. في معظم البرامج، لا يتم استخدام وحدة HTTP مباشرةً ولكن يتم دمجها مع وحدة urllib
للتعامل مع اتصالات URL والتفاعل مع طلبات HTTP. اليوم سوف نتعلم كيفية استخدام عميل HTTP في Python لإرسال طلب HTTP ومن ثم تحليل حالة الاستجابة والحصول على بيانات الجسم الرد.
عميل HTTP في Python
في هذه المقالة حول وحدة HTTP في Python، سنحاول إجراء اتصالات وإرسال طلبات 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 في Python
الآن، سنستخدم عميل 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. ولكن شهادة الموقع سليمة، لذا يجب أن يكون هناك شيء مع إعداداتي. بعد البحث على الإنترنت، اكتشفت أنه في نظام 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 بلغة Python
يمكننا أيضًا إرسال بيانات 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 لتجربة المزيد من الطلبات.
طلب HTTP PUT بلغة Python
بالطبع ، يمكننا أيضًا إجراء طلب 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 Doc
Source:
https://www.digitalocean.com/community/tutorials/python-http-client-request-get-post