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=abc
POST /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 => DELETE

Przykład

GET /users
GET /users/:id
POST /users
PUT /users/:id
DELETE /users/:id

OGÓ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/:id
GET /getUsers
POST /addUsers
POST /deleteUser?id=:id

REPREZENTACJA

  • 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

Response methods...

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