APPLICATION PROGRAMMING INTERFACE
API
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.












REMOTE PROCEDURE CALL
RPC
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).
ZAPAMIĘTAĆ!
- Struktura komunikacji RPC nie jest z góry ustalona.
- Końcówka powinna zawierać nazwę procedury którą chcemy wywołać na zdalnym serwerze.
- Standard ten przyjmuje tylko 2 metody komunikacji GET oraz POST.
Przykład
GET /getUsers?someType=abcPOST /saveNewUser
{
"name": "Jan",
"lastName": "Nowak"
}STANDARDY BAZUJĄCE NA RPC
- JSON-RPC
- JSON-XML
- SOAP
REPRESENTATIONAL STATE TRANSFER
REST
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.
REST ...
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 => DELETEPrzykład
GET /users
GET /users/:id
POST /users
PUT /users/:id
DELETE /users/:idOGÓLNE ZASADY REST
- Uniform interface - Interfejs powinien zapewnić ustandaryzowaną komunikację pomiędzy klientem a serwerem
- Client-server - Wyraźny podział na aplikację po stronie klienta i serwera
- Stateless - czyli każde zapytanie powinno zawierać komplet informacji do poprawnego obsłużenia żądania
OGÓLNE ZASADY REST ...
- Cacheable - API powinno wspierać cache’owanie danych w celu zwiększenia wydajności
- Layered system - klient łączący się do serwera nie powinien wiedzieć co się dzieje po drugiej stronie
- Code on demand(*) – API przewiduje możliwość wysłania fragmentu kodu, który może być wykonany po stronie klienta
RESOURCE
- jest rzeczownikiem, np.: user, post, comment
- jest unikatowa i wskazuje na konkretną rzecz
- może być przedstawiona w formie danych
- posiada przynajmniej jeden adres URI, pod którym jest dostępny
Resource – czyli zasób. Dowolna informacja, która posiada nazwę może być zasobem jeżeli:
NAZEWNICTWO
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=:idREPREZENTACJA
- JSON
- YAML
- XML
- ...
GRAPHQL
GRAPHQL
GraphQL 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
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.
HTTP SERVER
WBUDOWANY MODUŁ HTTP
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('...');
});
server.listen(4000);WEB FRAMEWORKS
Express
Express jest to web framework, który zapewnia solidny zestaw funkcji dla aplikacji internetowych i mobilnych przy minimalnej i elastycznej strukturze.
Hello world!
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('hello world!');
});
app.listen(4500, () => console.log('server started'));BASIC ROUTING
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.
ROUTING[STRUKTURA]
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
ROUTE METHODS
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');
});ROUTE PATHS
Ś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.
PRZYKŁAD ZWYKŁEJ ŚCIEŻKI
app.get('/users', (req, res) => {
// ...
});
app.post('/posts.txt', (req, res) => {
// ...
});
app.delete('/comments.json', (req, res) => {
// ...
});ŚCIEŻKI BAZUJĄCE NA WZORZE
// 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) => {
// ...
});WYRAŻENIE REGULARNE
// matches: file.txt, abc/kot.txt
app.get(/.*\.txt/, (req, res) => {
// ...
});
// matches: ala, alaMaKota ...
app.post(/^ala.*/, (req, res) => {
// ...
});ROUTE PARAMETERS
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.
Przykład
// 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" }
});Przykład
Path: /getFile/:filename.:extension
URL: http://localhost:4500/getFile/somefile.txt
req.params: { "filename": "somefile", "extension": "txt" }ROUTE HANDLERS
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.
SINGLE CALLBACK
app.get('/ala-ma-kota', (req, res) => {
// ...
});MANY CALLBACKS
app.get(
'/ala-ma-kota',
(req, res, next) => { ...; next() },
(req, res, next) => { ...; next() },
(req, res) => { ... }
);COMBINE CALLBACKS
const callback1 = (req, res, next) => { ...; next() }
const callback2 = (req, res, next) => { ...; next() }
app.get(
'/ala-ma-kota',
[ callback1, callback2 ],
(req, res) => { ... }
);Response methods
- res.download() - wyślij plik do pobrania
- res.end() - zakończ żądanie
- res.json() - wyślij odpowiedź JSON
- res.redirect() - przekieruj żądanie
Response methods...
- res.render() - wyrenderuj widok
- res.send() - wyślij odpowiedź różnych typów
- res.sendFile() - wyślij plik w postaci strumienia
- res.sendStatus() - ustaw i wyślij kod odpowiedzi jako treść
APP.ROUTE()
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.
Przykład
// ./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'));http-server
By Piotr Tarasiuk
http-server
- 219