Спокойный

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
    • Программное обеспечение АГ
    • Мулсофт