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
      

    • Odpowiedzi zawierają nagłówek: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, 360lub Cache-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