Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

5. REST API: Založení projektu a první endpoint

V dnešním pokračování tutoriálu Node.js si konečně zkusíme vytvořit vlastní REST API. Tak jako v MySQL tutoriálu, i zde budeme používat knihy jako data pro ilustraci .Vyzkoušíme vytvořit nový projekt s pomocí frameworku Express a naprogramujeme si první dva koncové body (endpointy) našeho API.

Jako první musíme založit nový adresář, ve kterém budou umístěny zdrojové kódy našeho API. Poté se v příkazové řádce nalistujeme do tohoto adresáře a inicializujeme npm pomocí příkazu

npm init

Jednotlivé kroky můžete vyplňovat, nebo přeskočit, v tomto případě to nehraje roli.


Framework Express

K tvorbě API budeme využívat jeden z nejpopulárnějších Node.js frameworků, Express. Ten je inspirovaný Ruby Frameworkem Sinatra a tvoří systém modulů nazývaných middleware. Díky jeho využití se náš kód velmi zkrátí a zjednoduší. Nemusíme se na nízké úrovni starat o zpracování hlaviček, routování, nebo třeba parsování požadavků. Nainstalujeme ho příkazem

npm install express

Nyní si můžeme pro kontrolu prohlédnout, jak vypadá náš soubor package.json:

{
"name": "tutorial_api_1",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo "Error: no test specified" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.17.1"
}
}

Kromě základních částí, které vznikly při založení projektu zde nyní přibyla část dependencies, která obsahuje modul express minimálně ve verzi 4.17.1. Další čeho si můžete všimnou je nově vytvořený adresář node_modules, kde naleznete mnoho dalších adresářů. Jde o další moduly, které Express využívá.


Tvoříme REST API

Založíme si nový soubor index.js a zapíšeme první kód:

var host = '127.0.0.2';
var port = 2222;

var express = require('express');
var app = express();

První část již známe z minula, definujeme si IP a port, kde naše aplikace poběží. Poslední dva řádky jsou nové, nejdříve uvedeme, že budeme využívat modul express. Poté si vytvoříme proměnnou app, tento objekt bude reprezentovat express a budeme ho dále využívat.

Dále si vytvoříme "databázi knih", se kterou budeme pracovat v našich endpointech. Zatím jde pouze o proměnnou - pole objektů, později se však naučíme využívat skutečnou databázi.

var books = [
{ book_id: 1, name: "Duna", author: "Frank Herbert", isbn: "978-80-269-0517-2"},
{ book_id: 2, name: "Utekl jsem z Osvětimi", author: "Rudolf Vrba", isbn: "978-80-85924-50-3"},
{ book_id: 3, name: "Hra o trůny", author: "George R. R. Martin", isbn: "978-80-25722-83-1"},
{ book_id: 4, name: "Chromý bůh", author: "Steven Erikson", isbn: "978-80-7197-458-1"},
{ book_id: 5, name: "Faja", author: "Petra Stehlíková", isbn: "978-80-7577-795-9"},
];

Nyní ještě spustíme aplikaci, aby naslouchala na zvolené adrese a portu, což nám potvrdí výpisem v příkazové řádce.

app.listen(port, host, () => {
console.log('Bezi server ' + host + ":" + port);
});

Tím máme vytvořené vše potřebné, abychom mohli skutečně programovat první endpointy našeho API. První z nich bude sloužit k výpisu všech knih z naší databáze, jeho kód je velice jednoduchý:

app.get('/api/books/GetAll', (request, response) => {
response.send(books);
});

Jde o použití metody get na náš express objekt. Tato metoda zpracovává GET (retrieve) volání na server. Přijímá dva parametry, tím prvním cesta na serveru, neboli unikátní identifikátor endopointu. Express porovná volanou adresu s všemi použitými get metodami. Pokud nalezne odpovídající shodu, spustí druhý parametr metody - callback. Ten má dva parametry, objekt požadavku a objekt odpovědi. Pro výstup dat pak použijeme metodu send objektu response, které předáme všechny uložené knihy. A nyní můžeme script zavolat:

http://127.0.0.2:2222/api/books/GetAll

Výstup pak záleží na programu, ve kterém budete požadavek. Některé prohlížeče, nebo Postman již umí navrácený JSON zformátovat do přehlednější formy. V nezformátované podobě vypadají navrácená data takto:

[{"book_id":1,"name":"Duna","author":"Frank Herbert","isbn":"978-80-269-0517-2"},{"book_id":2,"name":"Utekl jsem z Osvětimi","author":"Rudolf Vrba","isbn":"978-80-85924-50-3"},{"book_id":3,"name":"Hra o trůny","author":"George R. R. Martin","isbn":"978-80-25722-83-1"},{"book_id":4,"name":"Chromý bůh","author":"Steven Erikson","isbn":"978-80-7197-458-1"},{"book_id":5,"name":"Faja","author":"Petra Stehlíková","isbn":"978-80-7577-795-9"}]

Druhým endpointem, který dnes vytvoříme, bude získání jedné konkrétní knihy:

app.get('/api/books/:book_id', (request, response) => {
var book_id = Number(request.params.book_id);
var book = books.find(book => book.book_id === book_id);
if (!book) {
response.status(404).send('Kniha nenalezena');
}
else {
response.send(book);
}
});

Opět použijeme metodu get, s rozdílem že tentokrát je již v adrese proměnná hodnota :book_id. K té můžeme přistupovat přes request.params.id. Nejdříve musíme hodnotu převést do číselného datového typu a poté zkusíme nalézt v naší "databázi" položku s odpovídajícím book_id. Pokud je nalezena, vrátíme tento objekt, v opačném případě vracíme stav 404 - nenalezená položka.

V dalším díle se podíváme na tři zbylé (CREATE, UPDATE, DELETE) metody, aby bylo naše REST API kompletní.


Další díly tutoriálu

3. Balíčkovací systém NPM + package.json
4. Co je to REST API
5. REST API: Založení projektu a první endpoint
6. REST API: Vytvoření endpointů POST, PUT a DELETE
7. Validace dat