Se vi legas ĉi tiun artikolon, vi verŝajne jam konas la eblecojn, kiuj malfermiĝas kiam vi uzas la API (Application Programming Interface).
Aldonante unu el la multaj publikaj API-oj al via aplikaĵo, vi povas etendi la funkciecon de ĉi tiu aplikaĵo aŭ kompletigi ĝin per la necesaj datumoj. Sed kio se vi evoluigis unikan funkcion, kiun vi volas dividi kun la komunumo?
La respondo estas simpla: vi bezonas kreu vian propran API.
Kvankam ĉi tio povas ŝajni kiel timiga tasko komence, ĝi fakte estas sufiĉe simpla. Ni montros al vi kiel fari tion per Python.
Kion vi bezonas por komenci
API-disvolviĝo postulas:
Python3;
Flasko — simpla kaj facile uzebla kadro por krei TTT-aplikaĵojn;
Flakono-RIPOZA estas etendaĵo por Flask, kiu permesas vin disvolvi REST-API rapide kaj kun minimuma agordo.
Instalado estas farita per la komando:
pip install flask-restful
Ni rekomendas senpagan intensan programadon por komencantoj: Telegram-bot-disvolviĝo en C# — 26–28 aŭgusto. Senpaga intensivo, kiu ebligas al vi kompreni kiel funkcias helpaj robotoj, la funkciojn labori kun la Telegram-API kaj aliaj nuancoj. La plej bonaj tri partoprenantoj ricevos 30 000 rublojn de Skillbox.
Por plene kompreni la taskon, ni komprenu la du terminojn menciitajn supre.
Kio estas REST?
REST API (Reprezenta Ŝtata Translokigo) estas API, kiu uzas HTTP-petojn por interŝanĝi datumojn.
REST-APIoj devas plenumi iujn kriteriojn:
Kliento-servila arkitekturo: la kliento interagas kun la uzantinterfaco, kaj la servilo interagas kun la backend kaj datumbutiko. La kliento kaj servilo estas sendependaj, iu el ili povas esti anstataŭigita aparte de la alia.
Sennacia - Neniuj klientdatenoj estas stokitaj sur la servilo. La seanca stato estas konservita ĉe la klienta flanko.
Cacheability - Klientoj povas konservi servilrespondojn por plibonigi ĝeneralan rendimenton.
Kio estas CRUD?
KRUDA estas programa koncepto kiu priskribas kvar bazajn agojn (krei, legi, ĝisdatigi kaj forigi).
En la REST API, petaj tipoj kaj petaj metodoj respondecas pri agoj kiel afiŝi, akiri, meti, forigi.
Nun kiam ni traktis la bazajn terminojn, ni povas komenci krei la API.
Disvolviĝo
Ni kreu deponejon de citaĵoj pri artefarita inteligenteco. AI estas unu el la plej rapide kreskantaj teknologioj hodiaŭ, kaj Python estas populara ilo por labori kun AI.
Kun ĉi tiu API, Python-programisto povas rapide lerni pri AI kaj esti inspirita de novaj atingoj. Se la programisto havas valorajn pensojn pri ĉi tiu temo, li povos aldoni ilin al la deponejo.
Ni komencu importante la postulatajn modulojn kaj agordi Flask:
from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)
En ĉi tiu fragmento, Flask, Api kaj Resource estas la klasoj, kiujn ni bezonas.
Reqparse estas Flask-RESTful-peta analiza interfaco... Vi ankaŭ bezonos la hazardan modulon por montri hazardan citaĵon.
Nun ni kreos deponejon de citaĵoj pri AI.
Ĉiu repo-eniro enhavos:
cifereca identigilo;
la nomo de la aŭtoro de la citaĵo;
citaĵo.
Ĉar ĉi tio estas nur lerna ekzemplo, ni stokos ĉiujn enskribojn en Python-listo. En reala aplikaĵo, ni plej verŝajne uzus datumbazon anstataŭe.
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."
}
]
Nun ni devas krei Quote-rimedan klason, kiu difinos la operaciojn de niaj API-finpunktoj. Kvar metodoj devas esti deklaritaj ene de la klaso: get, post, put, delete.
Ni komencu per la metodo GET
Ĝi permesas vin akiri specifan citaĵon specifante ĝian ID, aŭ hazardan citaĵon se neniu ID estas specifita.
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
La GET-metodo resendas hazardan citaĵon se la ID enhavas la defaŭltan valoron, t.e. dum vokado la metodo ID ne estis agordita.
Se ĝi estas agordita, tiam la metodo serĉas inter citaĵoj kaj trovas tiun, kiu enhavas la donitan ID. Se nenio estas trovita, la mesaĝo "Citaĵo ne trovita, 404" montriĝas.
Memoru, la metodo resendas HTTP-statuson 200 se la peto sukcesis kaj 404 se la eniro ne estis trovita.
Nun ni kreu POST-metodon por aldoni novan citaĵon al la deponejo
Ĝi ricevos la identigilon de ĉiu nova citaĵo dum vi tajpas. Krome, POST uzos reqparse por analizi la parametrojn kiuj iros en la petokorpon (aŭtoro kaj citaĵo teksto).
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
En la supra kodo, la POST-metodo akceptis citaĵon ID. Tiam, uzante reqparse, ĝi prenis la aŭtoron kaj citaĵon de la peto, stokante ilin en la params vortaro.
Se citaĵo kun la specifita ID jam ekzistas, tiam la metodo montras la taŭgan mesaĝon kaj kodon 400.
Se citaĵo kun la specifita ID ankoraŭ ne estis kreita, la metodo kreas novan enskribon kun la specifita ID kaj aŭtoro, same kiel aliajn parametrojn. Ĝi tiam aldonas enskribon al la listo de ai_quotes kaj resendas enskribon kun nova citaĵo kune kun 201-kodo.
Nun ni kreas PUT-metodon por ŝanĝi ekzistantan citaĵon en la deponejo
La PUT-metodo, simila al la antaŭa ekzemplo, prenas ID kaj enigaĵon kaj analizas la citparametrojn uzante reqparse.
Se ekzistas citaĵo kun la specifita ID, la metodo ĝisdatigos ĝin per la novaj parametroj kaj poste eligos la ĝisdatigitan citaĵon kun kodo 200. Se ankoraŭ ne ekzistas citaĵo kun la specifita ID, nova rekordo kun kodo 201 estos kreita.
Fine, ni kreu DELETE-metodon por forigi citaĵon, kiu ne plu inspiras.
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
Ĉi tiu metodo prenas la citaĵon ID kiel enigo kaj ĝisdatigas la liston de ai_quotes uzante la komunan liston.
Nun kiam ni kreis ĉiujn metodojn, ĉio, kion ni devas fari, estas simple aldoni la rimedon al la API, agordi la vojon kaj ruli Flask.
api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
app.run(debug=True)
Nia REST API-Servo estas preta!
Poste, ni povas konservi la kodon al la app.py-dosiero rulante ĝin en la konzolo per la komando:
python3 app.py
Se ĉio estas en ordo, tiam ni ricevos ion tian:
* Sencimiga reĝimo: ŝaltita
* Kurante plu 127.0.0.1:5000/ (Premu CTRL+C por ĉesi)
* Rekomencante kun stat
* Erarserĉilo estas aktiva!
* Senĉimilo PIN: XXXXXXX
Testante la API
Post kiam la API estas kreita, ĝi devas esti provita.
Ĉi tio povas esti farita uzante la buklan konzolan ilon aŭ la Insomnia REST-klienton, aŭ publikigante la API sur la Rapida API.
Eldonante nian API
RapidAPI estas la plej granda vendoplaco en la mondo kun pli ol 10 API-oj (kaj ĉirkaŭ 000 miliono da programistoj).
RapidAPI ne nur provizas ununuran interfacon por labori kun triaj API-oj, sed ankaŭ permesas vin rapide kaj facile publikigi vian propran API.
Kiel aldoni vian Python API al la RapidAPI-foirejo
Post kiam la API-servo estas publikigita sur Heroku, vi povas aldoni ĝin al la Rapida API. Jen detala dokumentado pri ĉi tiu temo.
1. Kreu RapidAPI-konton.
Ni registras senpagan konton - tio povas esti farita per Facebook, Google, GitHub.
2. Aldonu API al la kontrolpanelo.
3. Poste, enigu ĝeneralajn informojn pri via API.
4. Post klako "Aldoni API" nova paĝo aperas kie vi povas enigi informojn pri nia API.
5. Nun vi povas aŭ mane enigi la API-finpunktojn, aŭ elŝuti swagger dosiero uzante OpenAPI.
Nu, nun vi devas agordi la finpunktojn de nia API sur la Endpoints-paĝo. En nia kazo, la finpunktoj respondas al la koncepto de CRUD (get, post, put, delete).
Poste, vi devas krei finpunkton GET AI Quote, kiu montras hazardan citaĵon (se la ID estas defaŭlta) aŭ citaĵon por la specifita ID.
Por krei finpunkton, vi devas alklaki la butonon "Krei Finpunkton".
Ni ripetas ĉi tiun procezon por ĉiuj aliaj API-finpunktoj. Tio estas ĉio! Gratulon, vi publikigis vian API!
Se ĉio iras bone, la API-paĝo aspektos kiel ĉi tio:
konkludo
En ĉi tiu artikolo, ni trairis la procezon krei nian propran RESTful API-Servon en Python, kune kun la procezo publikigi la API al la Heroku-nubo kaj aldoni ĝin al la dosierujo RapidAPI.
Sed en la testa versio, nur la bazaj principoj de API-disvolviĝo estis montritaj - tiaj nuancoj kiel sekureco, misfunkciado kaj skaleblo ne estis konsiderataj.
Dum disvolvado de reala API, ĉio ĉi devas esti konsiderata.