Reposant
Dec 16 2022
.
- Quelles sont les six contraintes de l'API REST ?
- Architecture Client — Serveur — Cette règle assure la séparation des préoccupations. Le client gère les problèmes d'interface utilisateur tandis que le serveur gère les problèmes de persistance des données. En retour, nous obtenons un système hautement portable où une fois l'API REST peut gérer différents clients.
- Apatridie — Aucune donnée client ne peut être stockée sur le serveur entre les requêtes. Si l'état du client est pertinent pour les requêtes, il doit être envoyé avec les requêtes. Si le serveur doit enregistrer les sessions client, il doit être enregistré dans une base de données pendant une période donnée.
- Capacité de mise en cache — Toutes les réponses doivent être marquées comme pouvant être mises en cache ou non. Si la réponse peut être modifiée en permanence, nous ne devons pas les mettre en cache. La capacité de mise en cache est importante pour les performances de l'API REST.
- Système en couches - Le client ne peut pas savoir / ne devrait pas se soucier s'il s'est directement connecté au serveur d'origine ou à l'intermédiaire en cours de route. Cela signifie que REST vous permet d'avoir une architecture système en couches et que la demande peut être envoyée via différentes couches. Cela contribue à la sécurité et à l'évolutivité (CDN, serveur d'autorisation).
- Code à la demande — L'API REST peut transférer des fichiers JavaScript exécutables et des composants compilés vers le client en cas de besoin.
- Interface uniforme — Comme son nom l'indique, il devrait y avoir une interface pour les ressources qui sont exposées aux clients API. Une ressource dans le serveur ne doit avoir qu'un seul URI logique pour récupérer ou manipuler la ressource.
- basé sur une architecture client-serveur
- et souhaitez servir différents clients via le protocole HTTP
- et souhaitez utiliser les contraintes REST décrites ci-dessus
############################################################################
# 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
- Utilisez OAuth2 pour sécuriser votre API.
- Utilisez un jeton Bearer à expiration automatique pour l'authentification (
Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6). - Exiger HTTPS.
- Envisagez d'utiliser des jetons Web JSON .
- Appliquez l'utilisation des en-têtes Content-Type et Accept-Type même si vous utilisez JSON par défaut pour les requêtes et les réponses.
e.g. Content-Type: application/json Accept-Type: application/json
X-Frame-Options: deny
- Niveau 0 : Définissez un URI, et toutes les opérations sont des requêtes POST à cet URI.
- Niveau 1 : Créer des URI distincts pour les ressources individuelles.
- Niveau 2 : Utiliser les méthodes HTTP pour définir les opérations sur les ressources.
- Niveau 3 : Utiliser l'hypermédia (HATEOAS, décrit ci-dessous).
{
"healthy": true,
"dependencies":
{ "name": "moviesapi",
"healthy": true
}
}
- Pour une méthode POST, l'URI représente une ressource parente de la nouvelle entité, telle qu'une collection. Par exemple, pour créer un nouveau film, l'URI peut être
/api/movies. Le serveur crée l'entité et lui attribue un nouvel URI, tel que/api/movies/6812360. Cet URI est renvoyé dans l'en-tête Location de la réponse. Chaque fois que le client envoie une requête, le serveur crée une nouvelle entité avec un nouvel URI. - Pour une méthode PUT, l'URI identifie l'entité. S'il existe déjà une entité avec cet URI, le serveur met à jour l'entité existante avec la version dans la demande.
- Cache-Control — Le nombre maximal de secondes (ttl) pendant lesquelles une réponse peut être mise en cache. (
Cache-Control: public, 360ouCache-Control: no-store) - Une mise en cache solide minimise le nombre de requêtes reçues par un serveur
- Envisagez une mise en cache faible via l'
ETagen-tête de réponse - ETag — Utilisez un hachage SHA1 pour la version d'une ressource. Assurez-vous d'inclure le type de média dans la valeur de hachage, car cela donne une représentation différente. (
ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Le client doit envoyer un en-tête If-None-Match pour que ce mécanisme fonctionne. - Une mise en cache faible minimise le travail qu'un serveur doit faire (mais pas le nombre de requêtes qu'il reçoit)
- Activer la mise en cache basée sur l'en-tête sur tous les proxys et clients (par exemple, NGINX, Apache, APIM) pour augmenter la vitesse et la robustesse
- Aucune donnée compromettant la confidentialité ou la sécurité dans les URL
- Implémenter le chiffrement du contenu sur les points de terminaison les plus éloignés (dans le serveur REST, pas les proxys ou l'APIM)
- Lorsque la signature de contenu est utilisée, cela se fait après que le contenu est (éventuellement) chiffré.
- Utilisez l'en-tête X-Signing-Algorithm pour communiquer le type de signature de contenu (
X-Signing-Algorithm: RS256) - Utilisez l'en-tête X-SHA256-Checksum pour communiquer la valeur de hachage SHA256 du contenu (
X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87) - Utilisez l'en-tête X-Encryption-Algorithm pour communiquer le type de chiffrement de contenu (
X-Encryption-Algorithm: A128CBC-HS256)
- Cohérent (éviter les surprises en étant prévisible)
- Cohésif (répertorie uniquement les points de terminaison avec dépendance fonctionnelle)
- Complète (a tous les points de terminaison nécessaires à son objectif)
- Minimal (pas plus de paramètres que nécessaire pour être complet, pas de fonctionnalité)
- Encapsulation (cacher les détails de mise en œuvre)
- S'expliquer
- Documenté (si l'auto-explication n'est pas suffisante)
- WSO2
- Apigee
- IBM
- Software SA
- Mulesoft
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































