Če berete ta članek, ste verjetno že seznanjeni z možnostmi, ki jih prinaša uporaba API-ja (Application Programming Interface).
Z dodajanjem enega od številnih odprtih API-jev vaši aplikaciji lahko razširite funkcionalnost aplikacije ali jo obogatite s potrebnimi podatki. Kaj pa, če ste razvili edinstveno funkcijo, ki jo želite deliti s skupnostjo?
Odgovor je preprost: potrebujete ustvarite svoj API.
Čeprav se to na prvi pogled morda zdi težka naloga, je pravzaprav preprosta. Pokazali vam bomo, kako to storite s Pythonom.
Kaj potrebujete za začetek
Za razvoj API-ja potrebujete:
Python 3;
Bučko — preprosto in za uporabo enostavno ogrodje za ustvarjanje spletnih aplikacij;
Flask-RESTful je razširitev za Flask, ki vam omogoča hitro in z minimalno konfiguracijo razviti REST API.
Namestitev izvedemo z ukazom:
pip install flask-restful
Za začetnike priporočamo brezplačen intenzivni tečaj programiranja: Razvoj Telegram bota v C# — 26.–28. avgusta. Brezplačen intenzivni tečaj, ki vam omogoča, da razumete, kako delujejo pomočniki, posebnosti dela z API-jem Telegram in druge nianse. Trije najboljši udeleženci bodo prejeli 30 rubljev od Skillboxa.
Da bi v celoti razumeli nalogo, poglejmo zgoraj omenjena izraza.
Kaj je REST?
REST API (Representational State Transfer) je API, ki za izmenjavo podatkov uporablja zahteve HTTP.
API-ji REST morajo izpolnjevati določena merila:
Arhitektura odjemalec-strežnik: odjemalec sodeluje z uporabniškim vmesnikom, strežnik pa z zaledjem in shrambo podatkov. Odjemalec in strežnik sta neodvisna, katerega koli od njiju je mogoče zamenjati ločeno od drugega.
Brez stanja – na strežniku niso shranjeni nobeni podatki o odjemalcih. Stanje seje je shranjeno na strani odjemalca.
Predpomnilnik – odjemalci lahko predpomnijo odzive strežnika za izboljšanje splošne zmogljivosti.
Kaj je CRUD?
DROBEN je koncept programiranja, ki opisuje štiri osnovna dejanja (ustvari, preberi, posodobi in izbriši).
V API-ju REST so vrste zahtev in metode zahtev odgovorne za dejanja, kot so objava, pridobivanje, dajanje, brisanje.
Zdaj, ko razumemo osnovne izraze, lahko začnemo ustvarjati API.
Razvoj
Ustvarimo skladišče citatov o umetni inteligenci. AI je danes ena najhitreje rastočih tehnologij in Python je priljubljeno orodje za delo z AI.
S tem API-jem lahko razvijalec Pythona hitro pridobi informacije o umetni inteligenci in se navdihne za nove dosežke. Če ima razvijalec dragocene misli o tej temi, jih bo lahko dodal v repozitorij.
Začnimo z uvozom potrebnih modulov in nastavitvijo Flaska:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
V tem izrezku so Flask, Api in Resource razredi, ki jih potrebujemo.
Reqparse je vmesnik za razčlenjevanje poizvedb Flask-RESTful ... Potrebovali boste tudi naključni modul za prikaz naključnega citata.
Zdaj bomo ustvarili repozitorij citatov o AI.
Vsak repo vnos bo vseboval:
digitalni ID;
ime avtorja citata;
kvota.
Ker je to le primer za usposabljanje, bomo vse vnose shranili na seznam Python. V resnični aplikaciji bi verjetno namesto tega uporabili bazo podatkov.
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."
}
]
Zdaj moramo ustvariti razred vira Quote, ki bo definiral delovanje naših končnih točk API-ja. Znotraj razreda morate deklarirati štiri metode: get, post, put, delete.
Začnimo z metodo GET
Omogoča pridobitev določenega predračuna z navedbo njegovega ID-ja ali naključnega predračuna, če ID ni naveden.
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
Metoda GET vrne naključni citat, če ID vsebuje privzeto vrednost, tj. pri klicu metode ni bil podan noben ID.
Če je naveden, potem metoda išče med citati in najde tistega, ki vsebuje navedeni ID. Če ni najdeno nič, se prikaže sporočilo »Citat ni bil najden, 404«.
Ne pozabite: metoda vrne status HTTP 200, če je zahteva uspešna, in 404, če zapis ni najden.
Zdaj pa ustvarimo metodo POST za dodajanje novega citata v repozitorij
Med tipkanjem bo dobil ID vsakega novega citata. Poleg tega bo POST uporabil reqparse za razčlenitev parametrov, ki bodo šli v telo zahteve (avtor in besedilo citata).
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
V zgornji kodi je metoda POST sprejela ID ponudbe. Nato je z uporabo reqparse iz poizvedbe pridobil avtorja in citat ter ju shranil v slovar params.
Če ponudba z navedenim ID-jem že obstaja, metoda prikaže ustrezno sporočilo in kodo 400.
Če navedba z navedenim ID-jem še ni bila ustvarjena, metoda ustvari nov zapis z navedenim ID-jem in avtorjem ter drugimi parametri. Nato doda vnos na seznam ai_quotes in vrne vnos z novim citatom skupaj s kodo 201.
Zdaj ustvarimo metodo PUT za spremembo obstoječe ponudbe v repozitoriju
Metoda PUT, podobno kot v prejšnjem primeru, vzame ID in vnos ter razčleni parametre ponudbe z uporabo reqparse.
Če navedba s podanim ID-jem obstaja, jo bo metoda posodobila z novimi parametri in nato izpisala posodobljeno navedbo s kodo 200. Če navedbe s podanim ID-jem še ni, bo ustvarjen nov zapis s kodo 201.
Nazadnje ustvarimo metodo DELETE za odstranitev citata, ki ni več navdihujoč
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
Ta metoda dobi ID ponudbe kot vhod in posodobi seznam ai_quotes s seznamom v skupni rabi.
Zdaj, ko smo ustvarili vse metode, moramo samo dodati vir v API, nastaviti pot in zagnati Flask.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
Naša storitev REST API je pripravljena!
Nato lahko kodo shranimo v datoteko app.py tako, da jo zaženemo v konzoli z ukazom:
python3 app.py
Če je vse v redu, bomo dobili nekaj takega:
* Način odpravljanja napak: vklopljen
*Teče naprej 127.0.0.1:5000/ (Pritisnite CTRL+C za izhod)
* Ponovni zagon s stat
* Razhroščevalnik je aktiven!
* PIN razhroščevalnika: XXXXXXX
Testiranje API-ja
Ko je API ustvarjen, ga je treba preizkusiti.
To lahko storite s pripomočkom konzole curl ali odjemalcem Insomnia REST ali z objavo API-ja na Rapid API.
Objavljanje našega API-ja
RapidAPI je največja svetovna tržnica z več kot 10 API-ji (in približno 000 milijonom razvijalcev).
RapidAPI ne zagotavlja le enotnega vmesnika za delo z API-ji tretjih oseb, temveč vam omogoča tudi hitro in enostavno objavo lastnega API-ja.
Da naredi, ga morate najprej objaviti na nekem strežniku v omrežju. V našem primeru bomo uporabili Heroku. Delo z njim ne bi smelo povzročati težav, (več o njem lahko izveste tukaj).
Kako objaviti svoj API na Heroku
1. Namestite Heroku.
Prvi korak je registracija in namestitev vmesnika ukazne vrstice Heroku (CLI). To deluje na Ubuntu 16+.
sudo snap install heroku —klasična
Nato se prijavite:
heroku prijava
2. Dodajte potrebne datoteke.
Zdaj moramo datoteke za objavo dodati v mapo v naši aplikaciji:
requirements.txt s seznamom zahtevanih modulov Python;
Procfile, ki določa, katere ukaze je treba izvesti za zagon aplikacije;
.gitignore - za izključitev datotek, ki niso potrebne na strežniku.
Datoteka requirements.txt bo vsebovala naslednje vrstice:
bučko
bučka-mirna
gunicorn
Upoštevajte, da smo na seznam dodali gunicorn (Python WSGI HTTP Server), ker moramo našo aplikacijo zagnati na strežniku.
Profil bo vseboval:
splet: gunicorn app:app
Vsebina .gitignore:
*.pyc
__pycache__/
Zdaj, ko so datoteke ustvarjene, inicializirajmo repo git in izdajmo:
git init
git add
git commit -m "First API commit"
3. Ustvarite novo aplikacijo Heroku.
heroku create
Glavno vejo potisnemo v oddaljeni repo Heroku:
git push heroku master
Zdaj lahko začnete tako, da odprete storitev API z ukazi:
Ko je vaša storitev API objavljena na Heroku, jo lahko dodate v Rapid API. Tukaj podrobno dokumentacijo na to temo.
1. Ustvarite račun RapidAPI.
Registrirajte brezplačen račun – to lahko storite s Facebookom, Googlom, GitHubom.
2. Dodajte API na nadzorno ploščo.
3. Nato vnesite splošne informacije o svojem API-ju.
4. Ko kliknete »Dodaj API«, se prikaže nova stran, kjer lahko vnesete informacije o našem API-ju.
5. Zdaj lahko ročno vnesete končne točke API ali prenesete swagger-datoteka z uporabo OpenAPI.
No, zdaj moramo nastaviti končne točke našega API-ja na strani Končne točke. V našem primeru končne točke ustrezajo konceptu CRUD (get, post, put, delete).
Nato morate ustvariti končno točko GET AI Quote, ki prikazuje naključno ponudbo (če je ID privzet) ali ponudbo za navedeni ID.
Če želite ustvariti končno točko, kliknite gumb »Ustvari končno točko«.
Ta postopek ponovimo za vse druge končne točke API-ja. To je vse! Čestitamo, objavili ste svoj API!
Če je vse v redu, bo stran API videti nekako takole:
Zaključek
V tem članku smo se naučili postopka ustvarjanja lastne storitve API RESTful v Pythonu, skupaj s postopkom objave API-ja v oblaku Heroku in njegovega dodajanja v imenik RapidAPI.
Toda testna različica je pokazala le osnovna načela razvoja API - nianse, kot so varnost, toleranca napak in razširljivost, niso bile upoštevane.
Pri razvoju pravega API-ja je treba vse to upoštevati.