Tôi có một động cơ Rails 3 cho thấy các tuyến API cho khoảng 20 bộ điều khiển. Những bộ điều khiển này đại diện cho một số tài nguyên khác nhau ở các cấp độ lồng nhau khác nhau và được bao phủ bởi hơn 500 thử nghiệm rspec. API được phiên bản tại v1 bằng cách sử dụng không gian tên và ràng buộc định tuyến dựa trên tiêu đề phiên bản có mặc định là v1. Đây là hệ thống phiên bản được mô tả trong nhiều bài đăng trên blog tuyệt vời và dường như là phương pháp hay nhất.Cách chính xác để phiên bản Rails 3 API
Điều không ai trong số các bài đăng trên blog đó mô tả là cách bạn thực sự quản lý triển khai phiên bản mới. Tôi phải thực hiện một thay đổi đột phá cho đầu ra của một bộ điều khiển duy nhất. Sự thay đổi này ảnh hưởng đến phản ứng JSON của một đối tượng bằng cách thay đổi cấu trúc của một trong các giá trị JSON. Điều này sẽ gây ra các ngắt trong chỉ mục, hiển thị và chỉnh sửa các khung nhìn cho bộ điều khiển đó.
Rõ ràng là tôi có thể sao chép tất cả app/api/v1
đến app/api/v2
[1]. Sau đó tôi có thể thực hiện thay đổi duy nhất của mình cho bộ nối tiếp v2 mới. Bây giờ tôi đã có một số lượng lớn mã trùng lặp cho phiên bản 2 của API mà hầu như không có thay đổi nào. Tôi cần duy trì mã ở hai nơi. Tôi có lẽ sẽ phải có toàn bộ bộ rspec của tôi chạy trên bộ điều khiển phiên bản 2 cũng như các phiên bản 1 với một chút nhỏ của thử nghiệm thêm cho serializer v2. Điều này nghe có vẻ như một ý tưởng khủng khiếp. Chúng tôi có thể có một số bộ điều khiển gốc v2 cho mỗi bộ điều khiển không thay đổi trong không gian tên v1 được thừa kế từ bộ điều khiển v1. Điều này cũng không tốt lắm. Tùy chọn tốt nhất mà tôi có thể nghĩ là có một bộ điều khiển đơn (trong trường hợp này có lẽ chỉ là một bộ nối tiếp đơn) bên trong API v2 của tôi, với một số ma thuật định tuyến để kiểm tra xem bộ điều khiển cho phiên bản yêu cầu có tồn tại hay không trở lại thông qua các phiên bản trước cho đến khi nó tìm thấy một phiên bản. Phiên bản serializer cũng nên có phép thuật tương tự để kiểm tra xem có tồn tại phiên bản này hay không và quay trở lại cho đến khi nó tìm thấy nó. Điều này giới thiệu thêm mã tối thiểu và không ngay lập tức tăng gấp đôi thời gian của bộ thử nghiệm của tôi. Nó sẽ yêu cầu có thể cắm một hàm trực tiếp vào logic định tuyến đường ray trước khi nó có thể trả về 404 cho các bộ điều khiển v2 bị thiếu của tôi. Có thể tôi có thể phân tích các không gian tên cho tất cả các bộ điều khiển dựa trên hệ thống tập tin và tạo ra các tuyến đường ở thời gian khởi động đường ray với dự phòng nhưng sẽ rất khó để quản lý rõ ràng việc xóa các tuyến từ phiên bản trước của API.
Có vẻ như chúng tôi sẽ cần tiếp tục thực hiện việc này cho mọi định dạng chức năng/đầu ra không phụ thuộc thay đổi đến mức mỗi phiên bản trước đó không được chấp nhận và bị xóa. Chúng tôi có một API chưa được phát hành bổ sung bao gồm ~ 75 bộ điều khiển được bao phủ bởi ~ 4000 thông số kỹ thuật. Điều gì sẽ xảy ra khi chúng tôi bắt đầu tài liệu bên ngoài và phát hành các tài liệu này?
Khác với việc thực hiện các thay đổi API theo đợt không khả thi ở mức chúng tôi phát hành tính năng, làm cách nào để người khác quản lý tính năng này? Ý tưởng trên có thể ở tất cả không? Có cách nào tốt hơn?
[1] Phát hành một vấn đề. Chúng tôi đang sử dụng ActiveModel::Serializers để sản xuất phản hồi JSON. ActiveModel :: Serializers doesn't support API versioning, mặc dù có vẻ như là một way around this sử dụng phép thuật ruby để chọn lớp chính xác.
Bạn đã đọc câu trả lời cho câu hỏi này chưa? Có vẻ thích hợp. http://stackoverflow.com/questions/389169/best-practices-for-api-versioning – stolli
Martin, bạn đã giải quyết được vấn đề dựa trên các câu trả lời dưới đây chưa? – Anatoly