طلب عميل Python HTTP – GET، POST

تحدد وحدة 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 الخاص بي، عملت بشكل سليم تمامًا.

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 بلغة 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