Đây là một câu hỏi hay và khó. Chủ đề của thiết kế URI đồng thời là phần nổi bật nhất của API REST và do đó, là một cam kết lâu dài có khả năng đối với người dùng API đó .
Do sự phát triển của một ứng dụng và ở mức độ thấp hơn, API của nó là một thực tế của cuộc sống và nó thậm chí giống với sự phát triển của một sản phẩm có vẻ phức tạp như ngôn ngữ lập trình, thiết kế URI nên có ít ràng buộc tự nhiên hơn và nó nên được bảo tồn tăng ca . Tuổi thọ của ứng dụng và API càng dài, cam kết với người dùng ứng dụng và API càng lớn.
Mặt khác, một thực tế khác của cuộc sống là khó có thể thấy trước tất cả các tài nguyên và các khía cạnh của chúng sẽ được tiêu thụ thông qua API. May mắn thay, không cần thiết phải thiết kế toàn bộ API sẽ được sử dụng cho đến tận thế . Nó là đủ để xác định chính xác tất cả các điểm cuối tài nguyên và sơ đồ địa chỉ của mọi thể hiện tài nguyên và tài nguyên.
Theo thời gian, bạn có thể cần thêm tài nguyên mới và thuộc tính mới cho từng tài nguyên cụ thể, nhưng phương thức mà người dùng API tuân theo để truy cập vào một tài nguyên cụ thể sẽ không thay đổi khi sơ đồ địa chỉ tài nguyên trở nên công khai và do đó cuối cùng.
Phương pháp này áp dụng cho ngữ nghĩa động từ HTTP (ví dụ PUT phải luôn cập nhật / thay thế) và mã trạng thái HTTP được hỗ trợ trong các phiên bản API trước đó (chúng nên tiếp tục hoạt động để các máy khách API hoạt động mà không cần sự can thiệp của con người có thể tiếp tục hoạt động. như thế).
Hơn nữa, vì việc nhúng phiên bản API vào URI sẽ phá vỡ khái niệm hypermedia như là công cụ của trạng thái ứng dụng (được nêu trong luận án tiến sĩ của Roy T. Fieldings) bằng cách có một địa chỉ tài nguyên / URI sẽ thay đổi theo thời gian, tôi sẽ kết luận rằng API các phiên bản không nên được giữ trong các URI tài nguyên trong một thời gian dài có nghĩa là các URI tài nguyên mà người dùng API có thể phụ thuộc phải là permalinks .
Chắc chắn, có thể nhúng phiên bản API trong URI cơ sở nhưng chỉ dành cho sử dụng hợp lý và bị hạn chế như gỡ lỗi ứng dụng khách API hoạt động với phiên bản API mới. Các API được phiên bản như vậy chỉ nên giới hạn thời gian và có sẵn cho các nhóm người dùng API bị giới hạn (như trong thời gian đóng betas). Nếu không, bạn cam kết chính mình nơi bạn không nên.
Một vài suy nghĩ về việc bảo trì các phiên bản API đã hết hạn sử dụng. Tất cả các nền tảng / ngôn ngữ lập trình thường được sử dụng để triển khai các dịch vụ web (Java, .NET, PHP, Perl, Rails, v.v.) cho phép dễ dàng liên kết (các) điểm cuối dịch vụ web với URI cơ sở. Bằng cách này, thật dễ dàng để thu thập và giữ một tập hợp các tệp / lớp / phương thức riêng biệt trên các phiên bản API khác nhau .
Từ người dùng API POV, việc làm việc và liên kết với một phiên bản API cụ thể cũng dễ dàng hơn khi điều này rõ ràng nhưng chỉ trong thời gian giới hạn, tức là trong quá trình phát triển.
Từ POV của người bảo trì API, việc duy trì song song các phiên bản API khác nhau bằng cách sử dụng các hệ thống kiểm soát nguồn chủ yếu hoạt động trên các tệp dưới dạng đơn vị nhỏ nhất của phiên bản (mã nguồn).
Tuy nhiên, với các phiên bản API hiển thị rõ ràng trong URI, có một cảnh báo: người ta cũng có thể phản đối cách tiếp cận này vì lịch sử API trở nên hiển thị / aparent trong thiết kế URI và do đó dễ bị thay đổi theo thời gian trái với hướng dẫn của REST. Tôi đồng ý!
Cách để giải quyết vấn đề phản đối hợp lý này là triển khai phiên bản API mới nhất theo URI cơ sở API không phiên bản. Trong trường hợp này, nhà phát triển ứng dụng khách API có thể chọn một trong hai:
phát triển dựa trên ứng dụng mới nhất (cam kết duy trì ứng dụng bảo vệ ứng dụng khỏi các thay đổi API cuối cùng có thể phá vỡ ứng dụng khách API được thiết kế xấu của chúng ).
liên kết với một phiên bản cụ thể của API (trở nên rõ ràng) nhưng chỉ trong một thời gian giới hạn
Ví dụ: nếu API v3.0 là phiên bản API mới nhất, hai cái sau sẽ là bí danh (nghĩa là hành xử giống hệt với tất cả các yêu cầu API):
http: // shonzilla / api / khách hàng / 1234
http: // shonzilla / api /v3.0 / khách hàng / 1234
http: // shonzilla / api / v3 / khách hàng / 1234
Ngoài ra, các máy khách API vẫn cố gắng trỏ đến API cũ nên được thông báo để sử dụng phiên bản API mới nhất trước đó, nếu phiên bản API chúng đang sử dụng bị lỗi thời hoặc không được hỗ trợ nữa . Vì vậy, truy cập vào bất kỳ URI lỗi thời nào như sau:
http: // shonzilla / api /v2.2 / khách hàng / 1234
http: // shonzilla / api /v2.0 / khách hàng / 1234
http: // shonzilla / api / v2 / khách hàng / 1234
http: // shonzilla / api /v1.1 / khách hàng / 1234
http: // shonzilla / api / v1 / khách hàng / 1234
sẽ trả về bất kỳ mã trạng thái HTTP 30x nào cho biết chuyển hướng được sử dụng cùng vớiLocation
tiêu đề HTTP chuyển hướng đến phiên bản URI tài nguyên thích hợp vẫn là mã này:
http: // shonzilla / api / khách hàng / 1234
Có ít nhất hai mã trạng thái HTTP chuyển hướng phù hợp với các kịch bản phiên bản API:
301 Đã di chuyển vĩnh viễn cho biết rằng tài nguyên có URI được yêu cầu được di chuyển vĩnh viễn sang một URI khác (phải là một permalink thể hiện tài nguyên không chứa thông tin phiên bản API). Mã trạng thái này có thể được sử dụng để chỉ ra phiên bản API lỗi thời / không được hỗ trợ, thông báo cho khách hàng API rằng URI tài nguyên được phiên bản đã được thay thế bằng permalink tài nguyên .
302 Tìm thấy chỉ ra rằng tài nguyên được yêu cầu tạm thời được đặt tại một vị trí khác, trong khi URI được yêu cầu vẫn có thể được hỗ trợ. Mã trạng thái này có thể hữu ích khi các URI không có phiên bản tạm thời không khả dụng và yêu cầu phải được lặp lại bằng cách sử dụng địa chỉ chuyển hướng (ví dụ: chỉ vào URI với phiên bản APi được nhúng) và chúng tôi muốn nói với khách hàng tiếp tục sử dụng nó (ví dụ: permalinks).
các kịch bản khác có thể được tìm thấy trong chương Chuyển hướng 3xx của đặc tả HTTP 1.1