تتناول هذه المقالة طريقتي طلب HTTP (بروتوكول نقل النص التشعبي) وهما طلبات GET وPOST في Python وتنفيذهما في Python.
ما هو HTTP؟
HTTP عبارة عن مجموعة من البروتوكولات المصممة لتمكين الاتصال بين العملاء والخوادم. إنه يعمل كبروتوكول استجابة للطلب بين العميل والخادم. قد يكون متصفح الويب هو العميل، وقد يكون التطبيق الموجود على جهاز الكمبيوتر الذي يستضيف موقعًا على الويب هو الخادم. لذا لطلب استجابة من الخادم هناك طريقتان أساسيتان:
- يحصل : لطلب البيانات من الخادم.
- بريد : لإرسال البيانات المراد معالجتها إلى الخادم.
فيما يلي رسم تخطيطي بسيط يشرح المفهوم الأساسي لطرق GET وPOST.
الآن لتقديم طلبات HTTP بايثون يمكننا استخدام العديد من مكتبات HTTP مثل:
أرقى وأبسط المكتبات المذكورة أعلاه هي الطلبات. سوف نستخدم مكتبة الطلبات في هذه المقالة. لتنزيل وتثبيت مكتبة الطلبات استخدم الأمر التالي:
pip install requestsتقديم طلب الحصول
يعثر المثال أعلاه على خط الطول وخط العرض والعنوان المنسق لموقع معين عن طريق إرسال طلب GET إلى Google Maps API. ان واجهة برمجة التطبيقات تمكنك (واجهة برمجة التطبيقات) من الوصول إلى الميزات الداخلية لبرنامج ما بطريقة محدودة. وفي معظم الحالات تكون البيانات المقدمة موجودة JSON (ترميز كائن JavaScript) التنسيق (الذي يتم تنفيذه ككائنات قاموس في Python!).
Python# importing the requests library import requests # api-endpoint URL = 'http://maps.googleapis.com/maps/api/geocode/json' # location given here location = 'delhi technological university' # defining a params dict for the parameters to be sent to the API PARAMS = {'address':location} # sending get request and saving the response as response object r = requests.get(url = URL params = PARAMS) # extracting data in json format data = r.json() # extracting latitude longitude and formatted address # of the first matching location latitude = data['results'][0]['geometry']['location']['lat'] longitude = data['results'][0]['geometry']['location']['lng'] formatted_address = data['results'][0]['formatted_address'] # printing the output print('Latitude:%snLongitude:%snFormatted Address:%s' %(latitude longitudeformatted_address))
الإخراج:
نقاط مهمة يجب استنتاجها:
PARAMS = {'address':location}يحمل عنوان URL لطلب GET بشكل عام بعض المعلمات معه. بالنسبة لمعلمات مكتبة الطلبات يمكن تعريفها على أنها قاموس. يتم تحليل هذه المعلمات لاحقًا وإضافتها إلى عنوان URL الأساسي أو نقطة نهاية واجهة برمجة التطبيقات. لفهم دور المعلمة حاول الطباعة r.url بعد إنشاء كائن الاستجابة. سترى شيئا مثل هذا:
http://maps.googleapis.com/maps/api/geocode/json?address=delhi+technological+universityهذا هو عنوان URL الفعلي الذي تم إجراء طلب GET عليه
r = requests.get(url = URL params = PARAMS)نقوم هنا بإنشاء كائن استجابة "r" والذي سيقوم بتخزين استجابة الطلب. نحن نستخدم طريقة request.get() لأننا نرسل طلب GET. الوسيطان اللذان نمررهما هما URL وقاموس المعلمات.
data = r.json()الآن، من أجل استرداد البيانات من كائن الاستجابة، نحتاج إلى تحويل محتوى الاستجابة الأولية إلى بنية بيانات من نوع JSON. يتم تحقيق ذلك باستخدام طريقة json (). أخيرًا، نقوم باستخراج المعلومات المطلوبة عن طريق تحليل كائن من نوع JSON.
تقديم طلب POST
يشرح هذا المثال كيفية لصق ملفك source_code ل Pastebin.com عن طريق إرسال طلب POST إلى PASTEBIN API. أولا وقبل كل شيء سوف تحتاج إلى إنشاء مفتاح API عن طريق الاشتراك هنا ومن ثم الوصول إلى الخاص بك مفتاح API هنا .
Python# importing the requests library import requests # defining the api-endpoint API_ENDPOINT = 'https://pastebin.com/api/api_post.php' # your API key here API_KEY = 'XXXXXXXXXXXXXXXXX' # your source code here source_code = ''' print('Hello world!') a = 1 b = 2 print(a + b) ''' # data to be sent to api data = {'api_dev_key': API_KEY 'api_option': 'paste' 'api_paste_code': source_code 'api_paste_format': 'python'} # sending post request and saving response as response object r = requests.post(url=API_ENDPOINT data=data) # extracting response text pastebin_url = r.text print('The pastebin URL is:%s' % pastebin_url)
الميزات الهامة لهذا الكود:
data = {'api_dev_key':API_KEY
'api_option':'paste'
'api_paste_code':source_code
'api_paste_format':'python'}
سنحتاج هنا مرة أخرى إلى تمرير بعض البيانات إلى خادم API. نقوم بتخزين هذه البيانات كقاموس.
r = requests.post(url = API_ENDPOINT data = data)نقوم هنا بإنشاء كائن استجابة "r" والذي سيقوم بتخزين استجابة الطلب. نحن نستخدم طريقة request.post() لأننا نرسل طلب POST. الوسيطان اللذان نمررهما هما عنوان URL وقاموس البيانات.
pastebin_url = r.textردًا على ذلك، يقوم الخادم بمعالجة البيانات المرسلة إليه ويرسل Pastebin_URL الخاص بك source_code والتي يمكن الوصول إليها ببساطة عن طريق r.text.
request.post يمكن استخدام هذه الطريقة في العديد من المهام الأخرى، مثل ملء وإرسال نماذج الويب المنشورة على المخطط الزمني لفيسبوك الخاص بك باستخدام Facebook Graph API وما إلى ذلك.
فيما يلي بعض النقاط المهمة التي يجب التفكير فيها:
- عندما تكون الطريقة GET، يتم تشفير كافة بيانات النموذج في عنوان URL وإلحاقها بملف فعل URL كمعلمات سلسلة الاستعلام. مع ظهور بيانات نموذج POST داخل جسم الرسالة لطلب HTTP.
- في طريقة GET، تقتصر بيانات المعلمة على ما يمكننا إدخاله في سطر الطلب (URL). من الأكثر أمانًا استخدام أقل من 2 كيلو بايت من المعلمات، حيث تتعامل بعض الخوادم مع ما يصل إلى 64 كيلو بايت. لا توجد مشكلة من هذا القبيل في طريقة POST نظرًا لأننا نرسل البيانات في جسم الرسالة لطلب HTTP وليس عنوان URL.
- يُسمح فقط بأحرف ASCII لإرسال البيانات بطريقة GET. لا يوجد مثل هذا القيد في طريقة POST.
- يعد GET أقل أمانًا مقارنة بـ POST لأن البيانات المرسلة جزء من عنوان URL. لذلك لا ينبغي استخدام طريقة GET عند إرسال كلمات المرور أو غيرها من المعلومات الحساسة.