Az előző cikkben, amiben az API kulcs backend-en történő elrejtéséről írtam, ígértem, hogy kifejtem majd részletesebben is az API proxy működését, ami nem teljesen transzparens proxy, mert a küldött adatokat is átalakítja, illetve a fő proxyra küldött API kulcsot is elrejti a végfelhasználó elől.
Most, hogy egy kódszínezőt is beépítettem a bogba, így minden készen áll arra, hogy kicsit részletesebben is bemutathassam az API proxy működését.
Nemrégiben készítettem egy API proxyt, ami a WeatherAPI.com-ról kéri le Budapest időjárását, a kapott JSON adatokat átdolgozza, más kulcsok alá, majd szintén JSON-t ad vissza a válaszában.
A proxy API-t Node.JS alapokon készítettem el, Express.JS használata nélkül. Az elkészült kódok megtalálhatók a Githubon és a CodeSandboxon is.
A kód a http csomagot használja a HTTP szerver létrehozására.
A http szervernek a proxy nevű függvény van átadva, ami felelős a hozzáférés header-ben történő beállításáért, illetve meghatározza a content type-ot, ami JSON lesz, mivel nekünk JSON kimenetre lesz szükségünk. A végén pedig betölti a View függvényt, aminek a response átadásra kerül. (A View függvényről kicsit később).
Ahhoz, hogy a Weatherapi.com adataihoz hozzáférjünk, meg kell adni az WeatherAPI elérési útját és egy API kulcsot plusz a város nevét, aminek az időjárását szeretnénk lekérdezni. Ezt az egészet az API_ENDPOINT konstansba raktam. Tehát API_ENDPOINT = API url + API kulcs + városnév. Az API_KEY-t környezeti változóba mentettem el.
A Node.JS-ben a process.ent.KÖRNYEZETIVÁLTOZÓNEVE sorral lehet lekérni a futó Node.JS által tárolt környezeti változókat. Ezek akár lehetnek string-ek is, így ez tökéletesen alkalmas API kulcsok, Server JWT token kulcsok tárolására. Így az API_KEY-t process.env.API_KEY -el lehet megkapni.
Ahhoz, hogy Node.JS-ből HTTP requesteket tudjunk indítani más API-ok felé, le kell tölteni egy pack-ot az NPM-ről "node-fetch" néven, de akár jó erre az Axios is. A Node 18 esetén pedig már ezekre sem lesz szükség, mivel gyárilag támogartja.
Én a node-fetch-t választottam a WeatherAPI elérésére a proxy API-ban.. Ha ez telepítésre került, akkor a frontendoldali fetch-hez hasonló módon használható. Így ezzel a szokásos módon készítettem el a getWeather függvényt.
Ezt a View függvény használja az adatok megjelenítésére. Az await getWeather(); értéke kerül bele egy konstansba és ez kerül kiírásra, abban az esetben, ha adatokat kérnek le a proxy-tól.
A WeatherAPI.com-tól érkező adatok itt kerülnek módosításra. Például az aktuális hőmérsékleti adat a data.current.temp_c néven érkezik be és a proxy ezt alakítja át temperature.celsius -ra. Így a kimeneten kb ehhez hasonló JSON fog randelkezésreállni:
Ezt az adatot pedig egy frontend fetchel az alábbi formában lehet lekérdezni:
Itt próbálhatod ki a végeredményt.