Zestaw reguł i ich opis, w jaki programy komputerowe komunikują się między sobą.
Zadanie interfejsu programowania aplikacji jest dostarczenie odpowiednich specyfikacji podprogramów, struktur danych, klas obiektów i wymaganych protokołów komunikacji.
RPC - czyli zdalne wywołanie procedur.
Podejście RPC ma wiele znaczeń oraz wiele form. W przypadku web, wywołanie RPC pozwala na manipulowanie danymi poprzez protokół HTTP.
RPC w rozumieniu web serwera: WYGOPIAO(What You GET Or POST Is An Operation).
GET /getUsers?someType=abcPOST /saveNewUser
{
"name": "Jan",
"lastName": "Nowak"
}REST - zmiana stanu poprzez reprezentacje
Standard określający zasady projektowania API. Bazuje na protokole HTTP.
Za pomocą interfejsu REST API możemy eksponować dane jako zasoby, którymi manipulujemy za pomocą odpowiednich metod protokołu HTTP.
Metody jakie udostępnia nam protokół HTTP w łatwy sposób możemy przyporządkować do operacji CRUD(Create/Read/Update/Delete) na obiekcie.
C => Create => POST
R => Read => GET
U => Update => PUT/PATCH
D => Delete => DELETEGET /users
GET /users/:id
POST /users
PUT /users/:id
DELETE /users/:idResource – czyli zasób. Dowolna informacja, która posiada nazwę może być zasobem jeżeli:
Zasoby powinny być tworzene w taki sposób, aby reprezentowały obiekt. Dzięki temu możliwe jest wykonanie wielu akcji na pojedyńczym zasobie.
GET /users
POST /users
PATCH /users
DELETE /users/:idGET /getUsers
POST /addUsers
POST /deleteUser?id=:idGraphQL jest językiem zapytań dla interfejsów API i środowiskiem wykonawczym do wypełniania zapytań z istniejącymi danymi.
Zapewnia kompletny i zrozumiały opis danych w API.
Pozwala na pobranie wielu zasobów w jednym zapytaniu.
GraphQL daję możliwość zadawanie zapytań o to czego konkretnie dany klient potrzebuje, bez dodatkowych danych.
Łączy się do jednego adresu do którego wysyła odpowiednie zapytanie, które jest przetwarzane przez serwer.
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('...');
});
server.listen(4000);Express jest to web framework, który zapewnia solidny zestaw funkcji dla aplikacji internetowych i mobilnych przy minimalnej i elastycznej strukturze.
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('hello world!');
});
app.listen(4500, () => console.log('server started'));Routing to określanie, w jaki sposób aplikacja odpowiada na żądanie klienta do określonego punktu końcowego i konkretnej metodzie żądania HTTP (GET, POST itd.).
Każda trasa może mieć jedną lub więcej funkcji obsługi, które są wykonywane po dopasowaniu ścieżki.
app.METHOD(PATH, HANDLER)app - instancja naszego serwera
METHOD - metoda żądania HTTP (małymi literami)
PATH - ścieżka na serwerze
HANDLER - funkcja wykonywana po dopasowaniu ścieżki
app.get('/', (req, res) => {
res.send('hello world!');
});
app.post('/', (req, res) => {
res.send('Got a POST request');
});
app.all('/', (req, res) => {
res.send('Any of HTTP method');
});Ścieżki w połączeniu z metodą żądania, definiują punkty końcowe.
Ścieżki mogą przyjmować zwykły adres(string), wzór(string patterns) lub wyrażenie regularne(RegExp).
Znaki ?, +, * i () są podzbiorami ich odpowiedników w wyrażeniach regularnych. Łącznik (-) i kropka (.) Interpretowane są dosłownie według ścieżek opartych na łańcuchach.
app.get('/users', (req, res) => {
// ...
});
app.post('/posts.txt', (req, res) => {
// ...
});
app.delete('/comments.json', (req, res) => {
// ...
});// matches: user, users
app.get('/users?', (req, res) => {
// ...
});
// matches: users, userss, usersss, ...
app.post('/users+', (req, res) => {
// ...
});
// matches: users, usxxxers, usRANDOMers
app.delete('/us*ers', (req, res) => {
// ...
});// matches: file.txt, abc/kot.txt
app.get(/.*\.txt/, (req, res) => {
// ...
});
// matches: ala, alaMaKota ...
app.post(/^ala.*/, (req, res) => {
// ...
});Parametry trasy to nazwane segmenty adresów URL, które służą do przechwytywania wartości określonych na ich pozycji w adresie URL.
Przechwycone wartości są zapełniane w obiekcie req.params, a nazwa parametru trasy jest określona w ścieżce jako odpowiadające im klucze.
// Path: /users/:userId/posts/:postId
// URL: http://localhost:4500/users/12/posts/44
app.get('/users/:userId/posts/:postId', (req, res) => {
// req.params: { "userId": "12", "postId": "44" }
});Path: /getFile/:filename.:extension
URL: http://localhost:4500/getFile/somefile.txt
req.params: { "filename": "somefile", "extension": "txt" }Route może posiadać wiele funkcji zwrotnych, które wykonują się sekwencyjnie aż zostanie wywołanie wysłania odpowiedzi do klienta. Warunkiem jest to iż funkcje pośrednie zamiast kończyć odpowiedź użyją funkcji callback next.
Procedury obsługi tras mogą mieć postać funkcji, szeregu funkcji lub kombinacji obu.
app.get('/ala-ma-kota', (req, res) => {
// ...
});app.get(
'/ala-ma-kota',
(req, res, next) => { ...; next() },
(req, res, next) => { ...; next() },
(req, res) => { ... }
);const callback1 = (req, res, next) => { ...; next() }
const callback2 = (req, res, next) => { ...; next() }
app.get(
'/ala-ma-kota',
[ callback1, callback2 ],
(req, res) => { ... }
);app.route('/users')
.get((req, res) => {
// ...
})
.post((req, res) => {
// ...
})
.delete((req, res) => {
// ...
});Klasa express.Router służy do tworzenia modułowych, zbiorów procedur obsługi ścieżek.
Instancja routera to kompletne oprogramowanie wraz z systemem routingu. Określana również jako mini aplikacja.
// ./dashboard.js
const express = require('express');
const router = express.Router();
router.use((req, res, next) => {
console.log('time: ', Date.now());
next();
});
router.get('/', (req, res) => {
res.send('hello world!');
});
module.exports = router;
// ./app.js
const express = require('express');
const dashboard = require('./dashboard');
const app = express();
app.use('/dashboard', dashboard);
app.listen(4500, () => console.log('server started'));