API rakstÄ«Å”ana programmÄ Python (ar Flask un RapidAPI)
Ja lasÄt Å”o rakstu, iespÄjams, jau esat iepazinies ar iespÄjÄm, ko sniedz API (lietojumprogrammu saskarnes) izmantoÅ”ana.
Pievienojot savai lietojumprogrammai vienu no daudzajÄm atvÄrtajÄm API, varat paplaÅ”inÄt lietojumprogrammas funkcionalitÄti vai bagÄtinÄt to ar nepiecieÅ”amajiem datiem. Bet ko darÄ«t, ja esat izstrÄdÄjis unikÄlu funkciju, ko vÄlaties kopÄ«got ar kopienu?
Atbilde ir vienkÄrÅ”a: jums ir nepiecieÅ”ams izveidot savu API.
Lai gan sÄkumÄ tas var Ŕķist grÅ«ts uzdevums, patiesÄ«bÄ tas ir vienkÄrÅ”s. MÄs parÄdÄ«sim, kÄ to izdarÄ«t, izmantojot Python.
Kas jums ir nepiecieÅ”ams, lai sÄktu
Lai izstrÄdÄtu API, jums ir nepiecieÅ”ams:
Python 3;
Kolba ā vienkÄrÅ”s un Ärti lietojams ietvars tÄ«mekļa lietojumprogrammu izveidei;
Kolba-RESTful ir Flask paplaÅ”inÄjums, kas ļauj Ätri un ar minimÄlu konfigurÄciju izstrÄdÄt REST API.
InstalÄÅ”ana tiek veikta ar komandu:
pip install flask-restful
MÄs iesakÄm bezmaksas intensÄ«vo programmÄÅ”anas kursu iesÄcÄjiem: Telegram botu izstrÄde C# ā 26.ā28. augusts. Bezmaksas intensÄ«vais kurss, kas ļauj saprast, kÄ darbojas palÄ«gboti, darba specifika ar Telegram API un citas nianses. TrÄ«s labÄkie dalÄ«bnieki saÅems 30 000 rubļu no Skillbox.
Lai pilnÄ«bÄ izprastu uzdevumu, sapratÄ«sim divus iepriekÅ” minÄtos terminus.
Kas ir ATPÅŖTA?
REST API (Representational State Transfer) ir API, kas datu apmaiÅai izmanto HTTP pieprasÄ«jumus.
REST API ir jÄatbilst noteiktiem kritÄrijiem:
Klienta-servera arhitektÅ«ra: klients mijiedarbojas ar lietotÄja interfeisu, un serveris mijiedarbojas ar aizmugursistÄmu un datu krÄtuvi. Klients un serveris ir neatkarÄ«gi, jebkuru no tiem var nomainÄ«t atseviŔķi no otra.
Bezvalstnieks ā serverÄ« netiek glabÄti klienta dati. Sesijas stÄvoklis tiek saglabÄts klienta pusÄ.
KeÅ”atmiÅa ā klienti var keÅ”atmiÅÄ saglabÄt servera atbildes, lai uzlabotu vispÄrÄjo veiktspÄju.
Kas ir CRUD?
NeapstrÄdÄts ir programmÄÅ”anas koncepcija, kas apraksta Äetras pamata darbÄ«bas (izveidot, lasÄ«t, atjauninÄt un dzÄst).
ProgrammÄ REST API pieprasÄ«jumu veidi un pieprasÄ«jumu metodes ir atbildÄ«gi par tÄdÄm darbÄ«bÄm kÄ izlikÅ”ana, iegÅ«Å”ana, ievietoÅ”ana, dzÄÅ”ana.
Tagad, kad esam sapratuÅ”i pamatnosacÄ«jumus, varam sÄkt API izveidi.
Attīstība
Izveidosim citÄtu krÄtuvi par mÄkslÄ«go intelektu. AI mÅ«sdienÄs ir viena no visstraujÄk augoÅ”ajÄm tehnoloÄ£ijÄm, un Python ir populÄrs rÄ«ks darbam ar AI.
Izmantojot Å”o API, Python izstrÄdÄtÄjs var Ätri iegÅ«t informÄciju par AI un iedvesmoties no jauniem sasniegumiem. Ja izstrÄdÄtÄjam ir vÄrtÄ«gas domas par Å”o tÄmu, viÅÅ” varÄs tÄs pievienot krÄtuvei.
SÄksim ar nepiecieÅ”amo moduļu importÄÅ”anu un Flask iestatÄ«Å”anu:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
Å ajÄ fragmentÄ mums vajadzÄ«gÄs klases ir Flask, Api un Resource.
Reqparse ir Flask-RESTful vaicÄjumu parsÄÅ”anas interfeiss... Jums bÅ«s nepiecieÅ”ams arÄ« izlases modulis, lai parÄdÄ«tu nejauÅ”u citÄtu.
Tagad mÄs izveidosim citÄtu krÄtuvi par AI.
Katrs repo ieraksts satur:
digitÄlais ID;
citÄta autora vÄrds;
citÄts.
TÄ kÄ Å”is ir tikai apmÄcÄ«bas piemÄrs, mÄs visus ierakstus saglabÄsim Python sarakstÄ. ReÄlÄ lietojumprogrammÄ mÄs, iespÄjams, tÄ vietÄ izmantotu datu bÄzi.
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."
}
]
Tagad mums ir jÄizveido Quote resursu klase, kas definÄs mÅ«su API galapunktu darbÄ«bas. KlasÄ jums ir jÄdeklarÄ Äetras metodes: iegÅ«t, izlikt, ievietot, dzÄst.
SÄksim ar GET metodi
Tas dod iespÄju iegÅ«t konkrÄtu citÄtu, norÄdot tÄ ID, vai nejauÅ”u citÄtu, ja ID nav norÄdÄ«ts.
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 metode atgriež nejauÅ”u citÄtu, ja ID satur noklusÄjuma vÄrtÄ«bu, t.i. izsaucot metodi, netika norÄdÄ«ts ID.
Ja tas ir norÄdÄ«ts, metode meklÄ citÄtus un atrod to, kas satur norÄdÄ«to ID. Ja nekas netiek atrasts, tiek parÄdÄ«ts ziÅojums āCitÄts nav atrasts, 404ā.
Atcerieties: metode atgriež HTTP statusu 200, ja pieprasījums bija veiksmīgs, un 404, ja ieraksts netika atrasts.
Tagad izveidosim POST metodi, lai krÄtuvei pievienotu jaunu citÄtu
RakstÄ«Å”anas laikÄ tas saÅems katra jaunÄ citÄta ID. TurklÄt POST izmantos reqparse, lai parsÄtu parametrus, kas tiks iekļauti pieprasÄ«juma pamattekstÄ (autors un citÄta teksts).
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
IepriekÅ” minÄtajÄ kodÄ POST metode pieÅÄma piedÄvÄjuma ID. PÄc tam, izmantojot reqparse, tÄ izguva autoru un citÄtu no vaicÄjuma, saglabÄjot tos parametru vÄrdnÄ«cÄ.
Ja citÄts ar norÄdÄ«to ID jau pastÄv, metode parÄda atbilstoÅ”u ziÅojumu un kodu 400.
Ja citÄts ar norÄdÄ«to ID vÄl nav izveidots, metode izveido jaunu ierakstu ar norÄdÄ«to ID un autoru, kÄ arÄ« citiem parametriem. PÄc tam tas pievieno ierakstu ai_quotes sarakstam un atgriež ierakstu ar jauno citÄtu kopÄ ar kodu 201.
Tagad mÄs izveidojam PUT metodi, lai mainÄ«tu esoÅ”u citÄtu repozitorijÄ
PUT metode, lÄ«dzÄ«gi kÄ iepriekÅ”ÄjÄ piemÄrÄ, Åem ID un ievadi un parsÄ citÄtu parametrus, izmantojot reqparse.
Ja citÄts ar norÄdÄ«to ID pastÄv, metode to atjauninÄs ar jaunajiem parametriem un pÄc tam izvadÄ«s atjauninÄto citÄtu ar kodu 200. Ja vÄl nav citÄta ar norÄdÄ«to ID, tiks izveidots jauns ieraksts ar kodu 201.
Visbeidzot, izveidosim DELETE metodi, lai noÅemtu citÄtu, kas vairs nav iedvesmojoÅ”s
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
Å Ä« metode kÄ ievadi iegÅ«st citÄta ID un atjaunina ai_quotes sarakstu, izmantojot koplietoto sarakstu.
Tagad, kad esam izveidojuÅ”i visas metodes, viss, kas mums jÄdara, ir vienkÄrÅ”i jÄpievieno resurss API, jÄiestata ceļŔ un jÄpalaiž Flask.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
MÅ«su REST API pakalpojums ir gatavs!
TÄlÄk mÄs varam saglabÄt kodu failÄ app.py, palaižot to konsolÄ, izmantojot komandu:
python3 app.py
Ja viss ir labi, mÄs iegÅ«sim kaut ko lÄ«dzÄ«gu:
* AtkļūdoÅ”anas režīms: ieslÄgts
*Skrien tÄlÄk 127.0.0.1:5000/ (Lai izietu, nospiediet taustiÅu kombinÄciju CTRL+C)
* RestartÄÅ”ana ar stat
* AtkļūdotÄjs ir aktÄ«vs!
* AtkļūdotÄja PIN: XXXXXXX
API testÄÅ”ana
Kad API ir izveidota, tÄ ir jÄpÄrbauda.
To var izdarÄ«t, izmantojot curl konsoles utilÄ«tu vai Insomnia REST klientu, vai publicÄjot API Rapid API.
Notiek mÅ«su API publicÄÅ”ana
RapidAPI ir pasaulÄ lielÄkais tirgus ar vairÄk nekÄ 10 000 API (un aptuveni 1 miljonu izstrÄdÄtÄju).
RapidAPI ne tikai nodroÅ”ina vienotu saskarni darbam ar treÅ”o puÅ”u API, bet arÄ« sniedz iespÄju Ätri un vienkÄrÅ”i publicÄt savu API.
Kad jÅ«su API pakalpojums ir publicÄts Heroku, varat to pievienot Rapid API. Å eit detalizÄta dokumentÄcija par Å”o tÄmu.
1. Izveidojiet RapidAPI kontu.
ReÄ£istrÄjiet bezmaksas kontu ā to var izdarÄ«t, izmantojot Facebook, Google, GitHub.
2. Pievienojiet API vadības panelim.
3. PÄc tam ievadiet vispÄrÄ«gu informÄciju par savu API.
4. PÄc noklikŔķinÄÅ”anas uz āPievienot APIā tiek parÄdÄ«ta jauna lapa, kurÄ varat ievadÄ«t informÄciju par mÅ«su API.
5. Tagad varat manuÄli ievadÄ«t API galapunktus vai lejupielÄdÄt swagger-fails izmantojot OpenAPI.
Tagad mums ir jÄiestata mÅ«su API galapunkti lapÄ Endpoints. MÅ«su gadÄ«jumÄ galapunkti atbilst CRUD jÄdzienam (get, post, put, delete).
PÄc tam jums ir jÄizveido GET AI Quote galapunkts, kas parÄda nejauÅ”u citÄtu (ja ID ir noklusÄjuma) vai citÄtu norÄdÄ«tajam ID.
Lai izveidotu galapunktu, noklikŔķiniet uz pogas "Izveidot galapunktu".
MÄs atkÄrtojam Å”o procesu visiem citiem API galapunktiem. Tas ir viss! Apsveicam! JÅ«s esat publicÄjis savu API!
Ja viss ir kÄrtÄ«bÄ, API lapa izskatÄ«sies apmÄram Å”Ädi:
SecinÄjums
Å ajÄ rakstÄ mÄs uzzinÄjÄm, kÄ Python izveidot savu RESTful API pakalpojumu, kÄ arÄ« API publicÄÅ”anu Heroku mÄkonÄ« un pievienoÅ”anu RapidAPI direktorijam.
Bet testa versija parÄdÄ«ja tikai API izstrÄdes pamatprincipus ā netika Åemtas vÄrÄ tÄdas nianses kÄ droŔība, kļūdu tolerance un mÄrogojamÄ«ba.
IzstrÄdÄjot Ä«stu API, tas viss ir jÄÅem vÄrÄ.