Spokojny
Dec 16 2022
.
- Jakie są sześć ograniczeń interfejsu API REST?
- Klient — Architektura serwera — Ta reguła zapewnia rozdzielenie problemów. Klient zarządza problemami związanymi z interfejsem użytkownika, podczas gdy serwer zarządza kwestiami związanymi z trwałością danych. W zamian otrzymujemy wysoce przenośny system, w którym kiedyś REST API może zarządzać różnymi klientami.
- Bezstanowość — żadne dane klienta nie mogą być przechowywane na serwerze między żądaniami. Jeśli stan klienta jest istotny dla żądań, należy go przesłać wraz z żądaniami. Jeśli serwer musi zapisać sesje klienta, powinien zostać zapisany w bazie danych na określony czas.
- Buforowalność — wszystkie odpowiedzi powinny być oznaczone jako buforowalne lub niebuforowalne. Jeśli odpowiedzi mogą być stale zmieniane, nie powinniśmy ich buforować. Możliwość buforowania ma znaczenie dla wydajności interfejsu API REST.
- System warstwowy — Klient nie może wiedzieć/nie powinien dbać o to, czy po drodze łączy się bezpośrednio z pierwotnym serwerem, czy pośrednikiem. Oznacza to, że REST pozwala na warstwową architekturę systemu, a żądanie może być wysyłane przez różne warstwy. Pomaga to w bezpieczeństwie i skalowalności (CDN, serwer autoryzacji).
- Kod na żądanie — REST API może w razie potrzeby przesyłać do klienta wykonywalne pliki JavaScript i skompilowane komponenty.
- Jednolity interfejs — jak sama nazwa wskazuje, powinien istnieć interfejs dla zasobów, które są udostępniane klientom API. Zasób na serwerze powinien mieć tylko jeden logiczny identyfikator URI do pobierania zasobu lub manipulowania nim.
- w oparciu o architekturę klient-serwer
- i chcesz obsługiwać różnych klientów za pośrednictwem protokołu HTTP
- i chcesz użyć ograniczeń REST opisanych powyżej
############################################################################
# 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
- Użyj OAuth2 , aby zabezpieczyć swój interfejs API.
- Użyj automatycznie wygasającego tokenu okaziciela do uwierzytelnienia (
Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6). - Wymagaj protokołu HTTPS.
- Rozważ użycie tokenów internetowych JSON .
- Wymuś użycie nagłówków Content-Type i Accept-Type, nawet jeśli domyślnie używasz formatu JSON zarówno dla żądań, jak i odpowiedzi.
e.g. Content-Type: application/json Accept-Type: application/json
X-Frame-Options: deny
- Poziom 0: Zdefiniuj jeden URI, a wszystkie operacje będą żądaniami POST do tego URI.
- Poziom 1: Utwórz oddzielne identyfikatory URI dla poszczególnych zasobów.
- Poziom 2: Użyj metod HTTP do zdefiniowania operacji na zasobach.
- Poziom 3: Użyj hipermediów (HATEOAS, opisane poniżej).
{
"healthy": true,
"dependencies":
{ "name": "moviesapi",
"healthy": true
}
}
- W przypadku metody POST identyfikator URI reprezentuje zasób nadrzędny nowej jednostki, taki jak kolekcja. Na przykład, aby utworzyć nowy film, identyfikator URI może mieć postać
/api/movies. Serwer tworzy jednostkę i przypisuje jej nowy identyfikator URI, taki jak/api/movies/6812360. Ten identyfikator URI jest zwracany w nagłówku lokalizacji odpowiedzi. Za każdym razem, gdy klient wysyła żądanie, serwer utworzy nową jednostkę z nowym identyfikatorem URI. - W przypadku metody PUT identyfikator URI identyfikuje jednostkę. Jeśli istnieje już jednostka z tym identyfikatorem URI, serwer aktualizuje istniejącą jednostkę o wersję z żądania.
- Kontrola pamięci podręcznej — Maksymalna liczba sekund (ttl), przez jaką odpowiedź może być przechowywana w pamięci podręcznej. (
Cache-Control: public, 360lubCache-Control: no-store) - Silne buforowanie minimalizuje liczbę żądań otrzymywanych przez serwer
- Rozważ słabe buforowanie przez
ETagnagłówek odpowiedzi - ETag — Użyj skrótu SHA1 dla wersji zasobu. Pamiętaj, aby uwzględnić typ nośnika w wartości skrótu, ponieważ stanowi to inną reprezentację. (
ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Aby ten mechanizm zadziałał, klient musi wysłać nagłówek If-None-Match . - Słabe buforowanie minimalizuje pracę, którą musi wykonać serwer (ale nie liczbę otrzymywanych żądań)
- Włącz buforowanie oparte na nagłówkach na wszystkich serwerach proxy i klientach (np. NGINX, Apache, APIM), aby zwiększyć szybkość i niezawodność
- Brak danych zagrażających prywatności lub bezpieczeństwu w adresach URL
- Zaimplementuj szyfrowanie treści na najdalszych punktach końcowych (na serwerze REST, a nie na serwerach proxy lub APIM)
- Gdy używane jest podpisywanie zawartości, odbywa się to po (opcjonalnie) zaszyfrowaniu zawartości.
- Użyj nagłówka X-Signing-Algorithm, aby przekazać typ podpisywania treści (
X-Signing-Algorithm: RS256) - Użyj nagłówka X-SHA256-Checksum, aby przekazać wartość skrótu SHA256 treści (
X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87) - Użyj nagłówka X-Encryption-Algorithm, aby przekazać typ szyfrowania treści (
X-Encryption-Algorithm: A128CBC-HS256)
- Spójny (unikaj niespodzianek dzięki przewidywalności)
- Spójny (wyświetla tylko punkty końcowe z zależnościami funkcjonalnymi)
- Kompletny (posiada wszystkie niezbędne punkty końcowe do swojego celu)
- Minimalny (nie więcej punktów końcowych, niż jest to konieczne do ukończenia, brak featuryzmu)
- Hermetyzacja (ukrywanie szczegółów implementacji)
- Samo wyjaśniające
- Udokumentowane (jeśli samo wyjaśnienie nie jest wystarczające)
- WSO2
- Apigee
- IBM
- Oprogramowanie AG
- Mulesoft

![Czym w ogóle jest lista połączona? [Część 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































