Tenang

Dec 16 2022
.
  • Apa enam batasan REST API?
  • Klien — Arsitektur Server — Aturan ini memastikan pemisahan masalah. Klien mengelola masalah UI sementara Server mengelola masalah persistensi data. Sebagai imbalannya, kami mendapatkan sistem yang sangat portabel di mana sekali REST API dapat mengelola klien yang berbeda.
  • Kewarganegaraan — Tidak ada data klien yang dapat disimpan di server di antara permintaan. Jika status klien relevan untuk permintaan, itu harus dikirim bersama dengan permintaan. Jika server perlu menyimpan sesi klien, itu harus disimpan dalam DB untuk jangka waktu tertentu.
  • Kemampuan cache — Semua respons harus ditandai sebagai dapat di-cache atau tidak dapat di-cache. Jika respons dapat diubah terus-menerus, kita tidak boleh menyimpannya dalam cache. Kemampuan cache penting untuk kinerja REST API.
  • Sistem Berlapis — Klien tidak dapat mengetahui / seharusnya tidak peduli apakah itu langsung terhubung ke server asli atau perantara di sepanjang jalan. Ini berarti REST memungkinkan Anda memiliki arsitektur sistem berlapis dan permintaan dapat dikirim melalui lapisan yang berbeda. Ini membantu keamanan dan skalabilitas (CDN, server otorisasi).
  • Kode sesuai permintaan — REST API dapat mentransfer file JavaScript yang dapat dieksekusi dan komponen yang dikompilasi ke klien bila diperlukan.
  • Antarmuka Seragam — Seperti namanya, harus ada antarmuka untuk sumber daya yang diekspos ke klien API. Sumber daya di server hanya boleh memiliki satu URI logis untuk mengambil atau memanipulasi sumber daya.
    • berdasarkan arsitektur klien-server
    • dan ingin melayani klien yang berbeda melalui protokol HTTP
    • dan ingin menggunakan batasan REST yang dijelaskan di atas

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

    • Gunakan OAuth2 untuk mengamankan API Anda.
    • Gunakan token Pembawa yang kedaluwarsa secara otomatis untuk autentikasi ( Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6).
    • Memerlukan HTTPS.
    • Pertimbangkan untuk menggunakan Token Web JSON .
    • Terapkan penggunaan header Tipe-Konten dan Tipe-Terima bahkan jika Anda menggunakan JSON sebagai default untuk permintaan dan respons.
    • e.g.  Content-Type: application/json Accept-Type: application/json
      

    • Tanggapan berisi tajuk:X-Frame-Options: deny
    • Level 0: Tentukan satu URI, dan semua operasi adalah permintaan POST ke URI ini.
    • Level 1: Buat URI terpisah untuk sumber daya individual.
    • Tingkat 2: Gunakan metode HTTP untuk menentukan operasi pada sumber daya.
    • Level 3: Gunakan hypermedia (HATEOAS, dijelaskan di bawah).

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

    • Untuk metode POST, URI mewakili sumber induk dari entitas baru, seperti koleksi. Misalnya, untuk membuat film baru, URI-nya mungkin /api/movies. Server membuat entitas dan memberinya URI baru, seperti /api/movies/6812360. URI ini dikembalikan di tajuk Lokasi respons. Setiap kali klien mengirimkan permintaan, server akan membuat entitas baru dengan URI baru.
    • Untuk metode PUT, URI mengidentifikasi entitas. Jika sudah ada entitas dengan URI tersebut, server memperbarui entitas yang ada dengan versi yang diminta.
    • Cache-Control — Jumlah maksimum detik (ttl) respons yang dapat di-cache. ( Cache-Control: public, 360atau Cache-Control: no-store)
    • Caching yang kuat meminimalkan jumlah permintaan yang diterima server
    • Pertimbangkan caching yang lemah melalui ETagresponse-header
    • ETag — Gunakan hash SHA1 untuk versi sumber daya. Pastikan untuk menyertakan jenis media dalam nilai hash, karena itu membuat representasi yang berbeda. ( ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Klien perlu mengirim header If-None-Match agar mekanisme ini berfungsi.
    • Caching yang lemah meminimalkan pekerjaan yang harus dilakukan server (tetapi bukan jumlah permintaan yang diterimanya)
    • Aktifkan caching berbasis header pada semua proxy dan klien (misalnya NGINX, Apache, APIM) untuk meningkatkan kecepatan dan ketahanan
    • Tidak ada data yang membahayakan privasi atau keamanan di URL
    • Terapkan enkripsi konten pada titik akhir terjauh (di server REST, bukan proxy atau APIM)
    • Saat penandatanganan konten digunakan, ini dilakukan setelah konten (opsional) dienkripsi.
    • Gunakan header X-Signing-Algorithm untuk mengomunikasikan jenis penandatanganan konten ( X-Signing-Algorithm: RS256)
    • Gunakan header X-SHA256-Checksum untuk mengomunikasikan nilai hash SHA256 konten ( X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87)
    • Gunakan header X-Encryption-Algorithm untuk mengomunikasikan jenis enkripsi konten ( X-Encryption-Algorithm: A128CBC-HS256)
    • Konsisten (hindari kejutan dengan mudah diprediksi)
    • Kohesif (hanya mencantumkan titik akhir dengan ketergantungan fungsional)
    • Lengkap (memiliki semua titik akhir yang diperlukan untuk tujuannya)
    • Minimal (tidak ada titik akhir lebih dari yang diperlukan untuk diselesaikan, tidak ada fitur)
    • Enkapsulasi (menyembunyikan detail implementasi)
    • Menjelaskan diri sendiri
    • Didokumentasikan (jika penjelasan sendiri tidak cukup)
    • WSO2
    • Apigee
    • IBM
    • Perangkat Lunak AG
    • Mulesoft