
Nëse po e lexoni këtë artikull, ndoshta jeni tashmë të njohur me mundësitë që ofron përdorimi i API-t (Interface Programimi Aplikacionesh).
Duke shtuar në aplikacionin tuaj një nga shumë API-t e hapura, mund të zgjeroni funksionalitetin e këtij aplikacioni ose ta plotësoni atë me të dhënat e nevojshme. Por çfarë ndodh nëse keni krijuar një funksion unik që dëshironi ta ndani me komunitetin?
Përgjigjja është e thjeshtë: duhet .
Megjithëse në fillim duket si një detyrë e vështirë, në të vërtetë është mjaft e thjeshtë. Ne do t'ju tregojmë se si ta bëni këtë me Python.
ĂfarĂ« nevojitet pĂ«r tĂ« filluar?
Për zhvillimin e API-t, nevojiten:
- Python 3;
- â njĂ« framework i thjeshtĂ« dhe i lehtĂ« pĂ«r t'u pĂ«rdorur pĂ«r krijimin e aplikacioneve web;
- â njĂ« zgjerim pĂ«r Flask qĂ« mundĂ«son zhvillimin e shpejtĂ« tĂ« API-ve REST me konfigurim minimal.
Instalimi kryhet me komandën:
pip install flask-restfulNe rekomandojmë një intensiv falas për programim për fillestarët:
â 26â28 gusht. NjĂ« intensiv falas qĂ« ndihmon tĂ« kuptoni se si funksionojnĂ« botĂ«t ndihmĂ«s, karakteristikat e punĂ«s me API-nĂ« e Telegram dhe aspekte tĂ« tjera. Tre pjesĂ«marrĂ«sit mĂ« tĂ« mirĂ« do tĂ« marrin nga Skillbox 30,000 rubla..
Para se të filloni
Ne do të zhvillojmë një API RESTful me funksionalitet bazik .
Për të kuptuar plotësisht detyrën, le të shqyrtojmë dy terma të përmendur më sipër.
ĂfarĂ« Ă«shtĂ« REST?
REST API (Transferimi i Shtetit Reprezentativ) â Ă«shtĂ« njĂ« API qĂ« pĂ«rdor kĂ«rkesat HTTP pĂ«r tĂ« shkĂ«mbyer tĂ« dhĂ«na.
REST API duhet të përputhen me kritere të caktuara:
- Arkitektura klient-server: klienti ndĂ«rvepron me ndĂ«rfaqen e pĂ«rdoruesit, ndĂ«rsa serveri â me backend-in dhe ruajtjen e tĂ« dhĂ«nave. Klienti dhe serveri janĂ« tĂ« pavarur, secili prej tyre mund tĂ« zĂ«vendĂ«sohet ndaras nga tjetri.
- Stateless â asnjĂ« e dhĂ«nĂ« klienti nuk ruhet nĂ« server. Gjendja e sesionit ruhet nĂ« anĂ«n e klientit.
- KeshueshmĂ«ria â klientĂ«t mund tĂ« ruajnĂ« pĂ«rgjigjet e serverit pĂ«r tĂ« pĂ«rmirĂ«suar performancĂ«n e pĂ«rgjithshme.
ĂfarĂ« Ă«shtĂ« CRUD?
CRUD â Ă«shtĂ« njĂ« koncept programimi qĂ« pĂ«rshkruan katĂ«r veprime bazĂ« (krijo, lexoi, pĂ«rditĂ«so dhe fshij).
Në REST API, llojet e kërkesave dhe metodat e kërkesave përgjigjen për veprime si post, get, put, delete.
Tani që e kemi kuptuar terminologjinë bazë, mund të fillojmë me krijimin e API-t.
РазŃĐ°Đ±ĐŸŃĐșа
Le ta krijojmë një depo 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, një zhvillues Python do të jetë në gjendje të marrë shpejt informacion rreth IA dhe të frymëzohet nga arritjet e reja. Nëse një zhvillues ka mendime të vlefshme rreth kësaj teme, ai do të mund t'i shtojë ato në depo.
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ë snippet, Flask, Api dhe Resource janë klasat që na nevojiten.
Reqparse është një ndërfaqe për analizimin e kërkesave Flask-RESTful⊠Do t'i nevojitet gjithashtu moduli random për të shfaqur një citat të rastësishme.
Tani do të krijojmë depozitën e citatave për IA.
Ădo regjistrim nĂ« repo do tĂ« pĂ«rmbajĂ«:
- një ID numerike;
- emrin e autorit të citatës;
- citatin.
Duke qenë se ky është vetëm një shembull për mësim, ne do t'i ruajmë të gjithë regjistrimet në një listë Python. Në një aplikacion real, ne most të përdornim një bazë të dhënash për këtë.
ai_quotes = [
{
"id": 0,
"author": "Kevin Kelly",
"quote": "Planet e biznesit tĂ« 10,000 startueseve Ă«shtĂ« e 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ë " +
"nënkuptojë fundin e racës njerëzore... " +
"Ajo do të fillojë vetë dhe do të rindërtojë " +
"veten me një ritëm gjithnjë e në rritje. " +
"Njerëzit, të cilët janë të kufizuar nga evolucionet biologjike të ngadalta, " +
"nuk do të mund të konkurrojnë dhe do të zëvendësohen."
},
{
"id": 2,
"author": "Claude Shannon",
"quote": "Imagjinoj një kohë kur ne do të jemi për robotët atë që " +
"kanin janë për njerëzit, " +
"dhe unë jam duke mbështetur makinat."
},
{
"id": 3,
"author": "Elon Musk",
"quote": "Shpejtësia e përparimit në inteligjencën artificiale " +
"(nuk po flas për AI të ngushtë) " +
"është jashtëzakonisht e shpejtë. Nëse nuk keni ekspozim të drejtpërdrejtë " +
"në grupe si Deepmind, " +
"nuk keni asnjë ide se sa shpejt - po rritet " +
"me një ritëm afër eksponencial. " +
"Rreziku i diçkaje serioze që ndodh është në një periudhë pesëvjeçare." +
"10 vjet në maksimum."
},
{
"id": 4,
"author": "Geoffrey Hinton",
"quote": "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 atë të trurit njerëzor. " +
"Ky është qëllimi që kam ndjekur. Po bëjmë përparim, " +
"edhe pse kemi shumë për të mësuar " +
"rreth mënyrës se si funksionon në të vërtetë truri."
},
{
"id": 5,
"author": "Pedro Domingos",
"quote": "Njerëzit shqetësohen se kompjuterët do të " +
"bien shumë të mençur dhe do të marrin pushtetin e botës, " +
"por problemi i vërtetë është se ata janë shumë të marrë " +
"dhe ata tashmë e kanë marrë besimin e botës."
},
{
"id": 6,
"author": "Alan Turing",
"quote": "Duket e mundshme që sa herë që metoda e mendimit të makinave " +
"ka filluar, nuk do të duhej shumë kohë " +
"pĂ«r tâi tejkaluar fuqitĂ« tona tĂ« dobĂ«ta... " +
"Ata do të jenë në gjendje të bisedojnë " +
"me njëri-tjetrin për të sharpenizuar mençurinë e tyre. " +
"Prandaj, në një moment ne do " +
"të duhet të pranojmë se makinat do të marrin kontrollin."
},
{
"id": 7,
"author": "Ray Kurzweil",
"quote": "Inteligjenca artificiale do të arrijë " +
"nivele njerëzore rreth vitit 2029. " +
"Nëse e ndjekim atë më tej deri në, le të themi, 2045, " +
"ne do të kemi shumuar inteligjencën, " +
"inteligjencën biologjike njerzore " +
"të civilizimit tonë një miliard herë."
},
{
"id": 8,
"author": "Sebastian Thrun",
"quote": "Nuk e formulon askush këtë mënyrë, por mendoj " +
"se inteligjenca artificiale " +
"është pothuajse një disiplinë humanitare. Në të vërtetë është një përpjekje " +
"për të kuptuar inteligjencën dhe njohjen njerëzore."
},
{
"id": 9,
"author": "Andrew Ng",
"quote": "Ne jemi duke bërë këtë analogji që AI është energjia e re." +
"Energjia transformoi industrinë: bujqësinë, " +
"transportin, komunikimin, prodhimin."
}
]Tani duhet të krijojmë klasën burimore Quote, e cila do të përcaktojë operacionet e pikave të fundit të API tonë. Brenda klasës duhet të shpallim katër metoda: get, post, put, delete.
Le të fillojmë me metodën GET
Ajo ofron mundësinë për të marrë një citat të caktuar duke cituar ID-në e tij ose një citat të rastësishëm nëse ID-ja 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-ja ka vlerën e paracaktuar, dmth. kur kjo metodë është thirrur nuk është specifikuar ID.
NĂ«se Ă«shtĂ« specifikuar, metoda kĂ«rkon midis citateve dhe gjen atĂ« qĂ« ka ID-nĂ« e specifikuar. NĂ«se nuk gjendet asnjĂ« rezultat, shfaqet mesazhi âCita nuk u gjet, 404â.
Mbani mend: metoda kthen statusin HTTP 200 në rast të një kërkese të suksesshme dhe 404 nëse regjistrimi nuk gjendet.
Tani le të krijojmë metodën POST për të shtuar një citat të ri në repositor.
Ajo do të marrë identifikuesin e çdo citati të ri gjatë futurjes. 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 e mësipërm, metoda POST pranonte ID-në e citatit. Më pas, duke përdorur reqparse, mori autorin dhe citatin nga kërkesa, duke i ruajtur ato në fjalorin params.
Nëse citati me ID të specifikuar tashmë ekziston, metoda shfaq një mesazh përkatës dhe kode 400.
Nëse citati me ID të specifikuar nuk është krijuar ende, metoda krijon një regjistrim të ri me ID-në dhe autorin e specifikuar, si dhe parametrat e tjerë. Më pas, ajo 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ë repositor.
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 citatit duke përdorur reqparse.
Nëse ekziston një citat me ID-në e specifikuar, metoda do ta përditësojë atë me parametrat e rinj dhe më pas do të shfaqë citatin e përditësuar me kodin 200. Nëse citati me ID-në e specifikuar ende nuk ekziston, do të krijohet një regjistrim i ri me kodin 201.
Më në fund, le të krijojmë metodën DELETE për të fshirë citatin që nuk na frymëzon më.
def delete(self, id):
global ai_quotes
ai_quotes = [qoute për qoute në ai_quotes nëse qoute["id"] != id]
return f"Citat me id {id} është fshirë.", 200Kjo metodë merr ID-në e citatit gjatë hyrjes dhe përditëson listën e ai_quotes, duke përdorur listën globale.
Tani, kur kemi krijuar të gjitha metodat, gjithçka që na nevojitet është thjesht ta shtojmë burimin në API, të vendosim rrugën dhe ta 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, ne mund të ruajmë kodin në skedarin app.py, duke e ekzekutuar atë në konzol me komandën:
python3 app.pyNëse gjithçka shkon mirë, atëherë do të marim diçka të tillë:
* Mënyra e debug: aktive
* Duke punuar në :5000/ (Shtypni CTRL+C për të ndaluar)
* Rinisja me stat
* Debuggeri është aktiv!
* Debugger PIN: XXXXXXX
Testojmë API-në
Pasi të krijohet API, duhet të testohet.
Kjo mund të bëhet duke përdorur mjeti në konzol curl ose klientin Insomnia REST ose duke publikuar API-në në Rapid API.

Pubikojmë API-në tonë
RapidAPI është tregu më i madh në botë, me mbi 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 jashtme, por gjithashtu mundëson publikimin e shpejtë dhe të lehtë të API-së tuaj.
Për të , së pari duhet ta publikojmë atë në ndonjë server në rrjet. Në rastin tonë do të përdorim . Punimi me të nuk duhet të shkaktojë ndonjë vështirësi, ().
Si të 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ëni login:
heroku login
2. Shtoni skedarët e nevojshëm.
Tani duhet të shtoni skedarët për publikim në dosjen e aplikacionit tonë:
- requirements.txt me listën e moduleve të nevojshme Python;
- Procfile, i cili tregon se cilat komanda duhet të ekzekutohen për të nisur aplikacionin;
- .gitignore â pĂ«r tĂ« pĂ«rjashtuar skedarĂ«t qĂ« nuk janĂ« tĂ« nevojshĂ«m nĂ« server.
Skedari requirements.txt do të përmbajë këto rreshta:
- flask
- flask-restful
- gunicorn
Ju lutemi, vini re: kemi shtuar gunicorn (Python WSGI HTTP Server) në listë, pasi duhet ta nisim aplikacionin tonë në server.
Procfile do të përmbajë:
web: gunicorn app:app
Përmbajtja e .gitignore:
*.pyc
__pycache__/Tani, kur skedarët janë krijuar, le të inizializojmë repozitorin git dhe ta angazhojmë:
git init
git add
git commit -m "First API commit"3. Krijoni një aplikacion të ri në Heroku.
heroku createDërgoni master branch në repozitorin e largët Heroku:
git push heroku masterTani mund të filloni, duke hapur Shërbimin API me komandat:
heroku ps:scale web=1
heroku open
API do të jetë i aksesueshëm në adresën .
Si të shtoni Python API-në tuaj në tregun RapidAPI
Pasi shërbimi API të publikohet në Heroku, mund ta shtoni atë në Rapid API. Këtu në këtë temë.
1. Krijoni një llogari në RapidAPI.
![]()
Regjistrohuni pĂ«r njĂ« llogari falas â kjo mund tĂ« bĂ«het pĂ«rmes Facebook, Google, GitHub.

2. Shtoni API në panelin e kontrollit.

3. Më pas, plotësoni informacionin e përgjithshëm për API-në tuaj.

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

5. Tani mund ose ta shkruani manualisht endpoint-et e API-së, ose ta ngarkoni nëpërmjet OpenAPI.

Tani duhet të përcaktoni 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ë krijoni endpoint-in GET AI Quote, i cili nxjerr një citat të rastësishëm (në rast se ID është default) ose citatin për ID-në e specifikuar.
PĂ«r tĂ« krijuar endpoint-in duhet tĂ« shtypni butonin âKrijo Endpointâ.

Përsëritni këtë proces për të gjitha endpoint-et e tjera të API-së. Kjo është e gjitha! Urime, keni publikuar API-në tuaj!
Nëse gjithçka shkon mirë, faqja e API-së do të duket diçka e tillë:

Përfundimi
Në këtë artikull ne shqyrtuam procesin e krijimit të Shërbimit tonë RESTful API në Python, së bashku me procesin e publikimit të API-së në cloud Heroku dhe shtimin e tij në katalogun RapidAPI.
Por nĂ« variantin testues u shfaqĂ«n vetĂ«m parimet themelore tĂ« zhvillimit tĂ« API-sĂ« â detaje si siguria, qĂ«ndrueshmĂ«ria dhe shkallĂ«zueshmĂ«ria nuk u trajtuan.
Kur zhvilloni një API të vërtetë, të gjitha këto aspekte duhet të merren parasysh.
Burimi: habr.com
