
Nëse po e lexoni këtë artikull, ndoshta jeni të njohur tashmë me mundësitë që ofron përdorimi i API (Interface Programimi Aplikacionesh).
Duke shtuar në aplikacionin tuaj një nga shumë API të hapura, mund të zgjeroni funksionalitetin e këtij aplikacioni ose ta pasuroni atë me të dhëna të nevojshme. Por çfarë ndodh nëse keni zhvilluar një funksionalitet unik që dëshironi ta ndani me komunitetin?
Përgjigja është e thjeshtë: duhet .
Megjithatë, edhe pse kjo duket si një detyrë e vështirë në fillim, në fakt është mjaft e thjeshtë. Ne do t'ju tregojmë se si ta bëni këtë me Python.
ĂfarĂ« Ă«shtĂ« e nevojshme pĂ«r tĂ« filluar
Për zhvillimin e një API nevojiten:
- Python 3;
- â njĂ« framework i thjeshtĂ« dhe i lehtĂ« pĂ«r t'u pĂ«rdorur pĂ«r krijimin e aplikacioneve web;
- â njĂ« zgjatje pĂ«r Flask, e cila lejon zhvillimin e API REST shpejt dhe me njĂ« konfigurim minimal.
Instalimi bëhet me komandën:
pip install flask-restfulKemi përkrahur një intensivi falas në programim për fillestarët:
â 26â28 gusht. Intensivi falas, qĂ« ndihmon pĂ«r t'u njohur me mĂ«nyrĂ«n sesi funksionojnĂ« botĂ« tĂ« ndihmĂ«sit, nĂ« veçoritĂ« e punĂ«s me API tĂ« Telegramit dhe kĂ«ndvĂ«shtrime tĂ« tjera. Tre pjesĂ«marrĂ«sit mĂ« tĂ« mirĂ« do tĂ« marrin nga 30 000 rubla nga Skillbox..
Para se të filloni
Ne jemi duke planifikuar të zhvillojmë një API RESTful me .
Për të kuptuar plotësisht detyrën, le të shqyrtojmë dy terma të përmendur më sipër.
ĂfarĂ« Ă«shtĂ« REST?
REST API (Transferim i Gjendjes PĂ«rfaqĂ«suese) â Ă«shtĂ« njĂ« API qĂ« pĂ«rdor kĂ«rkesa HTTP pĂ«r shkĂ«mbimin e tĂ« dhĂ«nave.
REST API duhet të përmbushin disa kritere:
- Arkitektura klient-server: klienti nd interacts with the user interface while the server interacts with the backend and data storage. The client and server are independent, either can be replaced separately from the other.
- Stateless â asnjĂ« tĂ« dhĂ«nat e klientit nuk ruhen nĂ« server. Gjendja e sesionit ruhet nĂ« anĂ«n e klientit.
- Cacheability â klientĂ«t mund tĂ« ruajnĂ« pĂ«rgjigjet e serverit pĂ«r tĂ« pĂ«rmirĂ«suar performancĂ«n e pĂ«rgjithshme.
ĂfarĂ« Ă«shtĂ« CRUD?
CRUD â njĂ« koncept programimi qĂ« pĂ«rshkruan katĂ«r veprime themelore (krijo, lexoni, pĂ«rditĂ«soni dhe fshini).
Në API REST, llojet e kërkesave dhe metodat e kërkesave përgjigjen për veprime të tilla si post, merr, vendos, fshi.
Tani që kemi kuptuar terminologjinë e bazës, mund të fillojmë krijimin e API.
Zhvillimi
Le të krijojmë një depotë citatash për inteligjencën artificiale. IA është një nga teknologjitë që po zhvillohet më shpejt sot, dhe Python është një mjet popullor për punën me IA.
Me këtë API, zhvilluesi i Python-it do të jetë në gjendje të marrë shpejt informacion rreth IA-së dhe të frymëzohet nga arritjet e reja. Nëse zhvilluesi ka mendime të vlefshme mbi këtë temë, ai do të ketë mundësi t'i shtojë ato në depotë.
Le të fillojmë me importimin e moduleve të nevojshme dhe konfigurimin e Flask:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)Në këtë snippeti Flask, Api dhe Resource janë klasat që na nevojiten.
Reqparse është një ndërfaqe për analizimin e kërkesave në Flask-RESTful⊠Moduli random gjithashtu do të nevojitet për të shfaqur një citat të rastësishëm.
Tani do të krijojmë një depotë citatash për IA.
Ădo rekord i depotĂ« do tĂ« pĂ«rmbajĂ«:
- ID dixhital;
- emri i autorit të citatit;
- citin.
Duke qenë se kjo është vetëm një shembull për mësim, ne do t'i ruajmë të gjitha rekordet në një listë Python. Në një aplikacion real, gjithsesi, ne më shumë do të përdornim një bazë të dhënash.
ai_quotes = [
{
"id": 0,
"author": "Kevin Kelly",
"quote": "Planet biznes i 10,000 startupeve të ardhshëm janë të lehtë për t'u parashikuar: " +
"Merrni X dhe shtoni AI."
},
{
"id": 1,
"author": "Stephen Hawking",
"quote": "Zhvillimi i inteligjencës artificiale të plotë mund " +
"të shënojë fundit e racës njerëzore⊠" +
"Ajo do të ndjekë rrugën e saj, dhe do të ripërpunojë " +
"vetveten me një ritëm gjithnjë e në rritje. " +
"Njerëzit, të cilët janë të kufizuar nga evolucionin e ngadaltë biologjik, " +
"nuk do të mund të konkurrojnë, dhe do të zëvendësohen."
},
{
"id": 2,
"author": "Claude Shannon",
"quote": "E imagjinoj një kohë kur ne do të jemi për robotët atë që " +
"qentë janë për njerëzit, " +
"dhe unë jam në anën e makinave."
},
{
"id": 3,
"author": "Elon Musk",
"quote": "Përshpejtimi i përparimit në inteligjencën artificiale " +
"(nuk po i referohem AI të ngushtë) " +
"është jashtëzakonisht i shpejtë. Nëse nuk keni ekspozitë direkte " +
"me grupe si Deepmind, " +
"nuk keni ide se sa shpejt â po rritet " +
"me një ritëm të afërt me eksponencialin. " +
"Rreziku i diçkaje serioze të dëmshme " +
"duhet pritur brenda pesë viteve." +
"10 vite maksimumi."
},
{
"id": 4,
"author": "Geoffrey Hinton",
"quote": "Unë gjithmonë kam qenë i bindur se mënyra e vetme " +
"për të bërë që inteligjenca artificiale të funksionojë " +
"është të bëhet llogaritja në një mënyrë të ngjashme me trurin njerëzor. " +
"Ky është qëllimi që kam ndjekur. Po bëjmë përparim, " +
"ndonëse ende kemi shumë për të mësuar mbi " +
"se si funksionon në të vërtetë truri."
},
{
"id": 5,
"author": "Pedro Domingos",
"quote": "Njerëzit shqetësohen që kompjuterët do " +
"të bëhen shumë të zgjuar dhe do të marrin kontrollin e botës, " +
"por problemi i vërtetë është se ata janë shumë të budallenj " +
"dhe ata tashmë e kanë marrë kontrollin e botës."
},
{
"id": 6,
"author": "Alan Turing",
"quote": "Duket e mundshme që njëherë metoda e mendimit " +
"nga makina ka filluar, nuk do të marrë shumë kohë " +
"për të përshkuar fuqitë tona të dobëta⊠" +
"Ato do të jenë në gjendje të bisedojnë " +
"me njëra-tjetrën për të sharpen mendjet e tyre. " +
"Në një moment, prandaj, ne do " +
"të duhet të presim që makinat të marrin kontrollin."
},
{
"id": 7,
"author": "Ray Kurzweil",
"quote": "Inteligjenca artificiale do të arrijë " +
"niveli njerëzor diku rreth vitit 2029. " +
"Nëse e ndjekim më tej deri në vitin 2045, " +
"ne do të kemi shumëfishuar inteligjencën, " +
"inteligjencën biologjike të makinave njerëzore " +
"të civilizimit tonë një miliardfish."
},
{
"id": 8,
"author": "Sebastian Thrun",
"quote": "Askush nuk e shpreh atë në këtë mënyrë, por mendoj " +
"që inteligjenca artificiale " +
"Ă«shtĂ« pothuajse njĂ« disiplinĂ« humane. ĂshtĂ« vĂ«rtet njĂ« pĂ«rpjekje " +
"për të kuptuar inteligjencën njerëzore dhe njohjen njerëzore."
},
{
"id": 9,
"author": "Andrew Ng",
"quote": "Ne po bëjmë këtë analogji që AI është energjia e re." +
"Energjia transformoi industritë: bujqësia, " +
"transporti, komunikimi, prodhimi."
}
]Tani është koha për të krijuar një klasë burimi Quote, e cila do të përcaktojë operacionet e endpoint-eve të API-t tonë. Brenda klasës, duhen shpallur katër metoda: get, post, put, delete.
Le të fillojmë me metodën GET
Kjo ofron mundësinë për të marrë një citat të caktuar duke treguar ID-në e tij ose një citat të rastësishëm, nëse ID nuk është e specifikuar.
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 "Cita nuk u gjet", 404Metoda GET kthen një citat të rastësishëm, nëse ID ka vlerën default, dmth. kur metoda thirret, ID nuk është specifikuar.
NĂ«se ajo Ă«shtĂ« specifikuar, metoda kĂ«rkon nĂ«pĂ«r citate dhe gjen atĂ« qĂ« ka ID-nĂ« e kĂ«rkuar. NĂ«se nuk gjendet asgjĂ«, shfaqet mesazhi âCita nuk u gjet, 404â.
Kujtoni: metoda kthen statusin HTTP 200 në rast të një kërkese të suksesshme dhe 404 nëse regjistrimi nuk u gjet.
Tani le të krijojmë metodën POST për të shtuar një citat të ri në depo
Ajo do të marrë identifikuesin e çdo citati të ri gjatë hyrjes. Për më tepër, POST do të përdorë reqparse për të analizuar parametrat që do të vijnë në trupin e kërkesës (autori dhe teksti i citatit).
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"Cita me id {id} ekziston tashmë", 400
quote = {
"id": int(id),
"author": params["author"],
"quote": params["quote"]
}
ai_quotes.append(quote)
return quote, 201Në kodin më sipër, metoda POST mori ID-në e citatit. Më pas, duke përdorur reqparse, ajo mori autorin dhe citatin nga kërkesa, duke i ruajtur ato në një fjalor params.
Nëse citati me ID-në e specifikuar tashmë ekziston, metoda shfaq një mesazh përkatës dhe kodin 400.
Nëse citati me ID-në e specifikuar nuk është krijuar ende, metoda krijon një regjistrim të ri me ID-në, autorin, si dhe parametrat e tjerë. Pastaj e shton regjistrimin në listën ai_quotes dhe kthen regjistrimin me citatin e ri së bashku me kodin 201.
Tani krijojmë metodën PUT për të ndryshuar një citat ekzistues në depo
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, 201Metoda PUT, ashtu si në shembullin e mëparshëm, merr ID-në dhe inputin dhe analizon parametrat e citatës, duke përdorur reqparse.
Nëse citata me ID-në e caktuar ekziston, metoda do ta përditësojë atë me parametrat e rinj dhe më pas do të kthejë citatën e përditësuar me kodin 200. Nëse citata me ID-në e caktuar nuk ekziston ende, do të krijohet një regjistrim i ri me kodin 201.
Së fundmi, le të krijojmë një metodë DELETE për të fshirë citatën që nuk na frymëzon më.
def delete(self, id):
global ai_quotes
ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
return f"Citat me id {id} është fshirë.", 200Kjo metodë merr ID-në e citatës kur futet dhe përditëson listën ai_quotes, duke përdorur listën globale.
Tani që kemi krijuar të gjitha metodat, gjithë çfarë na mbetet është ta shtojmë burimin në API, të përcaktojmë rrugën dhe të nisim Flask.
api.add_resource(Quote, "\/ai-quotes", "\/ai-quotes\/", "\/ai-quotes\/<int:id>")
if __name__ == '__main__':
app.run(debug=True)Shërbimi ynë REST API është gati!
Më pas mund të ruajmë kodin në një skedar app.py, duke e nisur atë në konsolë përmes komandës:
python3 app.pyNëse gjithçka shkon mirë, do të marrim diçka të tillë:
* Modaliteti i debugging: aktiv
* Po ekzekutohet në :5000\/ (Shtypni CTRL+C për të dalë)
* Po restartohet me stat
* Debugger është aktiv!
* PIN-i i debugger-it: XXXXXXX
Testojmë API-në.
Pasi API-ja është krijuar, duhet ta testojmë atë.
Kjo mund të bëhet përmes utilitarit të konsolës curl ose klientit Insomnia REST ose duke publikuar API-në në Rapid API.

Publikojmë API-në tonë.
RapidAPI është tregu më i madh në botë me më shumë se 10,000 API (dhe rreth 1 milion zhvillues).
RapidAPI jo vetëm që ofron një ndërfaqe të vetme për të punuar me API-të e tjera, por gjithashtu jep mundësinë për ta publikuar API-në tuaj shpejt dhe pa probleme.
Për të , fillimisht duhet ta publikoni atë në ndonjë server në rrjet. Në rastin tonë do të përdorim . Puna me të nuk duhet të sjellë ndonjë vështirësi, ().
Si ta publikoni API-në tuaj në Heroku
1. Instaloni Heroku.
Së pari duhet të regjistroheni dhe të instaloni Heroku Command Line Interface (CLI). Kjo funksionon në Ubuntu 16+.
sudo snap install heroku âclassic
Pastaj, bëjmë login:
heroku login
2. Shtojmë skedarët e nevojshëm.
Tani duhet të shtoni skedarë për publikim në dosjen e aplikacionit tonë:
- requirements.txt me listën e moduleve të nevojshme Python;
- Procfile, i cili përcakton cilat komanda duhet të ekzekutohen për të nisur aplikacionin;
- .gitignore â pĂ«r tĂ« pĂ«rjashtuar skedarĂ«t qĂ« nuk nevojiten nĂ« server.
Skedari requirements.txt do të përmbajë rreshtat e mëposhtëm:
- flask
- flask-restful
- gunicorn
Ju lutemi, vini re se ne kemi shtuar gunicorn (Python WSGI HTTP Server) në listë, pasi duhet të fillojmë aplikacionin tonë në server.
Procfile do të përmbajë:
web: gunicorn app:app
Përmbajtja e .gitignore:
*.pyc
__pycache__/Tani, pas krijimit të skedave, le të inicializojmë repozitorin git dhe të bëjmë commit:
git init
git add
git commit -m "Commit-i i parë i API"3. Krijoni një aplikacion të ri në Heroku.
heroku createDërgojmë master branch në repozitorin e largët të Heroku:
git push heroku masterTani mund të filloni duke hapur shërbimin API përmes komandave:
heroku ps:scale web=1
heroku open
API do të jetë i disponueshëm në adresën .
Si ta shtoni API-në tuaj në tregun RapidAPI
Pas publikimit të shërbimit API në Heroku, mund ta shtoni atë në Rapid API. Këtu në lidhje me këtë temë.
1. Krijoni një llogari RapidAPI.
![]()
Regjistroni njĂ« llogari falas â mund ta bĂ«ni kĂ«tĂ« pĂ«rmes Facebook, Google, GitHub.

2. Shtoni API-në në panelin e kontrollit.

3. Më vonë, së pari futni informacionin e përgjithshëm për API-në tuaj.

4. Pas klikimit nĂ« âShto APIâ, shfaqet njĂ« faqe e re ku mund tĂ« vendosni informacionin pĂ«r API-nĂ« tonĂ«.

5. Tani mund të futni me dorë endpoint-et e API-it ose të ngarkoni me anë të OpenAPI.

Tani duhet të vendosim endpoint-et e API-së tonë në faqen e Endpoint-eve. Në rastin tonë, endpoint-et përputhen me konceptin CRUD (get, post, put, delete).

Më pas duhet të krijojmë një endpoint GET AI Quote, i cili kthen një citat të rastësishëm (nëse ID është default) ose një citat për ID-në e caktuar.
PĂ«r tĂ« krijuar njĂ« endpoint, duhet tĂ« klikoni butonin âKrijo Endpointâ.

Përsëritni këtë proces për të gjitha endpoint-et e tjera të API-së. Këtu është gjithçka! Urime, keni publikuar API-në tuaj!
Nëse gjithçka është në rregull, faqja e API-së do të duket kështu:

Përfundim
Në këtë artikull, ne shqyrtuam procesin e krijimit të një shërbimi RESTful API në Python, së bashku me procesin e publikimit të API-së në cloud-in Heroku dhe shtimin e tij në katalogun RapidAPI.
Por nĂ« versionin e provĂ«s u treguan vetĂ«m parimet bazĂ« tĂ« zhvillimit tĂ« API-sĂ« â aspekte si siguria, qĂ«ndrueshmĂ«ria dhe shkallĂ«zimi nuk u shqyrtuan.
Kur zhvilloni një API të vërtetë, gjithçka duhet të merret parasysh.
Burimi: habr.com
