Спокойный
Dec 16 2022
.
- Каковы шесть ограничений REST API?
- Архитектура «клиент — сервер » — это правило обеспечивает разделение задач. Клиент управляет проблемами пользовательского интерфейса, в то время как сервер управляет проблемами сохранения данных. Взамен мы получаем легко переносимую систему, в которой один раз REST API может управлять разными клиентами.
- Отсутствие состояния — данные клиента не могут храниться на сервере между запросами. Если состояние клиента имеет отношение к запросам, оно должно быть отправлено вместе с запросами. Если серверу необходимо сохранить клиентские сеансы, они должны быть сохранены в БД в течение заданного периода времени.
- Кэшируемость — все ответы должны быть помечены как кешируемые или некэшируемые. Если ответы можно менять постоянно, мы не должны их кэшировать. Кэшируемость важна для производительности REST API.
- Многоуровневая система — клиент не может знать / не должен заботиться о том, подключался ли он напрямую к исходному серверу или к посреднику по пути. Это означает, что REST позволяет вам иметь многоуровневую системную архитектуру, и запрос может быть отправлен через разные уровни. Это помогает с безопасностью и масштабируемостью (CDN, сервер авторизации).
- Код по запросу — REST API может передавать исполняемые файлы JavaScript и скомпилированные компоненты клиенту, когда это необходимо.
- Унифицированный интерфейс — как следует из названия, должен быть интерфейс для ресурсов, которые доступны для клиентов API. Ресурс на сервере должен иметь только один логический URI для извлечения ресурса или управления им.
- на основе клиент-серверной архитектуры
- и хотите обслуживать разных клиентов по протоколу HTTP
- и хотите использовать ограничения REST, описанные выше
############################################################################
# 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
- Используйте OAuth2 для защиты вашего API.
- Используйте токен Bearer с автоматически истекающим сроком действия для аутентификации (
Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6). - Требовать HTTPS.
- Рассмотрите возможность использования веб-токенов JSON .
- Принудительно используйте заголовки Content-Type и Accept-Type, даже если вы используете JSON по умолчанию как для запросов, так и для ответов.
e.g. Content-Type: application/json Accept-Type: application/json
X-Frame-Options: deny
- Уровень 0: определите один URI, и все операции будут POST-запросами к этому URI.
- Уровень 1: Создайте отдельные URI для отдельных ресурсов.
- Уровень 2: Используйте методы HTTP для определения операций над ресурсами.
- Уровень 3: Используйте гипермедиа (HATEOAS, описан ниже).
{
"healthy": true,
"dependencies":
{ "name": "moviesapi",
"healthy": true
}
}
- Для метода POST URI представляет родительский ресурс нового объекта, например коллекцию. Например, для создания нового фильма URI может быть
/api/movies. Сервер создает сущность и назначает ей новый URI, например/api/movies/6812360. Этот URI возвращается в заголовке ответа Location. Каждый раз, когда клиент отправляет запрос, сервер создает новую сущность с новым URI. - Для метода PUT URI идентифицирует сущность. Если объект с таким URI уже существует, сервер обновляет существующий объект версией в запросе.
- Cache-Control — максимальное количество секунд (ttl), в течение которого ответ может кэшироваться. (
Cache-Control: public, 360илиCache-Control: no-store) - Сильное кэширование сводит к минимуму количество запросов, получаемых сервером.
- Рассмотрите слабое кэширование через
ETagзаголовок ответа - ETag — Используйте хэш SHA1 для версии ресурса. Не забудьте включить тип носителя в хеш-значение, потому что это создает другое представление. (
ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Клиент должен отправить заголовок If-None-Match , чтобы этот механизм работал. - Слабое кэширование сводит к минимуму работу, которую должен выполнять сервер (но не количество получаемых запросов).
- Включите кэширование на основе заголовков на всех прокси и клиентах (например, NGINX, Apache, APIM) для повышения скорости и надежности.
- Нет данных, ставящих под угрозу конфиденциальность или безопасность, в URL-адресах
- Реализовать шифрование контента на самых дальних конечных точках (на REST-сервере, а не на прокси или APIM)
- Когда используется подпись контента, это делается после того, как контент (необязательно) зашифрован.
- Используйте заголовок X-Signing-Algorithm для сообщения типа подписи контента (
X-Signing-Algorithm: RS256) - Используйте заголовок X-SHA256-Checksum для передачи хеш-значения SHA256 содержимого (
X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87) - Используйте заголовок X-Encryption-Algorithm для сообщения типа шифрования контента (
X-Encryption-Algorithm: A128CBC-HS256)
- Последовательный (избегайте неожиданностей, будучи предсказуемым)
- Согласованность (перечислены только конечные точки с функциональной зависимостью)
- Полный (имеет все необходимые конечные точки для своей цели)
- Минимальный (конечных точек не больше, чем необходимо для полноты, без особенностей)
- Инкапсуляция (скрытие деталей реализации)
- Самостоятельное объяснение
- Документировано (если самообъяснения недостаточно)
- WSO2
- Апигей
- IBM
- Программное обеспечение АГ
- Мулсофт

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































