Yên tĩnh

Dec 16 2022
.
  • Sáu hạn chế của API REST là gì?
  • Kiến trúc Máy khách — Máy chủ — Quy tắc này đảm bảo tách biệt các mối quan tâm. Máy khách quản lý các mối quan tâm về giao diện người dùng trong khi Máy chủ quản lý các mối quan tâm về tính bền bỉ của dữ liệu. Đổi lại, chúng tôi có được một hệ thống có tính di động cao, nơi một khi API REST có thể quản lý các máy khách khác nhau.
  • Không trạng thái — Không có dữ liệu khách hàng nào có thể được lưu trữ trên máy chủ giữa các yêu cầu. Nếu trạng thái máy khách phù hợp với các yêu cầu, nó phải được gửi cùng với các yêu cầu. Nếu máy chủ cần lưu các phiên máy khách, nó sẽ được lưu trong DB trong một khoảng thời gian nhất định.
  • Khả năng lưu vào bộ nhớ cache — Tất cả phản hồi phải được đánh dấu là có thể lưu vào bộ nhớ cache hoặc không thể lưu vào bộ nhớ cache. Nếu phản hồi có thể thay đổi liên tục, chúng ta không nên cache chúng. Khả năng lưu trữ quan trọng đối với hiệu suất của API REST.
  • Hệ thống phân lớp — Máy khách không thể biết / không nên quan tâm liệu nó có kết nối trực tiếp với máy chủ gốc hay trung gian trên đường đi hay không. Điều đó có nghĩa là REST cho phép bạn có kiến ​​trúc hệ thống theo lớp và yêu cầu có thể được gửi qua các lớp khác nhau. Điều này giúp bảo mật và khả năng mở rộng (CDN, máy chủ ủy quyền).
  • Mã theo yêu cầu — API REST có thể chuyển các tệp JavaScript thực thi và các thành phần đã biên dịch sang máy khách khi cần.
  • Giao diện thống nhất - Như tên ngụ ý, cần có một giao diện cho các tài nguyên được hiển thị cho các ứng dụng khách API. Tài nguyên trong máy chủ chỉ nên có một URI logic để truy xuất hoặc thao tác tài nguyên.
    • dựa trên kiến ​​trúc client-server
    • và muốn phục vụ các khách hàng khác nhau thông qua giao thức HTTP
    • và muốn sử dụng các ràng buộc REST được mô tả ở trên

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

    • Sử dụng OAuth2 để bảo mật API của bạn.
    • Sử dụng mã thông báo Bearer tự động hết hạn để xác thực ( Authorisation: Bearer f0ca4227-64c4-44e1-89e6-b27c62ac2eb6).
    • Yêu cầu HTTPS.
    • Cân nhắc sử dụng Mã thông báo Web JSON .
    • Bắt buộc sử dụng các tiêu đề Loại nội dung và Loại chấp nhận ngay cả khi bạn sử dụng JSON làm mặc định cho cả yêu cầu và phản hồi.
    • e.g.  Content-Type: application/json Accept-Type: application/json
      

    • Phản hồi chứa tiêu đề:X-Frame-Options: deny
    • Cấp độ 0: Xác định một URI và tất cả các hoạt động là các yêu cầu POST đối với URI này.
    • Cấp độ 1: Tạo các URI riêng cho các tài nguyên riêng lẻ.
    • Cấp độ 2: Sử dụng các phương thức HTTP để xác định các hoạt động trên tài nguyên.
    • Cấp độ 3: Sử dụng hypermedia (HATEOAS, được mô tả bên dưới).

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

    • Đối với phương thức POST, URI đại diện cho tài nguyên gốc của thực thể mới, chẳng hạn như bộ sưu tập. Ví dụ: để tạo một bộ phim mới, URI có thể là /api/movies. Máy chủ tạo thực thể và gán cho nó một URI mới, chẳng hạn như /api/movies/6812360. URI này được trả về trong tiêu đề Vị trí của phản hồi. Mỗi khi máy khách gửi yêu cầu, máy chủ sẽ tạo một thực thể mới với URI mới.
    • Đối với phương thức PUT, URI xác định thực thể. Nếu đã tồn tại một thực thể với URI đó, máy chủ sẽ cập nhật thực thể hiện có với phiên bản trong yêu cầu.
    • Kiểm soát bộ đệm — Số giây tối đa (ttl) mà một phản hồi có thể được lưu vào bộ đệm. ( Cache-Control: public, 360hoặc Cache-Control: no-store)
    • Bộ nhớ đệm mạnh giảm thiểu số lượng yêu cầu mà máy chủ nhận được
    • Xem xét bộ nhớ đệm yếu thông qua ETagtiêu đề phản hồi
    • ETag — Sử dụng hàm băm SHA1 cho phiên bản của tài nguyên. Đảm bảo bao gồm loại phương tiện trong giá trị băm, vì điều đó tạo ra một biểu diễn khác. ( ETag: "2dbc2fd2358e1ea1b7a6bc08ea647b9a337ac92d"). Máy khách cần gửi tiêu đề If-None-Match để cơ chế này hoạt động.
    • Bộ nhớ đệm yếu giảm thiểu công việc mà máy chủ cần thực hiện (chứ không phải số lượng yêu cầu mà máy chủ nhận được)
    • Kích hoạt bộ nhớ đệm dựa trên tiêu đề trên tất cả các proxy và máy khách (ví dụ: NGINX, Apache, APIM) để tăng tốc độ và độ mạnh mẽ
    • Không có dữ liệu ảnh hưởng đến quyền riêng tư hoặc bảo mật trong URL
    • Triển khai mã hóa nội dung trên các điểm cuối xa nhất (trong máy chủ REST, không phải proxy hoặc APIM)
    • Khi ký nội dung được sử dụng, điều này được thực hiện sau khi nội dung được mã hóa (tùy chọn).
    • Sử dụng tiêu đề Thuật toán ký X để truyền đạt loại ký nội dung ( X-Signing-Algorithm: RS256)
    • Sử dụng tiêu đề X-SHA256-Checksum để truyền đạt giá trị băm SHA256 của nội dung ( X-SHA256-Checksum: e1d58ba0a1810d6dca5f086e6e36a9d81a8d4bb00378bdab30bdb205e7473f87)
    • Sử dụng tiêu đề Thuật toán mã hóa X để truyền đạt loại mã hóa nội dung ( X-Encryption-Algorithm: A128CBC-HS256)
    • Nhất quán (tránh bất ngờ bằng cách dự đoán được)
    • Gắn kết (chỉ liệt kê các điểm cuối có phụ thuộc chức năng)
    • Hoàn thành (có tất cả các điểm cuối cần thiết cho mục đích của nó)
    • Tối thiểu (không có nhiều điểm cuối hơn mức cần thiết để hoàn thành, không có tính năng)
    • Đóng gói (ẩn chi tiết triển khai)
    • Lời giải thích của bản thân
    • Tài liệu (nếu tự giải thích là không đủ)
    • WSO2
    • Apigee
    • IBM
    • phần mềm AG
    • Mulesoft