6

Tôi đã đọc tất cả các phương pháp tiếp cận với API REST phiên bản. Trong hầu như tất cả các triển khai, các bộ điều khiển và khung nhìn được phiên bản, tuy nhiên các mô hình thì không.Phiên bản API REST - tại sao các mô hình không được phiên bản

Để cung cấp cho các đường ray Ví dụ, bộ điều khiển được tổ chức như:

# app/controllers/api/v1/events_controller.rb 
class Api::V1::EventsController < Api::ApiController 

end 

Tương ứng với quan điểm như đặt trong thư mục tại phiên bản khác nhau là tốt. Tại sao chúng ta không phiên bản mô hình? Có phải vì chúng tôi mong đợi mô hình của chúng tôi (lược đồ cơ sở dữ liệu cơ bản) không thay đổi khi API phát triển? Điều gì sẽ xảy ra khi tôi đổi tên một tên cột trong cơ sở dữ liệu và cần một mô hình mới để tính toán điều đó?

Trả lời

10

Mô hình là một phần của nội bộ của ứng dụng, không phải là API công khai. Khi phiên bản khóa là đầu vào/đầu ra không bị lệch.

Duy trì dữ liệu được phiên bản khác nhau trong cơ sở dữ liệu - ví dụ: dữ liệu thuộc các phiên bản khác nhau của API không đặc biệt hấp dẫn hoặc thực tế.

Vì vậy, thay vào đó bạn sẽ sử dụng bộ điều hợp/serializers để điều chỉnh đầu vào/đầu ra cho một phiên bản cụ thể của API của bạn trong khi các internals chạy ở phiên bản hiện tại.

phép nói rằng bạn đã xuất bản một API v 1 trong vội vàng:

GET api/v1/users/:id 
    username (String) 
    first_name (String) 
    lastname (String) 

Sau khi phát hành bạn nhận ra rằng việc đặt tên không phù hợp. Vì vậy, bạn sẽ tạo một di chuyển đổi tên lastname thành last_name.

Vì vậy, API phiên bản 2 sẽ có chữ ký sau đây:

GET api/v2/users/:id 
    username (String) 
    first_name (String) 
    last_name (String) 

Nhưng điều này nên phá vỡ một thử nghiệm cho API v 1 kể từ khi phản ứng không còn chứa lastname.

Vì vậy, để khắc phục nó, chúng tôi sẽ tạo ra một cái gì đó như:

Api::V1::UserSerializer < ActiveModel::Serializer 
    attributes :username, :first_name, :lastname 

    def lastname 
    object.last_name 
    end 
end 
3

Tại sao chúng ta không mô hình phiên bản?

Mô hình thường được căn chỉnh chặt chẽ với lược đồ cơ sở dữ liệu. Thông thường, cơ sở dữ liệu là một kho lưu trữ dữ liệu chuẩn được chia sẻ bởi tất cả các phiên bản của API, do đó nó không có ý nghĩa nhiều với phiên bản các mô hình.

Ngoài ra, trong các ứng dụng Rails, thường phần lớn logic kinh doanh nằm trong các mô hình. Các mô hình phiên bản sẽ yêu cầu sao chép logic hoặc bổ sung thêm một lớp trừu tượng khác để giới thiệu chi phí bảo trì.

Có phải vì chúng tôi mong đợi mô hình của chúng tôi (lược đồ cơ sở dữ liệu cơ bản) không thay đổi khi API phát triển?

Không. Giản đồ cơ sở dữ liệu có thể thay đổi rất thường xuyên.

Điều gì sẽ xảy ra khi tôi đổi tên tên cột trong cơ sở dữ liệu và cần mô hình mới để tính toán điều đó?

Bạn không giới thiệu mô hình để tính toán thay đổi lược đồ. Bạn điều chỉnh mô hình hiện tại để chứa thay đổi, và sau đó sửa đổi việc triển khai các API trước để các phiên bản trước đó của khách hàng tiếp tục nhận được phản hồi theo cùng định dạng như họ mong đợi trước đây.

Vì việc ánh xạ các thực thể (mô hình) của bạn cho các phản hồi API, xảy ra trong bộ điều khiển (hoặc serializers, hoặc các mẫu json - tùy thuộc vào triển khai ưa thích của bạn) - các phần này của ứng dụng của bạn sẽ phải được sửa đổi để đảm bảo ngược khả năng tương thích.

Các vấn đề liên quan