Happy Monday #1: the Web API guidelines for happy developers
Transcript of Happy Monday #1: the Web API guidelines for happy developers
![Page 1: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/1.jpg)
Happy Monday #1
The Web API guidelines for happy developers
Antonio Pintus & Federico Pinna
1
![Page 2: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/2.jpg)
The path to HAPPINESS
1. Intro: il nostro credo, le API devono essere belle bellissime
2. Risorse and Collezioni
3. URL, versioni, metodi, status & errori: consistenza
4. Rappresentazioni e formato dei dati
5. Sicurezza di base e Autenticazione
6. Documentazione & SDK
2
![Page 3: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/3.jpg)
Happy Monday!
- Antonio Pintus, Technologist al CRS4, CTO di Paraimpu
- Federico Pinna, CTO di Vivocha
3
![Page 4: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/4.jpg)
Le regole del gioco
- API first
- Documentazione
- Consistenza
- Sicurezza
- Le API devono essere bellissime (mantra)
4
![Page 5: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/5.jpg)
Q&A: la web app
5
github.com/BENTOSA/happy-ask-me
un form per le domande
ma voi usate le API ;)
![Page 6: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/6.jpg)
6
REST
(ripasso veloce)
![Page 7: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/7.jpg)
Web API, partiamo da REST
- il termine REST fu introdotto da Roy Fielding nella sua tesi di dottorato
- REpresentational State Transfer: REST
- Uno stile architetturale per applicazioni distribuite
7
![Page 8: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/8.jpg)
REST: concetti principali
- REpresentation: le Risorse sono le astrazioni principali in REST
- State: focus sullo stato delle risorse
- Transfer: trasferire mediante una interfaccia uniforme le rappresentazioni delle risorse (e.g., mediante il protocollo HTTP)
8
![Page 9: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/9.jpg)
REST: le Risorse
- le Resource sono i blocchi fondamentali per la costruzione di sistemi Web-based
- in REST, qualsiasi entità esposta sul Web è una Risorsa: documents, users, products, books, sensors, things, …
- una Resource deve in qualche modo essere univocamente identificata e referenziata
9
![Page 10: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/10.jpg)
REST: le risorse
- Il Web fornisce il meccanismo degli URI (Uniform Resource Identifier) per identificare le risorse rendendole “indirizzabili” mediante un protocollo, per esempio HTTP
- URI - Resource: relazione many-to-one, un URI identifica univocamente una sola risorsa ma una risorsa può avere più URI che la identificano
10
![Page 11: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/11.jpg)
REST: risorse e URL
Esempi:
- https://www.cagliariopendata.it/api/v1/stations
- https://www.cagliariopendata.it/api/v1/stations/1
- https://api.stripe.com/v1/customers/cus_8ehF2N1My7FAjP
11
![Page 12: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/12.jpg)
REST: risorse e rappresentazioni
- Una representation è una vista (o trasformazione) dello stato della risorsa referenziata in un dato momento nel tempo
- La particolare vista (content) è espressa in un dato formato: XML, HTML, JSON, JPEG, ...
- Si specifica il content desiderato utilizzando una content negotiation (HTTP)
12
![Page 13: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/13.jpg)
REST: risorse e rappresentazioni
- https://api.myserver.com/v1/books/1
<book><author>J.J. Smith</author><author>A. Bell</author><ISBN>998765467834276</ISBN><publisher>BPress</publisher><title>REST Services</title><year>2011</year>
</book>
{"author":["J.J. Smith","A. Bell”],“ISBN":"998765467834276",“publisher":"BPress","title":"REST Services”,“year":"2011"
}
XML
JSON
13
![Page 14: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/14.jpg)
REST: Uniform Interface
- Uniform Interface, gli stessi metodi HTTP comunemente usati nel Web: GET, POST, PUT, DELETE, HEAD, …
- sono universali: data una applicazione, non vengono (ri)definiti metodi specifici (come accade invece nei Web service WS-*, SOAP)
- sono ben definiti e la loro semantica è ampiamente accettata
- si utilizzano i codici d’errore standard di HTTP: 404, 200, 500, ...
14
![Page 15: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/15.jpg)
REST: HATEOAS
- Hypermedia As The Engine of Application State (HATEOAS): le risorse e il loro stato possono essere “raggiunti” attraverso link presenti nelle rappresentazioni stesse
- le rappresentazioni delle risorse contengono link (URI) a rappresentazioni di risorse
- questo permette di navigare per risorse interconnesse
15
![Page 16: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/16.jpg)
REST: stateless
- allo scopo di evitare transazioni di lunga durata nelle applicazioni:
- per le Risorse: lo stato è gestito dal server; se un client cambia lo stato di una risorsa, tutti i client vedono questo cambiamento
- per i Client: lo stato del client è mantenuto sul client (stato specifico del client stesso)
16
![Page 17: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/17.jpg)
REST: vantaggi
- come il Web stesso, REST consente un approccio “loosely-coupled” nella realizzazione delle applicazioni
- questo implica la scalabilità
- è uno stile indipendente dai linguaggi di programmazione
17
![Page 18: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/18.jpg)
REST in pratica
5 principi:
1. assegnare un ID a ciascuna risorsa
2. collegare con un link le risorse
3. usare metodi standard
4. modellare le risorse in modo che abbiano rappresentazioni multiple
5. usare interazioni stateless tra client e server
18
![Page 19: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/19.jpg)
REST: facile, chiaro, bellissimo, seguito da tutti, no?
19
![Page 20: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/20.jpg)
REST: Facile, chiaro, bellissimo seguito da tutti, no?
20
NO!
![Page 21: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/21.jpg)
Trova le differenze #1
GET /a/vvc_demo/api/_/contacts/get/?cid=aaaa HTTP/1.1 Host: beta.vivocha.com
HTTP/1.1 200 OK Content-Type: application/json
{ result: false, status: 401, vvc: “4.9.1" }
21
GET /a/vvc_demo/api/v5/contacts/aaaa HTTP/1.1 Host: beta.vivocha.com
HTTP/1.1 401 Unauthorized
![Page 22: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/22.jpg)
Trova le differenze #2
GET /use?token=234-566-78b-cde-f12 Host: api.paraimpu.com
22
GET /v1/things/234-566-78b-cde-f12/data Host: api.paraimpu.com
Ottenere i dati prodotti da un sensore
![Page 23: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/23.jpg)
23
- REST come religione?
- Fondamentalisti del REST o hippie dalla libera interpretazione delle API e
potere alla fantasia?
Quindi?
![Page 24: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/24.jpg)
24
- REST come religione?
- Fondamentalisti del REST o hippie dalla libera interpretazione delle API e
potere alla fantasia?
- Né gli uni né gli altri…
Quindi?
Né gli uni né gli altri…
![Page 25: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/25.jpg)
25
- L’implementazione delle API deve seguire un approccio più “pragmatico”: principi di REST ma con un occhio alla praticità di utilizzo
- Non dimentichiamo che le API hanno un’unica tipologia di fruitori: developers, developers, developers!
Occorre essere pratici!
![Page 26: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/26.jpg)
26
WEB API: le linee guida
per rendere gli sviluppatori felici (di nuovo)
![Page 27: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/27.jpg)
Web API: Risorse, nomi, URL
- Ogni risorsa ha un nome significativo e non ambiguo: User, Book, Message, Charge
- Ogni risorsa ha il suo URL unico, con
- nomi plurali per le collezioni di risorse
- ogni singola risorsa ha un suo unico identificativo (id)
27
![Page 28: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/28.jpg)
Web API: Risorse, nomi, URL
28
/services
/connections
/orders
/books
/sensors/data
/services/1
/connections/4
/orders/ab-d-45
/books/1240-1
/sensors/62/data/550e8400-e29b-41d4-a716-446655440000
collezioni di risorse
singole risorse (id)
{
"id": “1240-1“,
"title":"Web API tips",
“author":"Johnny Joe"
}
rappresentazione di una risorsa Book, in JSON
![Page 29: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/29.jpg)
- l’URL di base delle API deve essere semplice
- L’URL di base delle API deve riportarne la versione
https://api.paraimpu.com/v1
https://api.vivocha.com/v5
https://api.paraimpu.com/v1/things
https://api.vivocha.com/v5/payments
https://www.example.org/api/some-api/v1
https://www.example.org/api/some-api/v2
https://www.example.org/api/other-api/v12
Web API: Risorse, nomi, URL
29
![Page 30: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/30.jpg)
- Modello CRUD (Create, Read, Update, Delete)
- non spiazziamo gli sviluppatori(che sono gli utilizzatori delle nostre API)
- usiamo i metodi HTTP in maniera corretta e coerente
Web API: metodi HTTP
30
![Page 31: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/31.jpg)
Web API: metodi HTTP
GET per ottenere la rappresentazione di una risorsa
POST per creare una risorsa sul server
PUT per aggiornare una risorsa sul server
DELETE per eliminare una risorsa dal server
31
![Page 32: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/32.jpg)
- Esempio di GET: GET /v1/books HTTP/1.1
Host: api.example.org
HTTP/1.1 200 OK
Content-Type: application/json
[ {
"id": "1",
"title": "Cryptonomicon",
"author": "Neal Stephenson"
}, {
"id": "2",
"title": “Il fasciocomunista",
"author": "Antonio Pennacchi"
} ]
Web API: Metodi HTTP
32
![Page 33: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/33.jpg)
- Esempio di POST: POST /v1/books HTTP/1.1
Host: api.example.org
Content-Type: application/json
{
"title": "Cryptonomicon",
"author": "Neal Stephenson"
}
HTTP/1.1 201 Created
Location: https://api.example.org/v1/books/123
Content-Type: application/json
{
"id": "123",
"title": "Cryptonomicon",
"author": "Neal Stephenson"
}
Web API: Metodi HTTP
33
![Page 34: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/34.jpg)
- Esempio di PUT:
PUT /v1/books/123 HTTP/1.1
Host: api.example.org
Content-Type: application/json
{
"title": "Snow Crash",
"author": "Neal Stephenson"
}
HTTP/1.1 200 OK
Content-Type: application/json
Web API: Metodi HTTP
34
![Page 35: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/35.jpg)
- Esempi di DELETE:
DELETE /v1/things/123
DELETE /v1/things
Web API: Metodi HTTP
Cancella una risorsa
Cancella tutte le risorse “Thing” (cancella la collezione)
35
![Page 36: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/36.jpg)
Web API: errori e status
36
GET /v1/things/123_bad_id HTTP/1.1
Host: api.example.org
HTTP/1.1 200 OK
Content-Type: application/json
{
"error": "404",
"message": "Not Found"
}
![Page 37: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/37.jpg)
37
NON - FATELO - MAI!
![Page 38: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/38.jpg)
Web API: errori e status
38
Utilizzare sempre i codici standard di status e di errore propri di HTTP
![Page 39: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/39.jpg)
Web API: errori e status
39
![Page 40: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/40.jpg)
Web API: errori e status
40
![Page 41: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/41.jpg)
Web API: errori e status
41
![Page 42: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/42.jpg)
Web API: errori e status
42 https://http.catAPI
![Page 43: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/43.jpg)
HTTP/1.1 404 Not Found
{
"error": 404,
"errorMessage": "Book not found, maybe the id is wrong",
“moreInfo":"https://docs.mysuperapp.com/v1/support/404"
}
Web API: Metodi HTTP
…e, in caso di errore, restituire un messaggio più dettagliato nel body della risposta
43
![Page 44: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/44.jpg)
Formato dei dati
JSON
44
![Page 45: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/45.jpg)
Formato dei dati
- Supportare almeno JSON
- Se si decide di supportare più formati:
- gestire header Accept Accept: application/json Accept: text/xml
- gestire estensione nell’url GET /v1/things/123.json GET /v1/things/123.xml
45
![Page 46: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/46.jpg)
Formato dei dati
Come torturare me o Antonio:
{ “StringA”: “aaa”, “altra_stringa”: “bbb”, “eccoUnIntero”: 6, “odio_indentare”: “aaaaaaah” }
46
![Page 47: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/47.jpg)
Formato dei dati
Casi particolari:
- Date, usare il formato ISO 8601: yyyy-MM-ddTHH:mm:ss.SSSZ
- Undefined, non usare
- Array vuoti, attenzione a MongoDB
47
![Page 48: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/48.jpg)
Sicurezza
- Proteggere i dati
- Garantire la continuità del servizio
- Autenticare e autorizzare l’accesso
48
![Page 49: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/49.jpg)
Sicurezza
- Sempre e solo HTTPS
- Mai esporre più di quanto strettamente necessario
- Escape/sanitize tutto l’input
- Pentest
- Non reinventare la ruota
49
![Page 50: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/50.jpg)
Autenticazione e autorizzazione
- Evitare le sessioni se possibile
- Usare Bearer Tokens Authorization: Bearer abcd-123-efg-456
- Ancora meglio: usare JSON Web Tokens Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6Ikp
vaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
- Ma soprattutto: OAuth 2
50
![Page 51: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/51.jpg)
Documentazione
- Ripetiamo insieme: le API hanno un’unica tipologia di fruitori, developers, developers, developers!
- Una bella documentazione deve essere:
- Chiara
- Esaustiva
- Immediata
- Ricca di esempi, possibilmente in linguaggi diversi
51
![Page 52: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/52.jpg)
Documentazione
- Il primo problema di una bella documentazione è che la deve scrivere un developer
- Il secondo problema è che lo stesso developer la deve anche mantenere aggiornata
E se ci fosse un modo di produrre bella documentazione (quasi) automaticamente?
52
![Page 53: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/53.jpg)
Documentazione
- OpenAPI aka Swagger è un specification format
- Altre sono RAML e API Blueprint
53
![Page 54: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/54.jpg)
Documentazione
54
Swagger
JSON Schema
JSON ReferenceJSON Pointer
![Page 55: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/55.jpg)
Documentazione
Link utili:
- https://openapis.org/
- http://swagger.io/
- https://github.com/swagger-api
- https://github.com/vivocha/jsonpolice
- https://github.com/vivocha/jsonref
55
![Page 56: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/56.jpg)
SDK
- (ripetiamolo) gli sviluppatori sono pigri ;)
- Forniamo quindi anche un Software Development Kit (SDK) per i linguaggi di programmazione più comuni
56
![Page 57: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/57.jpg)
happy download
leanpub.com/thewebapinntux57
![Page 58: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/58.jpg)
Q&A app, open source
github.com/BENTOSA/happy-ask-me
58
![Page 59: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/59.jpg)
grazie!
www.bentosa.it
59
![Page 60: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/60.jpg)
ONE MORE THING
60
![Page 61: Happy Monday #1: the Web API guidelines for happy developers](https://reader035.fdocuments.net/reader035/viewer/2022070514/58819d531a28ab1a398b47df/html5/thumbnails/61.jpg)
Training Workshop
Growth Networking
www.bentosa.it
61