Jekk qed taqra dan l-artikolu, probabilment int diġà familjari mal-possibbiltajiet li jiġu mal-użu ta' API (Application Programming Interface).
Billi żżid waħda mill-ħafna APIs miftuħa mal-applikazzjoni tiegħek, tista' testendi l-funzjonalità tal-applikazzjoni jew tarrikkixxiha bid-dejta meħtieġa. Imma x'jiġri jekk tiżviluppa karatteristika unika li trid taqsam mal-komunità?
It-tweġiba hija sempliċi: għandek bżonn oħloq l-API tiegħek stess.
Għalkemm dan jista 'jidher biċċa xogħol diffiċli għall-ewwel, fil-fatt huwa sempliċi. Aħna ser nuruk kif tagħmel dan billi tuża Python.
Dak li għandek bżonn biex tibda
Biex tiżviluppa API għandek bżonn:
Python 3;
Garafina — qafas sempliċi u faċli biex jintuża għall-ħolqien ta' applikazzjonijiet tal-web;
Flixkun-MIĦID hija estensjoni għal Flask li tippermettilek tiżviluppa REST API malajr u b'konfigurazzjoni minima.
L-installazzjoni ssir bil-kmand:
pip install flask-restful
Nirrakkomandaw kors ta' programmar intensiv b'xejn għal dawk li jibdew: Żvilupp tal-bot tat-telegramma f'C# — 26–28 ta’ Awwissu. Kors intensiv b'xejn li jippermettilek tifhem kif jaħdmu l-assistenti tal-bots, l-ispeċifiċitajiet ta 'ħidma mal-API Telegram u sfumaturi oħra. L-aħjar tliet parteċipanti se jirċievu 30 rublu minn Skillbox.
Biex tifhem bis-sħiħ il-kompitu, ejja nifhmu ż-żewġ termini msemmija hawn fuq.
X'inhu REST?
REST API (Representational State Transfer) hija API li tuża talbiet HTTP biex tiskambja dejta.
L-API REST għandhom jissodisfaw ċerti kriterji:
Arkitettura klijent-server: Il-klijent jinteraġixxi mal-interface tal-utent, u s-server jinteraġixxi mal-backend u l-ħażna tad-dejta. Il-klijent u s-server huma indipendenti, kwalunkwe wieħed minnhom jista 'jiġi sostitwit separatament mill-ieħor.
Apolid - l-ebda data tal-klijent ma hija maħżuna fuq is-server. L-istat tas-sessjoni huwa maħżun fuq in-naħa tal-klijent.
Cacheability - Il-klijenti jistgħu jaħżnu r-risponsi tas-server biex itejbu l-prestazzjoni ġenerali.
X'inhu CRUD?
MHUX RAFFINAT huwa kunċett ta' programmazzjoni li jiddeskrivi erba' azzjonijiet bażiċi (toħloq, aqra, aġġorna u ħassar).
Fl-API REST, it-tipi ta 'rikjesti u l-metodi ta' rikjesta huma responsabbli għal azzjonijiet bħal post, ġib, poġġi, ħassar.
Issa li nifhmu t-termini bażiċi, nistgħu nibdew noħolqu l-API.
Żvilupp
Ejja noħolqu repożitorju ta' kwotazzjonijiet dwar intelliġenza artifiċjali. L-AI hija waħda mit-teknoloġiji li qed jikbru b'rata mgħaġġla llum, u Python hija għodda popolari biex taħdem mal-AI.
B'din l-API, żviluppatur Python jista' malajr jikseb informazzjoni dwar l-AI u jiġi ispirat minn avvanzi ġodda. Jekk żviluppatur ikollu ħsibijiet siewja dwar dan is-suġġett, ikun jista 'jżidhom mar-repożitorju.
Ejja nibdew billi timporta l-moduli meħtieġa u nwaqqaf Flask:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
F'dan is-snippet, Flask, Api u Resource huma l-klassijiet li neħtieġu.
Reqparse huwa interface għall-analiżi tal-mistoqsijiet Flask-RESTful... Ikollok bżonn ukoll modulu każwali biex turi kwotazzjoni każwali.
Issa se noħolqu repożitorju ta' kwotazzjonijiet dwar l-AI.
Kull entrata repo se jkun fiha:
ID diġitali;
isem l-awtur tal-kwotazzjoni;
kwotazzjoni.
Peress li dan huwa biss eżempju ta 'taħriġ, aħna se naħżnu l-entrati kollha f'lista Python. F'applikazzjoni reali, x'aktarx nużaw database minflok.
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."
}
]
Issa rridu noħolqu klassi tar-riżorsi Quote li tiddefinixxi l-operazzjonijiet tal-endpoints tal-API tagħna. Ġewwa l-klassi trid tiddikjara erba' metodi: tikseb, poġġi, tpoġġi, tħassar.
Nibdew bil-metodu GET
Jagħmilha possibbli li tinkiseb kwotazzjoni speċifika billi tispeċifika l-ID tagħha, jew kwotazzjoni każwali jekk l-ID ma tkunx speċifikata.
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
Il-metodu GET jirritorna kwotazzjoni każwali jekk l-ID ikun fih il-valur default, i.e. l-ebda ID ma ġiet speċifikata meta sejjaħ il-metodu.
Jekk ikun speċifikat, allura l-metodu jfittex fost iċ-ċitazzjonijiet u jsib dak li fih l-ID speċifikat. Jekk ma jinstab xejn, jintwera l-messaġġ "Kwotazzjoni mhux misjuba, 404".
Ftakar: il-metodu jirritorna status HTTP ta '200 jekk it-talba kienet ta' suċċess u 404 jekk ir-rekord ma nstabx.
Issa ejja noħolqu metodu POST biex iżżid kwotazzjoni ġdida mar-repożitorju
Se tikseb l-ID ta 'kull kwotazzjoni ġdida kif ittajpja. Barra minn hekk, POST se juża reqparse biex janalizza l-parametri li se jmorru fil-korp tat-talba (awtur u kwotazzjoni tat-test).
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
Fil-kodiċi ta 'hawn fuq, il-metodu POST aċċetta l-ID tal-kwotazzjoni. Imbagħad, bl-użu ta 'reqparse, irkuprat l-awtur u ċ-ċitazzjoni mill-mistoqsija, u ħażenhom fid-dizzjunarju params.
Jekk kwotazzjoni bl-ID speċifikata diġà teżisti, il-metodu juri messaġġ korrispondenti u kodiċi 400.
Jekk ċitazzjoni bl-ID speċifikata għadha ma nħolqotx, il-metodu joħloq rekord ġdid bl-ID u l-awtur speċifikati, kif ukoll parametri oħra. Imbagħad iżid id-dħul mal-lista ai_quotes u jirritorna l-entrata bil-kwotazzjoni l-ġdida flimkien ma 'kodiċi 201.
Issa noħolqu metodu PUT biex nibdlu kwotazzjoni eżistenti fir-repożitorju
Il-metodu PUT, simili għall-eżempju preċedenti, jieħu ID u input u janalizza l-parametri tal-kwotazzjoni billi juża reqparse.
Jekk teżisti ċitazzjoni bl-ID speċifikata, il-metodu jaġġornaha bil-parametri l-ġodda u mbagħad joħroġ iċ-ċitazzjoni aġġornata bil-kodiċi 200. Jekk għad m'hemmx ċitazzjoni bl-ID speċifikata, jinħoloq rekord ġdid bil-kodiċi 201.
Fl-aħħarnett, ejja noħolqu metodu DELETE biex tneħħi kwotazzjoni li m'għadhiex tispira
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
Dan il-metodu jikseb l-ID tal-kwotazzjoni bħala input u jaġġorna l-lista ai_quotes billi juża l-lista kondiviża.
Issa li ħloqna l-metodi kollha, kull ma rridu nagħmlu huwa sempliċiment inżidu riżors mal-API, issettja t-triq, u nħaddem Flask.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
Is-Servizz tal-API REST tagħna huwa lest!
Sussegwentement, nistgħu nsalvaw il-kodiċi fil-fajl app.py billi nħaddmu fil-console billi tuża l-kmand:
python3 app.py
Jekk kollox huwa tajjeb, allura nieħdu xi ħaġa bħal din:
* Modalità debug: mixgħula
* Jiġri fuq 127.0.0.1:5000/ (Agħfas CTRL+C biex tieqaf)
* Tibda mill-ġdid bl-istat
* Debugger huwa attiv!
* PIN tad-debugger: XXXXXXX
Ittestjar tal-API
Ladarba tinħoloq l-API, jeħtieġ li tiġi ttestjata.
Dan jista 'jsir billi tuża l-utilità curl console jew il-klijent Insomnia REST, jew billi tippubblika l-API fuq Rapid API.
Il-pubblikazzjoni tal-API tagħna
RapidAPI huwa l-akbar suq fid-dinja b'aktar minn 10 API (u madwar miljun żviluppatur).
RapidAPI mhux biss jipprovdi interface wieħed biex taħdem ma 'APIs ta' partijiet terzi, iżda wkoll jagħtik il-ħila li tippubblika malajr u faċilment l-API tiegħek stess.
Ladarba s-servizz API tiegħek jiġi ppubblikat fuq Heroku, tista 'żżidha mal-API Rapida. Hawn dokumentazzjoni dettaljata fuq dan is-suġġett.
1. Oħloq kont RapidAPI.
Irreġistra kont b'xejn - dan jista 'jsir billi tuża Facebook, Google, GitHub.
2. Żid l-API mal-pannell tal-kontroll.
3. Sussegwentement, daħħal informazzjoni ġenerali dwar l-API tiegħek.
4. Wara li tikklikkja "Żid API" tidher paġna ġdida fejn tista' ddaħħal informazzjoni dwar l-API tagħna.
5. Issa tista 'jew iddaħħal manwalment l-endpoints tal-API jew tniżżel swagger-fajl bl-użu ta' OpenAPI.
Ukoll, issa għandna bżonn nissettjaw l-endpoints tal-API tagħna fuq il-paġna Endpoints. Fil-każ tagħna, endpoints jikkorrispondu għall-kunċett ta 'CRUD (get, post, put, delete).
Sussegwentement, trid toħloq punt ta' tmiem GET AI Quote li juri kwotazzjoni każwali (jekk l-ID hija default) jew kwotazzjoni għall-ID speċifikat.
Biex toħloq endpoint, ikklikkja l-buttuna "Oħloq Endpoint".
Aħna nirrepetu dan il-proċess għall-endpoints l-oħra kollha tal-API. Dak kollox! Prosit, ippublikajt l-API tiegħek!
Jekk kollox ikun tajjeb, il-paġna tal-API tidher xi ħaġa bħal din:
Konklużjoni
F'dan l-artikolu, tgħallimna l-proċess tal-ħolqien tas-Servizz API RESTful tiegħek f'Python, flimkien mal-proċess tal-pubblikazzjoni tal-API fis-sħaba Heroku u żżidha mad-direttorju RapidAPI.
Iżda l-verżjoni tat-test wriet biss il-prinċipji bażiċi tal-iżvilupp tal-API - sfumaturi bħas-sigurtà, it-tolleranza tal-ħsarat u l-iskalabbiltà ma ġewx ikkunsidrati.
Meta tiżviluppa API reali, dan kollu jeħtieġ li jitqies.