
إذا كنت تقرأ هذه المقالة ، فربما تكون على دراية بالفعل بالاحتمالات التي تفتح باستخدام واجهة برمجة التطبيقات (API).
بإضافة إحدى واجهات برمجة التطبيقات المفتوحة العديدة إلى تطبيقك ، يمكنك توسيع وظائف هذا التطبيق أو إضافته بالبيانات اللازمة. ولكن ماذا لو قمت بتطوير ميزة فريدة تريد مشاركتها مع المجتمع؟
الجواب بسيط: تحتاج
إلى إنشاء واجهة برمجة التطبيقات الخاصة بك .
على الرغم من حقيقة أنه يبدو في البداية مهمة شاقة ، في الواقع ، كل شيء بسيط. سنعرض لك كيفية القيام بذلك مع بيثون.
ما تحتاجه للبدء
لتطوير API تحتاج:
- بيثون 3
- Flask - إطار بسيط وسهل الاستخدام لإنشاء تطبيقات الويب ؛
- Flask-RESTful هو امتداد لـ Flask الذي يسمح لك بتطوير واجهة برمجة تطبيقات REST بسرعة وبأقل قدر من التكوين.
يتم تنفيذ التثبيت بواسطة الأمر:
pip install flask-restful
برمجة مكثفة مجانية موصى بها للمبتدئين:
تطوير بوت Telegram في C # - 26-28 أغسطس. مكثف مجاني يتيح لك فهم كيفية عمل الروبوتات المساعدة ، في ميزات العمل مع Telegram API والفروق الدقيقة الأخرى. سيحصل أفضل ثلاثة مشاركين على 30000 روبل من Skillbox .
قبل أن تبدأنحن بصدد تطوير واجهة برمجة تطبيقات RESTful مع
وظائف CRUID الأساسية.
لفهم المشكلة تمامًا ، دعنا ننظر إلى المصطلحين المذكورين أعلاه.
ما هو الراحة؟واجهة برمجة تطبيقات REST (نقل الحالة التمثيلية) هي واجهة برمجة تطبيقات تستخدم طلبات HTTP لتبادل البيانات.
يجب أن تستوفي واجهات برمجة تطبيقات REST معايير معينة:
- بنية خادم العميل: يتفاعل العميل مع واجهة المستخدم ، ويتفاعل الخادم مع الواجهة الخلفية ومستودع البيانات. العميل والخادم مستقلان ، يمكن استبدال أي منهما بشكل منفصل عن الآخر.
- عديمي الجنسية - لا يتم تخزين بيانات العميل على الخادم. يتم تخزين حالة الجلسة على جانب العميل.
- إمكانية التخزين المؤقت - يمكن للعملاء تخزين استجابات الخادم مؤقتًا لتحسين الأداء الكلي.
ما هو الخام؟CRUD عبارة عن مفهوم برمجة يصف أربعة إجراءات أساسية (الإنشاء والقراءة والتحديث والحذف).
في واجهة برمجة تطبيقات REST ، تكون أنواع الطلبات وطرق الطلب مسؤولة عن إجراءات مثل النشر والوضع والحذف.
الآن وقد اكتشفنا المصطلحات الأساسية ، يمكنك البدء في إنشاء واجهة برمجة التطبيقات.
تصميم
دعونا إنشاء مستودع للاقتباسات حول الذكاء الاصطناعي. AI هي واحدة من أسرع التقنيات نمواً اليوم ، و Python هي أداة شائعة للعمل مع AI.
باستخدام واجهة برمجة التطبيقات هذه ، يمكن لمطوّر Python الحصول بسرعة على معلومات حول الذكاء الاصطناعى والاستلهام من التطورات الجديدة. إذا كان لدى المطور أفكار قيّمة حول هذا الموضوع ، فسيكون قادرًا على إضافتها إلى المستودع.
لنبدأ باستيراد الوحدات الضرورية وتكوين قارورة:
from flask import Flask from flask_restful import Api, Resource, reqparse import random app = Flask(__name__) api = Api(app)
في هذا المقتطف ، تعتبر Flask و Api و Resource هي الفئات التي نحتاجها.
Reqparse عبارة عن واجهة تحليل لطلب Flask-RESTful ... ستحتاج أيضًا إلى وحدة نمطية عشوائية لعرض اقتباس عشوائي.
الآن سنقوم بإنشاء مستودع اقتباسات AI.
سيحتوي كل إدخال الريبو:
- الهوية الرقمية
- اسم مؤلف الاقتباس ؛
- الاقتباس.
نظرًا لأن هذا مجرد مثال للتدريب ، فإننا سنوفر جميع الإدخالات في قائمة Python. في تطبيق حقيقي ، من المحتمل أن نستخدم قاعدة بيانات بدلاً من ذلك.
ai_quotes = [ { "id": 0, "author": "Kevin Kelly", "quote": "The business plans of the next 10,000 startups are easy to forecast: " + "Take X and add AI." }, { "id": 1, "author": "Stephen Hawking", "quote": "The development of full artificial intelligence could " + "spell the end of the human race… " + "It would take off on its own, and re-design " + "itself at an ever increasing rate. " + "Humans, who are limited by slow biological evolution, " + "couldn't compete, and would be superseded." }, { "id": 2, "author": "Claude Shannon", "quote": "I visualize a time when we will be to robots what " + "dogs are to humans, " + "and I'm rooting for the machines." }, { "id": 3, "author": "Elon Musk", "quote": "The pace of progress in artificial intelligence " + "(I'm not referring to narrow AI) " + "is incredibly fast. Unless you have direct " + "exposure to groups like Deepmind, " + "you have no idea how fast — it is growing " + "at a pace close to exponential. " + "The risk of something seriously dangerous " + "happening is in the five-year timeframe." + "10 years at most." }, { "id": 4, "author": "Geoffrey Hinton", "quote": "I have always been convinced that the only way " + "to get artificial intelligence to work " + "is to do the computation in a way similar to the human brain. " + "That is the goal I have been pursuing. We are making progress, " + "though we still have lots to learn about " + "how the brain actually works." }, { "id": 5, "author": "Pedro Domingos", "quote": "People worry that computers will " + "get too smart and take over the world, " + "but the real problem is that they're too stupid " + "and they've already taken over the world." }, { "id": 6, "author": "Alan Turing", "quote": "It seems probable that once the machine thinking " + "method had started, it would not take long " + "to outstrip our feeble powers… " + "They would be able to converse " + "with each other to sharpen their wits. " + "At some stage therefore, we should " + "have to expect the machines to take control." }, { "id": 7, "author": "Ray Kurzweil", "quote": "Artificial intelligence will reach " + "human levels by around 2029. " + "Follow that out further to, say, 2045, " + "we will have multiplied the intelligence, " + "the human biological machine intelligence " + "of our civilization a billion-fold." }, { "id": 8, "author": "Sebastian Thrun", "quote": "Nobody phrases it this way, but I think " + "that artificial intelligence " + "is almost a humanities discipline. It's really an attempt " + "to understand human intelligence and human cognition." }, { "id": 9, "author": "Andrew Ng", "quote": "We're making this analogy that AI is the new electricity." + "Electricity transformed industries: agriculture, " + "transportation, communication, manufacturing." } ]
نحتاج الآن إلى إنشاء اقتباس مورد فئة ، والذي سيحدد عمليات نقاط النهاية لواجهة برمجة التطبيقات. يجب الإعلان عن أربع طرق داخل الفصل: get ، post ، put ، delete.
لنبدأ مع طريقة GET.يجعل من الممكن الحصول على عرض أسعار محدد عن طريق تحديد المعرف الخاص به أو عرض أسعار عشوائي إذا لم يتم تحديد المعرف.
class Quote(Resource): def get(self, id=0): if id == 0: return random.choice(ai_quotes), 200 for quote in ai_quotes: if(quote["id"] == id): return quote, 200 return "Quote not found", 404
تُرجع طريقة GET اقتباسًا عشوائيًا إذا كان المعرف يحتوي على قيمة افتراضية ، أي عند استدعاء الأسلوب ، لم يتم تعيين معرف.
إذا تم تحديده ، فتبحث الطريقة بين علامات الاقتباس وتجد واحدة تحتوي على المعرف المحدد. إذا لم يتم العثور على شيء ، فسيتم عرض الرسالة "اقتباس غير موجود ، 404".
تذكر: تُرجع الطريقة حالة HTTP تبلغ 200 إذا كان الطلب ناجحًا و 404 إذا لم يتم العثور على السجل.
لنقم الآن بإنشاء طريقة POST لإضافة عرض أسعار جديد إلى المستودع
سوف تتلقى معرف كل اقتباس جديد أثناء الكتابة. بالإضافة إلى ذلك ، سيستخدم POST reqparse لتحليل المعلمات التي سيتم إدخالها في نص الطلب (نص المؤلف والاقتباس).
def post(self, id): parser = reqparse.RequestParser() parser.add_argument("author") parser.add_argument("quote") params = parser.parse_args() for quote in ai_quotes: if(id == quote["id"]): return f"Quote with id {id} already exists", 400 quote = { "id": int(id), "author": params["author"], "quote": params["quote"] } ai_quotes.append(quote) return quote, 201
في الكود أعلاه ، قبلت طريقة POST معرف التسعير. ثم ، باستخدام reqparse ، حصل على المؤلف واقتباس من الاستعلام ، حيث قام بتخزينها في قاموس params.
في حالة وجود عرض أسعار بالمعرف المحدد بالفعل ، فإن الطريقة تعرض الرسالة المقابلة والرمز 400.
إذا لم يتم إنشاء عرض أسعار بالمعرف المحدد ، فتنشئ الطريقة سجلًا جديدًا بالمعرّف والمؤلف المحددين ، وكذلك معلمات أخرى. ثم يضيف إدخالًا إلى قائمة ai_quotes ويعيد إدخالًا مع عرض أسعار جديد مع الرمز 201.
الآن قم بإنشاء طريقة PUT لتعديل عرض أسعار موجود في المستودع.
def put(self, id): parser = reqparse.RequestParser() parser.add_argument("author") parser.add_argument("quote") params = parser.parse_args() for quote in ai_quotes: if(id == quote["id"]): quote["author"] = params["author"] quote["quote"] = params["quote"] return quote, 200 quote = { "id": id, "author": params["author"], "quote": params["quote"] } ai_quotes.append(quote) return quote, 201
أسلوب PUT ، على غرار المثال السابق ، يأخذ المعرّف والإدخال ويوزع معلمات الاقتباس باستخدام reqparse.
في حالة وجود عرض أسعار باستخدام المعرف المحدد ، ستقوم الطريقة بتحديثه بمعلمات جديدة ثم يتم عرض عرض أسعار محدث بالكود 200. إذا لم يكن هناك اقتباس مع المعرف المحدد ، سيتم إنشاء سجل جديد بالرمز 201.
أخيرًا ، دعنا ننشئ طريقة DELETE لإزالة عرض أسعار لم يعد ملهمًا.
def delete(self, id): global ai_quotes ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id] return f"Quote with id {id} is deleted.", 200
تحصل هذه الطريقة على معرّف الاقتباس أثناء الكتابة وتحديث قائمة ai_quotes باستخدام قائمة شائعة.
الآن بعد أن أنشأنا جميع الأساليب ، كل ما نحتاج إلى القيام به هو مجرد إضافة المورد إلى API ، وتحديد المسار وتشغيل Flask.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>") if __name__ == '__main__': app.run(debug=True)
خدمة REST API الخاصة بنا جاهزة!
بعد ذلك ، يمكننا حفظ الكود في ملف app.py عن طريق تشغيله في وحدة التحكم باستخدام الأمر:
python3 app.py
إذا كان كل شيء على ما يرام ، فسنحصل على شيء مثل هذا:
* وضع التصحيح: على
* يعمل على 127.0.0.1 : 5000 / (اضغط CTRL + C لإنهاء)
* إعادة التشغيل مع القانون الأساسي
* المصحح نشط!
* PIN المصحح: XXXXXXXاختبار APIبعد إنشاء واجهة برمجة التطبيقات ، يجب اختبارها.
يمكن القيام بذلك باستخدام الأداة المساعدة لوحدة التحكم curl أو عميل Insomnia REST أو عن طريق نشر API إلى Rapid API.
نشر API لديناRapidAPI هو أكبر سوق في العالم مع أكثر من 10000 من واجهات برمجة التطبيقات (ونحو مليون مطور).
لا يوفر RapidAPI واجهة واحدة فقط للعمل مع واجهات برمجة التطبيقات لجهة خارجية ، بل يمنحك أيضًا القدرة على نشر واجهة برمجة التطبيقات الخاصة بك بسرعة وسهولة.
للقيام بذلك ، تحتاج أولاً إلى نشره على بعض الخوادم على الشبكة. في حالتنا ، سوف نستخدم
Heroku . العمل معه يجب ألا يسبب أي صعوبات (
يمكنك معرفة المزيد عنه هنا ).
كيفية نشر API الخاص بك على Heroku1. تثبيت Heroku.الخطوة الأولى هي تسجيل وتثبيت واجهة سطر أوامر Heroku (CLI). هذا يعمل على أوبونتو 16+.
سودو المفاجئة تثبيت heroku - الكلاسيكيةثم تسجيل الدخول:
تسجيل الدخول heroku2. إضافة الملفات اللازمة.نحتاج الآن إلى إضافة الملفات للنشر إلى المجلد في تطبيقنا:
- requirements.txt مع قائمة وحدات بيثون المطلوبة ؛
- Procfile ، الذي يشير إلى الأوامر التي يجب تنفيذها لتشغيل التطبيق ؛
- .gitignore - لاستبعاد الملفات غير الضرورية على الخادم.
سوف يحتوي ملف requirements.txt على الأسطر التالية:
- قارورة
- قارورة مريحة
- gunicorn
يرجى ملاحظة: لقد أضفنا gunicorn (Python WSGI HTTP Server) إلى القائمة ، حيث نحتاج إلى تشغيل تطبيقنا على الخادم.
سوف يحتوي Procfile على:
الويب: gunicorn التطبيق: التطبيقمحتوى .gitignore:
*.pyc __pycache__/
الآن وبعد إنشاء الملفات ، فلنستعد git repo ونلتزم:
git init git add git commit -m "First API commit"
3. إنشاء تطبيق Heroku جديد. heroku create
نرسل الفرع الرئيسي إلى Heroku repo البعيد:
git push heroku master
يمكنك الآن البدء بفتح خدمة API باستخدام الأوامر:
heroku ps:scale web=1 heroku open
ستكون واجهة برمجة التطبيقات متاحة في
your-random-heroku-name.herokuapp.com/ai-quotes .
كيفية إضافة API Python الخاص بك إلى سوق RapidAPIبعد نشر خدمة API على Heroku ، يمكنك إضافتها إلى Rapid API. فيما يلي
الوثائق المفصلة حول هذا الموضوع.
1. إنشاء حساب RapidAPI.
تسجيل حساب مجاني - يمكن القيام بذلك باستخدام Facebook و Google و GitHub.
2. أضف API إلى لوحة التحكم.
3. بعد ذلك ، أدخل معلومات عامة حول API الخاص بك.
4. بعد النقر على "Add API" ، تظهر صفحة جديدة حيث يمكنك إدخال معلومات حول API الخاصة بنا.
5. يمكنك الآن إما إدخال نقاط نهاية واجهة برمجة التطبيقات يدويًا ، أو تنزيل ملف swagger باستخدام OpenAPI.
حسنًا ، نحتاج الآن إلى تعيين نقاط النهاية لواجهة برمجة التطبيقات على صفحة نقاط النهاية. في حالتنا ، تتوافق نقاط النهاية مع مفهوم CRUD (الحصول على ، نشر ، وضع ، حذف).

بعد ذلك ، ستحتاج إلى إنشاء نقطة نهاية GET AI Quote ، والتي تعرض اقتباسًا عشوائيًا (في حال كان المعرف افتراضيًا) أو اقتباس للمعرف المحدد.
لإنشاء نقطة نهاية ، انقر فوق الزر "إنشاء نقطة نهاية".

كرر هذه العملية لجميع نقاط النهاية API الأخرى. هذا كل شئ! مبروك ، لقد نشرت API الخاص بك!
إذا كان كل شيء على ما يرام ، فإن صفحة واجهة برمجة التطبيقات ستبدو كما يلي:

استنتاج
في هذه المقالة ، استكشفنا عملية إنشاء خدمة RESTful API الخاصة بك في Python ، إلى جانب عملية نشر API إلى سحابة Heroku وإضافتها إلى دليل RapidAPI.
ولكن في إصدار الاختبار ، تم عرض المبادئ الأساسية لتطوير واجهة برمجة التطبيقات - لم يتم النظر في الفروق الدقيقة مثل الأمان والتسامح مع الخطأ وقابلية التوسع.
عند تطوير واجهة برمجة تطبيقات حقيقية ، كل هذا يجب أن يؤخذ في الاعتبار.