2015-01-12 16 views
8

Tôi đã đánh giá một số versioning schemas cho apis REST (tiêu đề, url, ...). Cho đến nay, cách tiếp cận đáng tin cậy nhất dường như là tùy chọn url: Nó hoạt động với proxy và không dựa vào các lược đồ tối nghĩa như dates for versioning.Phiên bản ngữ nghĩa của REST apis?

Bây giờ, khi tôi nhìn xung quanh, mọi người sử dụng phương pháp tiếp cận dựa trên url dường như sử dụng các phiên bản như v1, v2, v.v. Không ai sử dụng các phiên bản nhỏ, hoặc thậm chí một lược đồ như semantic versioning.

Điều này đặt ra một số câu hỏi:

  • Khi nào bạn tăng số phiên bản của một api REST (chắc chắn, bạn có nhiều bản cập nhật cho nó hơn là chỉ một lần trong năm năm)?
  • Nếu bạn chỉ có một bản vá lỗi, bạn có thể không tăng số phiên bản, nhưng làm thế nào để bạn khác nhau cả hai phiên bản?
  • Nếu bạn sử dụng một cách tiếp cận rất tinh dạng hạt, bạn kết thúc với rất nhiều của phiên bản bạn cần phải lưu trữ song song. Làm thế nào để bạn xử lý đó?

Nói cách khác: Làm thế nào để một công ty như GitHub, ví dụ: chỉ thực hiện v3 hôm nay (2015), khi họ ở trong doanh nghiệp đã 7 năm rồi? Điều đó có nghĩa là họ thực sự chỉ thay đổi api của họ hai lần? Tôi khó có thể tin được điều đó.

Bất kỳ gợi ý?

+1

Trên thực tế đó là số phiên bản lớn. Tôi nghĩ rằng phiên bản tài nguyên quan trọng hơn nhiều, nhưng không ai nói về nó. – inf3rno

+0

Bạn có thể giải thích thêm một chút về ý nghĩa của phiên bản * tài nguyên * không? –

+1

ofc. khi một tài nguyên thay đổi, nó phải thay đổi số phiên bản. Bằng cách cập nhật một máy khách, nó phải gửi số phiên bản của đại diện tài nguyên được lưu trữ cục bộ cùng với yêu cầu, và vì vậy dịch vụ sẽ biết liệu nó có phiên bản mới của tài nguyên hay không.Mọi người gọi etag này, nhưng nếu bạn có tài nguyên hoặc phản hồi với nhiều tài nguyên, bạn không thể gửi nhiều tiêu đề etag (afaik), vì vậy bạn phải gửi số phiên bản trong phần thân. – inf3rno

Trả lời

16

Số phiên bản chính là tất cả những gì bạn cần cho một dịch vụ web. Bởi vì người tiêu dùng của bạn chỉ quan tâm đến những thay đổi không tương thích ngược và (nếu bạn đang theo dõi phiên bản ngữ nghĩa chính xác), người dùng sẽ chỉ được giới thiệu khi một phiên bản chính mới được phát hành.

Mọi thay đổi khác (bao gồm các tính năng mới, sửa lỗi, bản vá lỗi, vv) nên 'an toàn' cho người tiêu dùng của bạn. Những tính năng mới không được sử dụng bởi người tiêu dùng của bạn, và có thể bạn không muốn tiếp tục chạy mà phiên bản chưa được vá có chứa lỗi X hoặc Y bất kỳ dài hơn cần thiết.

Sử dụng số phiên bản hoàn chỉnh trong URL của bạn (hoặc bất kỳ phương pháp nào bạn sử dụng cho phiên bản API) thực sự có nghĩa là người tiêu dùng phải cập nhật URL của API mỗi lần bạn cập nhật/sửa lỗi cho API của mình tiếp tục sử dụng phiên bản chưa được vá cho đến khi họ làm như vậy.

này không có nghĩa rằng bạn không thể sử dụng phiên bản ngữ nghĩa trong nội bộ, tất nhiên! Chỉ cần sử dụng phần đầu tiên (phiên bản chính) làm số phiên bản cho API của bạn. Nó chỉ không có ý nghĩa để bao gồm số phiên bản đầy đủ trong URL của bạn/tiêu đề/hệ thống versioning khác.

Vì vậy, để trả lời câu hỏi của bạn: bạn cập nhật API mỗi khi bạn tạo bản phát hành mới, nhưng bạn chỉ phát hành phiên bản API mới khi bạn có phiên bản chính mới. Bằng cách này, bạn chỉ phải lưu trữ một vài phiên bản khác nhau (và tất nhiên bạn có thể không dùng phiên bản cũ theo thời gian).

+0

Cảm ơn câu trả lời tuyệt vời và rất chi tiết của bạn! Chỉ còn một điều: Giả sử hệ thống không được lưu trữ trên web, nhưng được cài đặt tại khách hàng, tôi kết thúc với rất nhiều biến thể hơi khác nhau của một phiên bản chính, phải không? Làm cách nào để xử lý việc này? Nói cách khác: Tôi không thể chắc chắn rằng 'v1' cho một khách hàng có nghĩa là giống như 'v1' cho một khách hàng khác. –

+0

Bạn có thể giải thích thêm về tình huống đó không? Bạn đang phát triển một API, sẽ chạy trên nhiều máy chủ của khách hàng, nhưng sẽ chỉ có sẵn trên mạng nội bộ của họ (và do đó chỉ được tiêu thụ nội bộ)? Đúng không? –

+0

Chính xác. Nhưng chúng ta sẽ phải hỗ trợ nó. Vì vậy, điều này có nghĩa, một khách hàng gọi và phàn nàn về một vấn đề với REST api. Chúng tôi hỏi họ sử dụng phiên bản nào và họ nói với chúng tôi rằng đó là 'v1'. Thật không may, điều này không phải là quá hữu ích, vì có thể có nhiều 'v1' ra khỏi đó. Tất nhiên chúng tôi có thể yêu cầu phiên bản máy chủ cụ thể, nhưng đó là một bước bổ sung (và chúng tôi không chắc chắn, cho dù chúng tôi muốn có nó). Điều này làm cho câu hỏi rõ ràng hơn? –

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