Riposo
Dec 16 2022
.
- Quali sono i sei vincoli dell'API REST?
- Client — Server Architecture — Questa regola assicura la separazione delle preoccupazioni. Il client gestisce i problemi dell'interfaccia utente mentre il server gestisce i problemi di persistenza dei dati. In cambio, otteniamo un sistema altamente portabile in cui una volta l'API REST può gestire diversi client.
- Statelessness : nessun dato client può essere memorizzato sul server tra le richieste. Se lo stato del client è rilevante per le richieste, deve essere inviato insieme alle richieste. Se il server deve salvare le sessioni client, dovrebbe essere salvato in un DB per un determinato periodo di tempo.
- Cacheability : tutte le risposte devono essere contrassegnate come memorizzabili nella cache o non memorizzabili nella cache. Se la risposta può essere modificata costantemente, non dovremmo memorizzarli nella cache. La memorizzazione nella cache è importante per le prestazioni dell'API REST.
- Sistema a più livelli : il cliente non può sapere/non dovrebbe preoccuparsi se si è connesso direttamente al server originale o all'intermediario lungo il percorso. Significa che REST ti consente di avere un'architettura di sistema a più livelli e la richiesta può essere inviata attraverso diversi livelli. Questo aiuta con sicurezza e scalabilità (CDN, server di autorizzazione).
- Codice su richiesta : l'API REST può trasferire file JavaScript eseguibili e componenti compilati al client quando necessario.
- Interfaccia uniforme : come suggerisce il nome, dovrebbe esserci un'interfaccia per le risorse esposte ai client API. Una risorsa nel server dovrebbe avere un solo URI logico per recuperare o manipolare la risorsa.
- basata su architettura client-server
- e desidera servire diversi client tramite il protocollo HTTP
- e desidera utilizzare i vincoli REST descritti sopra
############################################################################
# Movie Apis Definitions #
############################################################################
# Code completion support is available so start typing for available options.
swagger: '2.0'
# This is your document metadata
info:
version: "1.0.1"
title: The movie api
# Describe your paths here
paths:
# This is a path endpoint. Change it.
/movies:
# This is a HTTP operation
get:
# Describe this verb here. Note: you can use markdown
description: Returns all movies
operationId: getMovies
# Expected responses for this operation:
responses:
# Response code
200:
description: Successful response
# A schema describing your response object.
# Use JSON Schema format
schema:
title: ArrayOfMovies
type: array
items:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
post:
description: Add a new movie
operationId: addMovie
parameters:
- name: movie
in: body
description: The new movie
required: true
schema:
$ref: '#/definitions/movie'
responses:
'201':
description: The new movie
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
/movies/{id}:
parameters:
- name: id
in: path
description: ID of the movie
required: true
type: integer
format: int64
get:
description: Returns a single movie
operationId: getMovieById
responses:
200:
description: Successful response
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
put:
description: Update an existing movie
operationId: updateMovieById
parameters:
- name: movie
in: body
description: The movie
required: true
schema:
$ref: '#/definitions/movie'
responses:
'200':
description: The new movie
schema:
$ref: '#/definitions/movie'
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
delete:
description: Delete a movie
operationId: deleteMovieById
responses:
'204':
description: Movie deleted
default:
description: Error
schema:
$ref: 'https://zalando.github.io/problem/schema.yaml#/Problem'
definitions:
movie:
type: object
required:
- id
- title
properties:
id:
type: integer
format: int64
title:
type: string
ratings:
type: object
properties:
criticsScore:
type: integer
minimum: 0
maximum: 100
audienceScore:
type: integer
minimum: 0
maximum: 100
criticsConsensus:
type: string
abridgedDirectors:
type: array
items:
type: string
abridgedCast:
type: array
items:
$ref: '#/definitions/cast'
posters:
$ref: '#/definitions/posters'
cast:
type: object
required:
- id
- name
properties:
id:
type: integer
format: int64
name:
type: string
characters:
type: array
items:
type: string
posters:
properties:
thumbnail:
type: string
format: uri
profile:
type: string
format: uri
detailed:
type: string
format: uri
original:
type: string
format: uri
- Usa OAuth2 per proteggere la tua API.
- Utilizza un token Bearer con scadenza automatica per l'autenticazione (
Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6). - Richiedi HTTPS.
- Prendi in considerazione l'utilizzo di JSON Web Token .
- Imponi l'uso delle intestazioni Content-Type e Accept-Type anche se utilizzi JSON come impostazione predefinita sia per le richieste che per le risposte.
e.g. Content-Type: application/json Accept-Type: application/json
X-Frame-Options: deny
- Livello 0: definisci un URI e tutte le operazioni sono richieste POST a questo URI.
- Livello 1: crea URI separati per le singole risorse.
- Livello 2: utilizzare i metodi HTTP per definire le operazioni sulle risorse.
- Livello 3: Usa l'ipermedia (HATEOAS, descritto di seguito).
{
"healthy": true,
"dependencies":
{ "name": "moviesapi",
"healthy": true
}
}
- Per un metodo POST, l'URI rappresenta una risorsa padre della nuova entità, ad esempio una raccolta. Ad esempio, per creare un nuovo film, l'URI potrebbe essere
/api/movies. Il server crea l'entità e le assegna un nuovo URI, ad esempio/api/movies/6812360. Questo URI viene restituito nell'intestazione Location della risposta. Ogni volta che il client invia una richiesta, il server creerà una nuova entità con un nuovo URI. - Per un metodo PUT, l'URI identifica l'entità. Se esiste già un'entità con quell'URI, il server aggiorna l'entità esistente con la versione nella richiesta.
- Cache-Control : il numero massimo di secondi (ttl) in cui una risposta può essere memorizzata nella cache. (
Cache-Control: public, 360oCache-Control: no-store) - La memorizzazione nella cache avanzata riduce al minimo il numero di richieste ricevute da un server
- Prendi in considerazione la memorizzazione nella cache debole attraverso l'
ETagintestazione della risposta - ETag : utilizza un hash SHA1 per la versione di una risorsa. Assicurati di includere il tipo di supporto nel valore hash, perché ciò crea una rappresentazione diversa. (
ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Il client deve inviare un'intestazione If-None-Match affinché questo meccanismo funzioni. - La cache debole riduce al minimo il lavoro che un server deve svolgere (ma non il numero di richieste che riceve)
- Abilita la memorizzazione nella cache basata su intestazione su tutti i proxy e i client (ad es. NGINX, Apache, APIM) per aumentare la velocità e la robustezza
- Nessun dato che compromette la privacy o la sicurezza negli URL
- Implementa la crittografia dei contenuti sugli endpoint più lontani (nel server REST, non nei proxy o nell'APIM)
- Quando viene utilizzata la firma del contenuto, questa operazione viene eseguita dopo che il contenuto è (facoltativamente) crittografato.
- Utilizza l'intestazione X-Signing-Algorithm per comunicare il tipo di firma del contenuto (
X-Signing-Algorithm: RS256) - Utilizzare l'intestazione X-SHA256-Checksum per comunicare il valore hash SHA256 del contenuto (
X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87) - Utilizza l'intestazione X-Encryption-Algorithm per comunicare il tipo di crittografia dei contenuti (
X-Encryption-Algorithm: A128CBC-HS256)
- Coerente (evita sorprese essendo prevedibile)
- Coesivo (elenca solo gli endpoint con dipendenza funzionale)
- Completo (ha tutti gli endpoint necessari per il suo scopo)
- Minimo (non più endpoint del necessario per essere completi, nessun featurismo)
- Incapsulamento (nascondere i dettagli di implementazione)
- Autoesplicativo
- Documentato (se l'autospiegazione non è sufficiente)
- WSO2
- Apigee
- IBM
- Software AG
- Mulesoft

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































