7. Validace dat
V našem API máme vytvořené všechny endpointy které jsme chtěli. Ještě je však potřeba ho dotáhnout do lepší podoby. Konkrétně doplnit validaci zasílaných dat. Zatím jsme si data zasílali sami a tím pádem jsme věděli že data jsou v pořádku. V běžném provozu tomu tak není, navíc vždy je možnost, že se nám nějaký útočník pokusí data podstrčit. Z tohoto důvodu bychom měli vždy všechna zaslaná data kontrolovat.My si naše API rozšíříme o kontrolu typu zasílaných dat (Content-Type) na náš server a také o validaci samotných dat, aby odpovídali tomu, jak jsme si objekty nadefinovali. Kontrolu budeme přidávat pouze k metodám POST/PUT tedy k vytváření a editaci dat. Ve zbylých endpointech nám žádná data zasílána nejsou.
Kontrola typu zasílaných dat
Ke kontrole použijeme metodu is() objektu request. Ta testuje hodnotu Content-Type, která je zasílána v hlavičce požadavku. V našem programu předpokládáme, že zasílaná data budou typu JSON, přidáme tedy hned na začátek POST i PUT tuto podmínku:if (!request.is('json')) {
response.status(415).send('Chybny pozadavek');
return;
}
Pokud je Content-Type jiné typu, vracíme klientovi stav 415 - Unsupported Media Type.
Validace vstupních dat - modul Joi
Pro validaci vstupních údajů využijeme balíček Joi. V našem případě je to možná přehnaně zbytečné, nebudeme totiž provádět žádné rozsáhlé kontroly. Je ale dobré si práci s Joi vyzkoušet. Joi umožňuje i různé složitější kontroly, například pomocí regulární výrazů. Princip je takový, že vytvoříme schéma objektu, který budeme chtít kontrolovat. Každému jednotlivému atributu nastavíme jaké má splňovat vlastnosti, nebo například zda-li je povinný. Takto vytvořené schéma pak porovnáme se zaslanými daty. Joi nám poví, zda-li je všechno v pořádku. Pokud není, dostaneme poměrně přesný výpis konkrétních chyb. Nejdříve si však musíme pomocí npm Joi nainstalovat:npm install joi
A také přidat do našeho programu. Na začátek uvedeme:
var Joi = require('joi');
Nyní si vytvoříme schéma, vůči kterému budeme získaná data porovnávat. Všem třem atributům, které naše knihy obsahují, nastavíme že jsou povinné (required()). Pro jméno knihy a autora nastavíme minimální délku 2 znaky, pro ISBN stanovíme rozsah 10 až 18 znaků.
Obecně jde o funkci, které předáme jako parametr porovnávaný objekt. Pomocí metody Joi.validate() pak porovnáme námi stanovené schéma a tento objekt. Metoda nám vrátí objekt s několika atributy. V atributu error nalezneme konkrétní výpisy chyb. Pokud je atribute null, data žádné chyby neobsahují. V takovém případě naše funkce vrací 1, pokud se vyskytne nějaká chyba, tak 0.
function is_book_valid(book) {
var book_schema = {
name: Joi.string().min(2).required(),
author: Joi.string().min(2).required(),
isbn: Joi.string().min(10).max(18).required()
};
var is_error = Joi.validate(book, book_schema);
if (is_error.error) {
return 0;
}
return 1;
}
Dále musíme upravit obsluhu PUT a POST volání. Přidáme podmínku v tomto tvaru:
if (!is_book_valid(request.body)) {
response.status(400).send('Chybna data v pozadavku');
return;
}
V případě nevalidních dat tedy vrátíme kód 400 (Bad Request) a příslušnou zprávu. Celý finální kód POST obsluhy pak vypadá takto:
app.post('/api/books', (request, response) => {
var new_book_id = books.slice(-1)[0].book_id + 1;
if (!request.is('json')) {
response.status(415).send('Chybny pozadavek');
return;
}
if (!is_book_valid(request.body)) {
response.status(400).send('Chybna data v pozadavku');
return;
}
var book = {
book_id: new_book_id,
name: request.body.name,
author: request.body.author,
isbn: request.body.isbn
};
books.push(book);
response.send(book);
});
Zapracovat nový kód do PUT metody pro úprav dat již zvládnete zcela jistě sami. A tím jsme dokončili část tutoriálu věnovanou vytvoření našeho vlastního API. V dalších článcích se podíváme na spolupráci se skutečnou databází, konkrétně MongoDB.
Další díly tutoriálu
5. REST API: Založení projektu a první endpoint6. REST API: Vytvoření endpointů POST, PUT a DELETE
7. Validace dat
9. Instalace MongoDB a Compass