Huzurlu

Dec 16 2022
.
  • REST API'nin altı kısıtlaması nelerdir?
  • İstemci — Sunucu Mimarisi — Bu kural endişelerin ayrılmasını sağlar. İstemci, UI endişelerini yönetirken, Sunucu veri kalıcılığı endişelerini yönetir. Karşılığında, bir kez REST API'nin farklı istemcileri yönetebildiği, oldukça taşınabilir bir sistem elde ediyoruz.
  • Vatansızlık — İstemler arasında hiçbir istemci verisi sunucuda depolanamaz. İstemci durumu isteklerle alakalıysa, isteklerle birlikte gönderilmelidir. Sunucunun istemci oturumlarını kaydetmesi gerekiyorsa, belirli bir süre için bir DB'ye kaydedilmesi gerekir.
  • Önbelleğe alınabilirlik — Tüm yanıtlar önbelleğe alınabilir veya önbelleğe alınamaz olarak işaretlenmelidir. Yanıt sürekli değiştirilebiliyorsa, onları önbelleğe almamalıyız. Önbelleğe alınabilirlik, REST API'nin performansı için önemlidir.
  • Katmanlı Sistem — İstemci, orijinal sunucuya veya yol boyunca aracıya doğrudan bağlı olup olmadığını bilemez / umursamamalıdır. Bu, REST'in katmanlı bir sistem mimarisine sahip olmanızı sağladığı ve talebin farklı katmanlar aracılığıyla gönderilebileceği anlamına gelir. Bu, güvenlik ve ölçeklenebilirliğe (CDN, yetkilendirme sunucusu) yardımcı olur.
  • İsteğe bağlı kod — REST API, gerektiğinde yürütülebilir JavaScript dosyalarını ve derlenmiş bileşenleri istemciye aktarabilir.
  • Tekdüzen Arayüz — Adından da anlaşılacağı gibi, API istemcilerine maruz kalan kaynaklar için bir arayüz olmalıdır. Sunucudaki bir kaynağın, kaynağı almak veya değiştirmek için yalnızca bir mantıksal URI'si olmalıdır.
    • istemci-sunucu mimarisine dayalı
    • ve farklı istemcilere HTTP protokolü aracılığıyla hizmet vermek istiyor
    • ve yukarıda açıklanan REST kısıtlamalarını kullanmak istiyorum

    ############################################################################
    #                              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
    

    • API'nizin güvenliğini sağlamak için OAuth2'yi kullanın .
    • Kimlik doğrulama için otomatik olarak süresi dolan bir Taşıyıcı belirteci kullanın ( Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6).
    • HTTPS gerektir.
    • JSON Web Belirteçlerini kullanmayı düşünün .
    • Hem istekler hem de yanıtlar için varsayılan olarak JSON kullanıyor olsanız bile Content-Type ve Accept-Type üstbilgilerinin kullanımını zorunlu kılın.
    • e.g.  Content-Type: application/json Accept-Type: application/json
      

    • Yanıtlar şu başlığı içerir:X-Frame-Options: deny
    • Düzey 0: Bir URI tanımlayın ve tüm işlemler bu URI'ye POST istekleridir.
    • Seviye 1: Bireysel kaynaklar için ayrı URI'ler oluşturun.
    • Seviye 2: Kaynaklar üzerindeki işlemleri tanımlamak için HTTP yöntemlerini kullanın.
    • Seviye 3: Hiper ortam kullanın (aşağıda açıklanan HATEOAS).

    {    
          "healthy": true,   
          "dependencies":
           {         "name": "moviesapi", 
            "healthy": true      
           } 
     }
    

    • Bir POST yöntemi için URI, koleksiyon gibi yeni varlığın bir üst kaynağını temsil eder. Örneğin, yeni bir film oluşturmak için URI olabilir /api/movies. Sunucu varlığı oluşturur ve ona /api/movies/6812360. Bu URI, yanıtın Konum başlığında döndürülür. İstemci her istek gönderdiğinde, sunucu yeni bir URI ile yeni bir varlık oluşturur.
    • Bir PUT yöntemi için, URI varlığı tanımlar. Bu URI'ye sahip bir varlık zaten varsa, sunucu mevcut varlığı istekteki sürümle günceller.
    • Cache-Control — Bir yanıtın önbelleğe alınabileceği maksimum saniye sayısı (ttl). ( Cache-Control: public, 360veya Cache-Control: no-store)
    • Güçlü önbelleğe alma, bir sunucunun aldığı istek sayısını en aza indirir
    • ETagYanıt başlığı aracılığıyla zayıf önbelleğe almayı düşünün
    • ETag — Bir kaynağın sürümü için bir SHA1 karması kullanın. Ortam türünü hash değerine eklediğinizden emin olun, çünkü bu farklı bir gösterim oluşturur. ( ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Bu mekanizmanın çalışması için istemcinin bir If-None-Match başlığı göndermesi gerekir.
    • Zayıf önbellekleme, bir sunucunun yapması gereken işi en aza indirir (ancak aldığı istek sayısını değil)
    • Hızı ve sağlamlığı artırmak için tüm proxy'lerde ve istemcilerde (örn. NGINX, Apache, APIM) üstbilgi tabanlı önbelleğe almayı etkinleştirin
    • URL'lerde gizlilik veya güvenlikten ödün vermeyen veriler yok
    • En uzak uç noktalarda içerik şifrelemesi uygulayın (proxy'ler veya APIM'de değil, REST sunucusunda)
    • İçerik imzalama kullanıldığında, bu, içerik (isteğe bağlı olarak) şifrelendikten sonra yapılır.
    • İçerik imzalama türünü bildirmek için X-Signing-Algorithm başlığını kullanın ( X-Signing-Algorithm: RS256)
    • X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87İçeriğin ( ) SHA256 hash değerini iletmek için X-SHA256-Checksum başlığını kullanın
    • İçerik şifreleme türünü bildirmek için X-Encryption-Algorithm başlığını kullanın ( X-Encryption-Algorithm: A128CBC-HS256)
    • Tutarlı (öngörülebilir olarak sürprizlerden kaçının)
    • Uyumlu (yalnızca işlevsel bağımlılığa sahip uç noktaları listeler)
    • Eksiksiz (amacı için gerekli tüm son noktalara sahiptir)
    • Minimal (tamamlanması gerekenden daha fazla son nokta yok, özellik yok)
    • Kapsülleme (uygulama ayrıntılarını gizleme)
    • kendini açıklayan
    • Belgelendi (kendi kendine açıklama yeterli değilse)
    • WSO2
    • Apigee
    • IBM
    • Yazılım AG
    • katır yumuşaklığı