كيفية استخدام واجهة برمجة التطبيقات (API) مع بايثون (دليل المبتدئين)

في الوقت الحاضر، تعد لغة بايثون واحدة من أكثر لغات البرمجة شيوعًا وسهولة في الوصول إليها. في عام 2019، احتلت المرتبة الثالثة في تصنيف TIOBE. ويعتقد العديد من الخبراء أنه في غضون 3-4 سنوات ستتفوق على C وJava لتتصدر التصنيفات.

وبناءً على ذلك، لن يكون من المستغرب أن تستخدم بايثون في مشروع التفاعل مع واجهة برمجة التطبيقات (API) التالي. في هذه المقالة، سنتحدث عن حكمة استخدام واجهة برمجة التطبيقات (API) ولماذا ستكون بايثون مساعدة كبيرة في هذه المهمة.

ما هي واجهة برمجة التطبيقات REST (من منظور بايثون)

واجهة برمجة التطبيقات (API) عبارة عن مجموعة من القواعد التي تشترك فيها خدمة معينة. تحدد هذه القواعد التنسيق ومجموعة الأوامر التي يمكن لتطبيقك الوصول بها إلى الخدمة، بالإضافة إلى البيانات التي يمكن لهذه الخدمة إرجاعها في الاستجابة. تعمل واجهة برمجة التطبيقات كطبقة بين تطبيقك والخدمة الخارجية. لست بحاجة إلى معرفة البنية الداخلية وميزات الخدمة، ما عليك سوى إرسال أمر بسيط معين واستلام البيانات بتنسيق محدد مسبقًا.

REST API (نقل الحالة التمثيلية) عبارة عن واجهة برمجة تطبيقات تستخدم طلبات HTTP للتواصل مع خدمات الويب.

يجب أن يتوافق مع بعض القيود، وفيما يلي بعض منها:

  • هندسة العميل والخادم – العميل مسؤول عن واجهة المستخدم، والخادم مسؤول عن الواجهة الخلفية وتخزين البيانات. العميل والخادم مستقلان ويمكن استبدال كل منهما.
  • عديم الحالة – لا يتم تخزين أي بيانات من العميل على جانب الخادم. يتم تخزين حالة الجلسة على جانب العميل.
  • قابلة للتخزين المؤقت – يمكن للعملاء تخزين استجابات الخادم مؤقتًا لتحسين الأداء.

قائمة كاملة للقيود يمكنك رؤيتها هنا.

من جانب بايثون، يمكن اعتبار واجهة برمجة التطبيقات REST بمثابة مصدر بيانات موجود على عنوان إنترنت يمكن الوصول إليه بطريقة معينة من خلال مكتبات معينة.

أنواع الطلبات

أنواع الطلبات أو طرق طلب HTTP تميز الإجراء الذي سنقوم باتخاذه من خلال الإشارة إلى واجهة برمجة التطبيقات.

في المجموع، هناك أربعة أنواع رئيسية من الإجراءات:

  • GET: استرداد المعلومات (مثل نتائج البحث). هذا هو النوع الأكثر شيوعًا من الطلبات. باستخدامه، يمكننا الحصول على البيانات التي نهتم بها من تلك التي تكون واجهة برمجة التطبيقات جاهزة لمشاركتها.
  • POST: يضيف بيانات جديدة إلى الخادم. باستخدام هذا النوع من الطلبات، يمكنك، على سبيل المثال، إضافة عنصر جديد إلى مخزونك.
  • PUT: تغيير المعلومات الموجودة. على سبيل المثال، باستخدام هذا النوع من الطلبات، سيكون من الممكن تغيير لون أو قيمة منتج موجود.
  • DELETE: يحذف المعلومات الموجودة

المتطلبات الأساسية

لكي تبدأ العمل مع واجهة برمجة التطبيقات REST عبر بايثون، ستحتاج إلى توصيل مكتبة لإرسال طلبات HTTP.

يعتمد اختيار المكتبة على إصدار بايثون.

إذا كنت تعمل مع بايثون 3، فنوصيك بإيقاف الاختيار على requests الذي يعد المعيار الفعلي لإجراء طلبات HTTP في بايثون.

في هذا الدرس، سنستخدم بايثون 3.6 مع مكتبة requests. هكذا سيبدو تنفيذ طلب GET باستخدام requests:

import requests
response = requests.get('https://google.com/')
print(response)
>> <Response [200]>

يعيد Request استجابة، وهي كائن قوي لفحص نتائج الطلب. باستخدام الاستجابة، يمكنك فحص رؤوس ومحتويات الاستجابة، والحصول على قاموس يحتوي على بيانات من JSON في الاستجابة، وتحديد مدى نجاح وصولنا إلى الخادم من خلال رمز الاستجابة منه. في مثالنا، كان رمز الاستجابة 200، مما يعني أن الطلب كان ناجحًا. سندرس رموز الاستجابة وقيمها بمزيد من التفصيل.

رموز الحالة

يتم إرجاع رموز الحالة مع استجابة بعد كل مكالمة إلى الخادم. وهي تصف بإيجاز نتيجة المكالمة. يوجد عدد كبير من رموز الحالة، وسنقدم لك الرموز التي ستقابلها غالبًا:

  • 200 – OK. تم تنفيذ الطلب بنجاح. تعتمد الإجابة نفسها على الطريقة المستخدمة (GET، POST، إلخ) ومواصفات واجهة برمجة التطبيقات.
  • 204 – No Content. لقد نجح الخادم في معالجة الطلب ولم يرد أي محتوى.
  • 301 – Moved Permanently. يستجيب الخادم بأن الصفحة المطلوبة (نقطة النهاية) تم نقلها إلى عنوان آخر ويعيد التوجيه إلى هذا العنوان.
  • 400 – Bad Request. لا يمكن للخادم معالجة الطلب بسبب أخطاء جانب العميل (تنسيق الطلب غير الصحيح).
  • 401 – Unauthorized. يحدث هذا عندما تفشل عملية المصادقة، بسبب بيانات اعتماد غير صحيحة أو حتى غيابها.
  • 403 – Forbidden. تم رفض الوصول إلى المورد المحدد.
  • 404 – Not Found. لم يتم العثور على المورد المطلوب على الخادم.
  • 500 – Internal Server Error. يحدث عند حدوث خطأ غير معروف على الخادم.

تحتوي مكتبة request على العديد من الخصائص المفيدة للعمل مع أكواد الحالة. على سبيل المثال، يمكنك ببساطة عرض حالة كود الاستجابة من خلال الوصول إلى .status_code:

print(response.status_code)
>>> 200

هذا ليس كل شيء. يمكنك استخدام مثيل الاستجابة في تعبير شرطي. سيتم تقييمه على أنه صحيح إذا كان رمز الحالة بين 200 و400، وإلا فسيتم تقييمه على أنه خطأ.

if response:
  print('Request is successful.')
else:
  print('Request returned an error.')

نقاط النهاية

لكي تتمكن من العمل مع واجهات برمجة التطبيقات REST، من المهم فهم ما هي نقطة النهاية.

عادةً ما تكون نقطة النهاية عبارة عن عنوان محدد (على سبيل المثال، https://weather-in-london.com/forecast)، حيث يمكنك من خلال الإشارة إليه الوصول إلى ميزات/بيانات معينة (في حالتنا – توقعات الطقس في لندن). عادةً ما يتوافق اسم (عنوان) نقطة النهاية مع الوظيفة التي توفرها.

لمعرفة المزيد عن نقاط النهاية، سنلقي نظرة على مثال واجهة برمجة التطبيقات البسيطة ضمن خدمة RapidAPI. هذه الخدمة عبارة عن مركز واجهة برمجة التطبيقات يوفر القدرة على الوصول إلى آلاف واجهات برمجة التطبيقات المختلفة. ميزة أخرى لـ RapidAPI هي أنه يمكنك الوصول إلى نقاط النهاية واختبار عمل واجهة برمجة التطبيقات مباشرة في قسمها ضمن خدمة RapidAPI.

لنأخذ على سبيل المثال واجهة برمجة تطبيقات Dino Ipsum. تُستخدم هذه الواجهة لإنشاء أي كمية من نص Lorem Ipsum. وهي مفيدة عندما تقوم بإنشاء نموذج أولي أو اختبار واجهة تطبيقك وترغب في ملئها بأي محتوى عشوائي.

للعثور على قسم Dino Ipsum API، أدخل اسمه في مربع البحث في خدمة RapidAPI أو انتقل إلى فئة “أخرى” من قائمة “كل الفئات” وحدد هذه الواجهة البرمجية من القائمة. واجهة Dino Ipsum API من خلال RapidAPI مجانية، لذا يمكنك الحصول على قدر ما تريد من النص المؤقت.

بمجرد تحديد واجهة برمجة تطبيقات Dino Ipsum، فإن أول صفحة ستراها هي القسم الفرعي لنقاط نهاية واجهة برمجة التطبيقات. ويتضمن هذا القسم معظم المعلومات اللازمة للبدء. ويتضمن القسم الفرعي لنقاط نهاية واجهة برمجة التطبيقات التنقل وقائمة بنقاط النهاية (نقطة واحدة فقط لهذه الواجهة البرمجية) ووثائق نقطة النهاية المحددة حاليًا ومقتطفًا من التعليمات البرمجية (متوفر بثمانية لغات برمجة مختلفة) لمساعدتك في البدء في استخدام التعليمات البرمجية الخاصة بك.

سنفحص نقطة النهاية الوحيدة التي تمتلكها واجهة برمجة التطبيقات هذه – قائمة dinos، والتي تعيد قدرًا معينًا من نص العنصر النائب، اعتمادًا على المعلمات المدخلة. نظرًا لأننا نمارس في بايثون الآن، نريد الحصول على مقتطف بايثون واختباره في تطبيقنا. املأ المعلمات المطلوبة (format=text، words=10، paragraphs=1) وإليك مقتطفنا:

response = unirest.get("https://alexnormand-dino-ipsum.p.rapidapi.com/?format=text&words=10&paragraphs=1",
  headers={
    "X-RapidAPI-Host": "alexnormand-dino-ipsum.p.rapidapi.com",
    "X-RapidAPI-Key": "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

لاستخدامه مع بايثون 3.6، نحتاج إلى تغيير unirest إلى requests. لذا، نحصل على التطبيق التالي:

import requests

words = 30
paragraphs = 1
formats = 'text'

response = requests.get(f"https://alexnormand-dino-ipsum.p.rapidapi.com/?format={formats}&words={words}&paragraphs={paragraphs}",
 headers={
   "X-RapidAPI-Host": "alexnormand-dino-ipsum.p.rapidapi.com",
   "X-RapidAPI-Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 }
)

print(response.text)

سوف يقوم تطبيقنا باستدعاء نقطة النهاية، الموجودة على https://alexnormand-dino-ipsum.p.rapidapi.com/ وسوف يطبع لنا هذا النص المؤقت الجميل:

Craterosaurus Europasaurus Santanaraptor Dynamosaurus Pachyrhinosaurus Cardiodon Dakosaurus Kakuru Gracilisuchus Piveteausaurus.

الحصول على استجابة JSON من طلب API

غالبًا ما تعيد واجهة برمجة التطبيقات REST استجابة بتنسيق JSON لتسهيل المعالجة الإضافية. تحتوي مكتبة requests على التابع .json() ملائمة لهذه الحالة والتي تحول JSON إلى كائن Python.

ستساعدنا واجهة برمجة التطبيقات Dino Ipsum المألوفة بالفعل في اختبار هذه الوظيفة. يمكننا الحصول على JSON منها استجابةً لذلك إذا حددنا معلمة format = JSON عند الوصول إلى نقطة نهاية قائمة dinos.

import requests

params = {"words": 10, "paragraphs": 1, "format": "json"}

response = requests.get(f"https://alexnormand-dino-ipsum.p.rapidapi.com/", params=params,
 headers={
   "X-RapidAPI-Host": "alexnormand-dino-ipsum.p.rapidapi.com",
   "X-RapidAPI-Key": "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 }
)

print (type(response.json()))
print(response.json())
>>> <class 'list'>
>>> [['Olorotitan', 'Megadactylus', 'Atlantosaurus', 'Angolatitan', 'Sinosauropteryx', 'Camptonotus', 'Protarchaeopteryx', 'Unescoceratops', 'Shanag', 'Archaeoceratops']]

لاحظ أننا هذه المرة لم نحدد معلمات الاستعلام في عنوان URL، بل في وسيطة المعلمات الخاصة بدالة requests.get. ويُفضَّل استخدام تنسيق نقل المعلمات هذا بشكل أكبر.

كيفية البدء في استخدام واجهة برمجة التطبيقات مع بايثون

بعد أن تعاملنا مع الفروق الدقيقة في العمل مع API في بايثون، يمكننا إنشاء دليل خطوة بخطوة:

الحصول على مفتاح API

مفتاح API هو (عادةً) سلسلة فريدة من الحروف والأرقام. لبدء العمل مع معظم واجهات برمجة التطبيقات، يجب عليك التسجيل والحصول على مفتاح API. ستحتاج إلى إضافة مفتاح API إلى كل طلب حتى تتمكن واجهة برمجة التطبيقات من التعرف عليك. في مثال RapidAPI، يمكنك اختيار طريقة التسجيل التي تناسبك. يمكن أن يكون هذا اسم مستخدم وبريد إلكتروني وكلمة مرور: حساب Google أو Facebook أو Github.

اختبار نقاط نهاية واجهة برمجة التطبيقات باستخدام بايثون

بمجرد حصولنا على مفتاح API، يمكننا الرجوع إلى نقاط نهاية API (وفقًا للوثائق) للتحقق مما إذا كان كل شيء يعمل كما توقعنا. إذا عملنا مع RapidAPI فورًا بعد التسجيل في الخدمة، فيمكننا الانتقال إلى قسم API المطلوب، والاشتراك فيه إذا لزم الأمر، واختبار إجابات نقاط النهاية التي نحتاجها مباشرة على صفحة API. بعد ذلك، يمكننا إنشاء مقتطف بايثون ينفذ الدالة التي اختبرناها للتو والتحقق منها بسرعة باستخدام IPython أو ببساطة إدراجه في تطبيق بايثون الخاص بنا.

قم بإنشاء تطبيق بايثون الأول باستخدام واجهة برمجة التطبيقات

بعد التحقق من نقاط النهاية وعمل كل شيء كما توقعنا، يمكننا البدء في إنشاء التطبيق، بما في ذلك استدعاءات واجهة برمجة التطبيقات الضرورية. وكما ذكرنا بالفعل، سيساعدنا RapidAPI هنا. في صفحة واجهة برمجة التطبيقات التي نحتاجها، يمكننا استخدام كتلة مقتطف التعليمات البرمجية والحصول على مقتطف بايثون مع إمكانية الوصول إلى نقطة النهاية الضرورية. نحتاج فقط إلى تذكر أنه إذا استخدمنا بايثون 3، فيتعين علينا استبدال مكتبة unirest ب requests في كود المقتطف.

مثال على واجهة برمجة تطبيقات بايثون: تطبيق Earth View مع واجهة برمجة تطبيقات NASA

بفضل الميزات القوية التي تتمتع بها لغة البرمجة بايثون وإمكانية الوصول إلى مجموعة واسعة من واجهات برمجة التطبيقات، يمكننا القيام بأشياء رائعة، مثل استكشاف أعماق الفضاء أو النظر إلى الأرض من المدار. ولمثل هذه المهام، سنحتاج إلى واجهة برمجة تطبيقات NASA، والتي تتوفر من خلال RapidAPI.

الحصول على مفتاح API

إن واجهة برمجة تطبيقات ناسا مجانية، وفي الحالة الأساسية لا تتطلب اشتراكًا خاصًا. ومع ذلك، مع الاستخدام المكثف للواجهة، يجب عليك التسجيل للحصول على مفتاح مطور ناسا. لن نستخدمها بشكل مكثف، لذا فور التسجيل في خدمة RapidAPI، سنتلقى مفتاح خدمة وسيكون هذا كافيًا بالنسبة لنا. يمكنك التسجيل بالنقر فوق زر التسجيل في قائمة RapidAPI.

اختبار نقاط نهاية واجهة برمجة التطبيقات باستخدام بايثون

بعد التسجيل، انتقل إلى صفحة API الخاصة بـ NASA. أدخل اسمها في مربع البحث في خدمة RapidAPI أو انتقل إلى فئة “Science” من قائمة “All Categories” واختر API هذه من القائمة.

نحن مهتمون بنقطة النهاية getEPICEarthImagery، التي تقدم قائمة بأسماء صور الأرض التي التقطتها كاميرا EPIC التابعة لوكالة ناسا على متن مركبة الفضاء NOAA DSCOVR. بشكل افتراضي، تقدم أحدث الصور. إذا كنت ترغب في ذلك، يمكنك أيضًا تحديد تاريخ الصور في معلمة التاريخ. نحن بحاجة إلى صور حديثة، لذا فإن الشروط الافتراضية تناسبنا.

بمساعدة كتلة مقتطفات التعليمات البرمجية، نحصل على التعليمات البرمجية التي نحتاجها. ونظرًا لأننا نستخدم بايثون 3، فنحن بحاجة إلى استبدال مكتبة unirest في المقتطف ب requests. لذا، إليك المقتطف النهائي:

response = unirest.post("https://NasaAPIdimasV1.p.rapidapi.com/getEPICEarthImagery",
  headers={
    "X-RapidAPI-Host": "NasaAPIdimasV1.p.rapidapi.com",
    "X-RapidAPI-Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "Content-Type": "application/x-www-form-urlencoded"
  }
)

يعيد التابع response.json() قاموس بايثون يحتوي على قائمة بأسماء وخصائص الصور. ويبدو أن كل شيء يعمل بشكل جيد ويمكننا البدء في كتابة تطبيقنا.

بمساعدة البيانات المصاحبة لصور الأرض، يمكننا إنشاء تطبيق صغير خاص بنا سيقوم بإنشاء صورة متحركة للأرض استنادًا إلى أحدث الصور من وكالة ناسا.

سنحتاج إلى مكتبة skimage لتغيير حجم الصور، بالإضافة إلى مكتبة imageio لإنشاء ملف gif متحرك واحد بناءً على مجموعة مختارة من الصور. يمكننا تثبيتها باستخدام الأمر:

pip3 install scikit-image imageio

سنحتاج أيضًا إلى مكتبة regex لإنشاء متغيرات منفصلة تحتوي على معلومات حول السنة والشهر واليوم للصورة من سلسلة التاريخ الكاملة. سنحتاج إلى هذه المتغيرات لتشكيل عنوان URL لصورة الأرض بالتنسيق: https://epic.gsfc.nasa.gov/archive/natural/{year}/{month}/{day}/png/{image_name}.png .

ونتيجة لذلك نحصل على التطبيق التالي:

import requests
import re
import imageio
from skimage import transform,io

# get json with information (including name and date) about Earth pictures
response = requests.post("https://NasaAPIdimasV1.p.rapidapi.com/getEPICEarthImagery",
 headers={
   "X-RapidAPI-Host": "NasaAPIdimasV1.p.rapidapi.com",
   "X-RapidAPI-Key": "4xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
   "Content-Type": "application/x-www-form-urlencoded"
 }
)

# convert json to Python object 
data = response.json()

# create regex pattern to get separately year, month and day of an image
dates_pattern = r"^(?P<year>d{4})-(?P<month>d{2})-(?P<day>d{2})"

# download images and save each to ./images folder
for img in data['contextWrites']['to']:
   # get year, month and day with regex to create image url
   matches = re.search(dates_pattern, img['date'])
   year = matches.group('year')
   month = matches.group('month')
   day = matches.group('day')
   image_name = img['image']
   img_url = f'https://epic.gsfc.nasa.gov/archive/natural/{year}/{month}/{day}/png/{image_name}.png'
   # save image to ./images folder
   img_data = requests.get(img_url).content
   with open(f'images/{image_name}.png', 'wb') as handler:
       handler.write(img_data)

index = range(len(data['contextWrites']['to']))
images = []

# resize images and create gif from them
for i in index:
   img_name = data["contextWrites"]["to"][i]["image"]   
   img = io.imread(f'images/{img_name}.png')
   small_img = transform.resize(img, (500, 500), mode='symmetric', preserve_range=True)
   images.append(small_img)
imageio.mimsave('images/earth500.gif', images)

لقد حصلنا على هذه الصورة للأرض من المدار. وهي نقطة بداية جيدة لمزيد من استكشاف الفضاء.

في هذه المقالة، بدأنا باستخدام واجهة برمجة التطبيقات REST في بايثون وتتبعنا باستمرار جميع الخطوات اللازمة لإنشاء تطبيق بايثون يستخدم فرصًا غير محدودة تقريبًا لواجهات برمجة التطبيقات.


اكتشاف المزيد من بايثون العربي

اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

Scroll to Top

اكتشاف المزيد من بايثون العربي

اشترك الآن للاستمرار في القراءة والحصول على حق الوصول إلى الأرشيف الكامل.

Continue reading