2012-09-01 36 views
6

Hiện tại tôi đang triển khai phiên bản cho API REST của mình trong ứng dụng Rails của chúng tôi. Có cách nào có thể được triển khai để bạn chỉ xác định chức năng mới trong các phiên bản mới không? Ví dụ:Phiên bản API thanh lịch trong Rails

Tôi có bộ điều khiển Người dùng và bộ điều khiển Sản phẩm. Sản phẩm vẫn giữ nguyên giữa V1 và V2 nhưng Người dùng đã thay đổi. Sẽ tốt hơn nếu chúng tôi có thể thiết lập để nếu tôi gọi V2 Sản phẩm, ứng dụng của tôi biết nó không tồn tại và chỉ sử dụng phiên bản bộ điều khiển mới nhất thay thế (trong trường hợp này là V1). Điều này sẽ cho phép chúng ta không tạo ra một bộ điều khiển hoàn toàn mới cho mọi phiên bản; chúng tôi chỉ tạo bộ điều khiển mới cho chức năng cụ thể đã thay đổi.

Dưới đây là đoạn trích từ Routes.rb của chúng tôi và tôi thừa nhận rằng tôi không biết cách giải quyết vấn đề này. Mọi sự trợ giúp sẽ rất được trân trọng!

namespace :api do 
    scope module: :v1, constraints: ApiConstraints.new(version: 1) do 
     resources :users 
     resources :products 
    end 
    scope module: :v2, constraints: ApiConstraints.new(version: 2) do 
     resources :users 
    end 
end 

Trả lời

1

Bạn đã xem Grape chưa?

Những gì tôi đã thực hiện qua API mà tôi đã tạo là khi có thay đổi cho tất cả chúng (như xác thực), tôi chỉ nhận được tất cả chúng kế thừa từ bộ điều khiển api được phiên bản cụ thể, như trong Api::V1::BaseController và đặt hành vi chung điều khiển trong đó.

Kể từ khi thay đổi API thường cũng có nghĩa là thay đổi cơ quan đại diện, sử dụng một công cụ mà tạo ra các cơ quan đại diện cho bạn cũng là thực sự quan trọng, có nhiều đá quý trên mạng cho điều này như:

+0

Cảm ơn câu trả lời nhanh! Nhóm của chúng tôi đã sử dụng RABL, vì vậy, lý tưởng là chúng tôi muốn sử dụng lại các chế độ xem đó trong Grape. Tôi đang tìm kiếm vào Grape ngay bây giờ và một khi tôi đã thực hiện công việc, tôi sẽ đánh dấu đây là câu trả lời. – NSCodeCasts

1

Đây là những gì Grape được thiết kế để làm. Ngoài ra, bạn có tùy chọn gắn API trong tệp routes.rb hoặc ánh xạ nó trong config.ru, bỏ qua ngăn xếp Rails và cải thiện đáng kể hiệu suất của API.

2

Tôi đã sử dụng cùng một chiến lược cho đôi khi và gần đây đã thay đổi phương pháp tiếp cận và thừa nhận rằng tôi bị thiên vị vì tôi cũng là một trong những tác giả của phương pháp tiếp cận mới với VersionCake.

Cách tiếp cận này chỉ là phiên bản tải trọng hoặc lượt xem của chúng tôi, quan điểm sau là hợp đồng giữa khách hàng và nếu có thay đổi hợp đồng vi phạm thì phiên bản cần phải thay đổi. Trong VersionCake, bạn có thể phiên bản quan điểm của bạn như sau:

app/views/products/show.v1.rabl 
app/views/products/show.v2.rabl 
app/views/users/show.v1.rabl 

Tính năng đặc biệt đó là quan trọng dựa trên câu hỏi của bạn là VersionCake sẽ làm suy thoái gracefully lên phiên bản hỗ trợ mới nhất. Với ví dụ trên, khách hàng yêu cầu users/1.json cho phiên bản 2 sẽ nhận được trọng tải cho users/show.v1.rabl.

Tất cả điều này được nói, nó sẽ yêu cầu áp dụng một cách tiếp cận phiên bản mới, vì vậy nó có thể không phải là câu trả lời tốt nhất, nhưng tôi nghĩ rằng đó là một lựa chọn đáng xem xét.

+0

Có vẻ thú vị và tôi có thể hỏi bạn có bao giờ phải đối mặt với nhu cầu tạo bộ điều khiển mới vì bộ điều khiển cũ có quá nhiều điều kiện theo phiên bản cụ thể không? Làm thế nào để cache cho mỗi phiên bản? Cảm ơn. – lulalala

+0

Tôi đã phát triển một số phiên bản chi nhánh trong bộ điều khiển, nhưng không có gì quá nghiêm trọng đến nỗi chúng tôi cần tạo một bộ điều khiển mới. Chúng tôi sẽ cố gắng ép buộc nhiều phiên bản logic cụ thể vào các phương thức mô hình và gọi chúng trong các khung nhìn để thử và để các bộ điều khiển khô nhất có thể. Đối với bộ nhớ đệm, nó phụ thuộc vào loại bạn có nghĩa là gì. Nếu sử dụng bộ nhớ đệm trang, có thể bạn nên sử dụng phiên bản trong etag. – bencode

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