Feladat
A
REST API című oldalon korábban megnéztük, mit is rejt ez a kifejezés, és láttunk néhány konkrét példát rá.
Ezt követően az
API kliensek című oldalon olyan feladatokkal is találkozhattunk már, amikor meglévő API
végpontokhoz kellett klienst készítenünk. A témával való ismerkedés folytatásaként ezen az oldalon pedig olyan feladatok következnek, ahol
nekünk magunknak kell létrehoznunk új API végpontokat.
1. Testtömegindex
Korábban már foglalkoztunk a
testömegindex számításával.
Az ott ismeretett számítási mód és a számok értékelése alapján készítsünk API-t, mely bemenetként kapja egy ember
testtömegét, és testmagasságát, és válaszként megadja a testtömegindexet, annak minősítését szövegesen és képi
hivatkozással, valamint túlsúly esetén annak mértékét kg-ban. A szempontok könnyebb elképzelését segítik az
alábbi hivatkozásminták és azokra generálandó válaszok.
API hívás:
http://localhost/api/tti/?kg=70&cm=178
Minta az API hívás eredményére JSON formában:
{"kg":"70","cm":"178","tti":22.09,"minosites":"normál testalkat","testkep":"https:\/\/infojegyzet.hu\/webszerkesztes\/javascript\/testtomegindex\/body_correct.gif","tobblet":0}
A JSON forma dekódolva - az olvashatóság érdekében:
stdClass Object
(
[kg] => 70
[cm] => 178
[tti] => 22.09
[minosites] => normal testalkat
[testkep] => https://infojegyzet.hu/webszerkesztes/javascript/testtomegindex/body_correct.gif
[tobblet] => 0
)
2. Húsvét és pünkösd dátuma
Szintén volt már téma az infojegyzet.hu oldalain a
húsvét és a pünkösd számításának módja.
Készítsen API-t az ott olvasható számítási mód alkalamazásával, mely egy bemeneti évszám alapján
megválaszolja, hogy a kért évben mely napokra estek, vagy fognak esni a húsvét és a pünkösd dátumai.
Az elkészítendő API az alábbi hívással legyen elérhető, illetve a folytatásban szereplőeknek megfelelően
adjon vissza eredményt.
API hívás:
http://localhost/api/husvetpunkosd/?ev=2021
Minta az API hívás eredményére JSON formában:
{"ev":"2021","nagypentek":"április 2.","husvetvasarnap":"április 4.","husvethetfo":"április 5.","punkosdvasarnap":"május 23.","punkosdhetfo":"május 24."}
A JSON forma dekódolva - az olvashatóság érdekében:
stdClass Object
(
[ev] => 2021
[nagypentek] => április 2.
[husvetvasarnap] => április 4.
[husvethetfo] => április 5.
[punkosdvasarnap] => május 23.
[punkosdhetfo] => május 24.
)
3. Adóazonosító jelből születési dátum
Magyar állampolgárként mindannyian rendelkezünk
adóazonosító jellel.
Ez valójában egy 10 számjegyű szám. A számot az adóhivatal adja ki, képzésének szabályát pedig jogszabály
határozza meg. Ennek megfelelően
- az 1. számjegy konstans 8-as szám,
- a 2-6. a számjegyek a személy születési időpontja és a 1867.01.01. dátum között eltelt napok száma,
- a 7-9. számjegyek az azonos napon születettek megkülönböztetésére szolgáló véletlenszerű sorszám,
- a 10. számjegy ellenőrző szám.
A 10. számjegy képzése az előzőekből úgy történik, hogy a számjegyeket megszorozzuk a sorszámával
és ezeket a szorzatokat összegezzük. A 10. számjegy a szorzat 11-gyel való osztásának maradéka.
Nem adhatók ki azok a sorszámok, amelyek esetén az osztási maradék 10 lenne.
Fentiek alapján készítsen API-t, ami egy bemeneti számról meghatározza, hogy érvényes
adóazonosító-e, és ha igen, válaszként megadja az adat tulajdonosának születési dátumát.
Érvénytelen adóazonosító esetén hibajelzést ad.
API hívás:
http://localhost/api/adoazonosito/?jel=823456796
Minta az API hívás eredményére JSON formában:
{"jel":"823456796","szul_datum":"1931.03.23.","error":"0"}
A JSON forma dekódolva - az olvashatóság érdekében:
stdClass Object
(
[jel] => 823456796
[szul_datum] => 1931.03.23.
[error] => 0
)
4. Holdfázis
Ha ismerünk egy véletlenszerűen választott időpontot a naptárból, amikor éppen telihold van, valamint
pontosan tudjuk, hogy milyen időközönként van újra és újra telihold, akkor ezekből bármilyen időszakban
meg tudjuk mondani az éppen aktuálisan következő telihold időpontját, vagy akár a pillanatnyi holdfázist
is tetszőleges időpontban.
Nézzük az adatokat:
- Telihold volt pl. 2021. június 24-én, 20:40-kor.
- Két azonos fázis közti időtartam (az ún. szinodikus keringésidő) 29.53058867 nap.
A szinodikus idő egy egészen megbízható pontosságú átlagérték, ám a föld és hold keringésének sajátosságai
miatt az ezzel számított egyes konkrét holdfázisok akár ±6 óra eltérést is mutathatnak a valóságos
időpontokhoz képest. A programunk elkészítése során ezt most elfogadtható hibahatárnak tekintjük.
A
Ezek alapján készítsen API-t, mely megadja egy paraméterben kapott dátumot követő holdtölték időpontjait!
A visszaadott telihold-időpontok száma szintén paraméterben legyen megadható!
API hívás:
http://localhost/api/telihold/?datum=2024-12-01&db=12
Az API-t úgy készítse el, hogy paraméter nélkül, vagy éppen egy paramaéterrel is használható legyen.
A paraméterek alapértelmezés szerinti értékei a dátum esetén a mai nap, a visszaadott időpontok száma
tekintetében pedig 3 legyen.
API hívás:
http://localhost/api/telihold/
Minta az API hívás eredményére JSON formában:
{"telihold":["2024-12-15 15:14","2025-01-14 03:58","2025-02-12 16:42"]}
A JSON forma dekódolva - az olvashatóság érdekében:
stdClass Object
(
[telihold] => Array
(
[0] => 2024-12-15 15:14
[1] => 2025-01-14 03:58
[2] => 2025-02-12 16:42
)
)
B
Szintén a kezdeti adatok felhasználásával készítsen API-t, mely egy paraméterben kapott időpont alapján
visszaadja az éppen akkor aktuális holdfázist - paraméter hiányában pedig a pillanatnyi holdfázist!
Az aktuális holdfázis jelölésére több megoldás is létezik. Mi most válasszuk azt a megközelítést,
amikor visszaadjuk a hold látható részének nagyságát százalékban (100% - telihold; 0% - újhold),
illetve emellett a változás irányát, ami lehet "növekvő", "fogyó", vagy éppen pont "telihold",
illetve "újhold".
API hívás:
http://localhost/api/holdfazis/?nap=2024-12-02&ido=14:17
Minta az API hívás eredményére JSON formában:
{"idopont":"2024-12-02 14:17","holdfazis":12,"valtozas":"növekvő"}
A JSON forma dekódolva - az olvashatóság érdekében:
stdClass Object
(
[idopont] => 2024-12-02 14:17
[holdfazis] => 12
[valtozas] => növekvő
)
Az elkészített API végponthoz készítsen API klienst is, mely grafikusan mutatja meg az aktuális
holdfázist. Ehhez használhatja a jobb oldali kép tartalmát is, de akár egyéb változatot is
kereshet hozzá a neten.
Tudta?
A növekvő holdat a fogyó holdtól az alakja is megkülönbözteti. A növekvő – vagy másként fogalmazva
dagadó – hold mindig D alakú, míg a fogyó – vagyis csökkenő – hold
mindig C alakú. Segítenek a kezdőbetűk.
5. Névnapok
Egyes weboldalakon gyakran előforduló tartalom, hogy feltüntetik az aktuális névnapokat,
vagy akár az elkövetkező napokon ünneplők neveit is. Ehhez a hátteret például egy API
biztosíthatja, melynek bemenete egy dátum, eredménye pedig a dátumhoz tartozó névnap,
vagy névnapok. A szükséges adatok akár CSV-ből, akár SQL-ből is használhatóak.
Készítsen ilyen API-t az alábbi adatforrások valamelyikének felhasználásával!
API hívás:
http://localhost/api/nevnapok/?nap=12-02
Minta az API hívás eredményére JSON formában:
{"nevnap":[{"datum":"december 2.","nevnap1":"Melinda","nevnap2":"Vivienn"}]}
A JSON forma dekódolva - az olvashatóság érdekében:
stdClass Object
(
[nevnap] => Array
(
[0] => stdClass Object
(
[datum] => december 2.
[nevnap1] => Melinda
[nevnap2] => Vivienn
)
)
)
Miért lett az API visszaadott eredménye egy tömb?
Azért, mert némiképp előre gondolkodtunk. Ugyanis a kezdeti adatforrás felhasználásával olyan végpontot is
készíthetünk az API-hoz, amikor bemenetként egy nevet adunk meg, válaszként pedig azokat a dátumokat
várjuk, amikor a megadott név tulajdonosai névnapjukat ünneplik. Márpedig bőven akadnak olyan keresztnevek,
amelyek nemcsak egyszer fordulnak elő naptárban. Ilyenformán az eredmény a több visszaadandó érték okán
leginkább egy tömbben lesz megjeleníthető. Ha pedig a név keresésénél kapott eredményt tömbként adjuk vissza,
akkor az egységesség jegyében már a dátumkeresés eredményének visszaadásánál is célszerű ekképpen eljárni.
Fentiek értelmében készítse el az API kiegészítését. Mintaként tekintse az alábbiakat.
API hívás:
http://localhost/api/nevnapok/?nev=Pál
Minta az API hívás eredményére JSON formában:
{"nevnap":[{"datum":"január 25.","nevnap1":"Pál","nevnap2":""},{"datum":"június 26.","nevnap1":"János","nevnap2":"Pál"},{"datum":"június 29.","nevnap1":"Péter","nevnap2":"Pál"},{"datum":"június 30.","nevnap1":"Pál","nevnap2":""}]}
A JSON forma dekódolva - az olvashatóság érdekében:
stdClass Object
(
[nevnap] => Array
(
[0] => stdClass Object
(
[datum] => január 25.
[nevnap1] => Pál
[nevnap2] =>
)
[1] => stdClass Object
(
[datum] => június 26.
[nevnap1] => János
[nevnap2] => Pál
)
[2] => stdClass Object
(
[datum] => június 29.
[nevnap1] => Péter
[nevnap2] => Pál
)
[3] => stdClass Object
(
[datum] => június 30.
[nevnap1] => Pál
[nevnap2] =>
)
)
)