Bu iyi ve zor bir soru. Konu URI tasarımı olan aynı zamanda bir REST API en önemli parçası ve bu nedenle potansiyel olarak o API kullanıcılara karşı uzun vadeli taahhüt .
Daha az ölçüde bir uygulama ve, evrimi beri onun API hayatın bir gerçeği olduğunu ve bir programlama dili gibi görünüşte karmaşık ürünün evrimi bile benzer olduğunu, URI tasarım daha az olmalıdır doğal kısıtlamaları ve korunması gerektiğini zaman içinde . Uygulama ve API'nın ömrü ne kadar uzun olursa, uygulama ve API kullanıcılarına olan bağlılık da o kadar büyük olur.
Öte yandan, yaşamın başka bir gerçeği, API aracılığıyla tüketilecek tüm kaynakları ve yönlerini öngörmenin zor olmasıdır. Neyse ki, Apocalypse'a kadar kullanılacak tüm API'yı tasarlamak gerekli değildir . Her kaynak ve kaynak örneğinin tüm kaynak uç noktalarını ve adresleme şemasını doğru bir şekilde tanımlamak yeterlidir.
Zaman içinde her bir kaynağa yeni kaynaklar ve yeni öznitelikler eklemeniz gerekebilir, ancak API kullanıcılarının belirli bir kaynaklara erişmek için izledikleri yöntem, bir kaynak adresleme şeması herkese açık hale geldikten sonra değişmemelidir.
Bu yöntem, HTTP fiil semantiği (örn. PUT her zaman güncellenmeli / değiştirilmelidir) ve önceki API sürümlerinde desteklenen HTTP durum kodları (insan müdahalesi olmadan çalışan API istemcilerinin çalışmaya devam edebilmesi için çalışmaya devam etmelidir) için geçerlidir. bunun gibi).
Ayrıca, API sürümünün URI'ye gömülmesi, zaman içinde değişecek bir kaynak adresine / URI'ye sahip olarak uygulama devletinin motoru (Roy T. Fieldings Doktora tezinde belirtilmiştir) olarak hiper medya kavramını bozacağından, API'nın sürümler kaynak URI'larda uzun süre saklanmamalıdır ; bu , API kullanıcılarının bağlı olabileceği kaynak URI'lerin kalıcı bağlantı olması gerektiği anlamına gelir .
Tabii ki, API sürümünü temel URI'ye gömmek mümkündür, ancak yalnızca yeni API sürümüyle çalışan bir API istemcisinde hata ayıklamak gibi makul ve kısıtlı kullanımlar için . Bu tür sürümlendirilmiş API'ler, zaman sınırlı olmalı ve yalnızca sınırlı beta kullanıcıları için (kapalı beta'lar sırasında olduğu gibi) kullanılabilir olmalıdır. Aksi takdirde, kendinizi yapmamanız gereken yere bağlıyorsunuz.
Son kullanma tarihi geçen API sürümlerinin bakımı ile ilgili birkaç düşünce. Web hizmetlerini (Java, .NET, PHP, Perl, Rails, vb.) Uygulamak için yaygın olarak kullanılan tüm programlama platformları / dilleri, web hizmeti uç noktalarının temel URI'ye kolayca bağlanmasını sağlar. Bu şekilde , farklı API sürümlerinde bir dosya / sınıf / yöntem koleksiyonu toplamak ve ayrı tutmak kolaydır .
API kullanıcılarının POV'sinden, bu açık olduğunda ancak yalnızca sınırlı bir süre için, yani geliştirme sırasında belirli bir API sürümüyle çalışmak ve bunlara bağlanmak daha kolaydır.
API koruyucusunun POV'sinden, ağırlıklı olarak (kaynak kodu) sürümlemenin en küçük birimi olarak dosyalar üzerinde çalışan kaynak kontrol sistemlerini kullanarak farklı API sürümlerini paralel olarak korumak daha kolaydır.
Bununla birlikte, URI'de açıkça görülebilen API sürümlerinde bir uyarı vardır: API geçmişi URI tasarımında görünür / görünür hale geldiğinden ve bu nedenle REST yönergelerine aykırı değişikliklere yatkın olduğundan, bu yaklaşım da itiraz edilebilir . Katılıyorum!
Bu makul itirazın üstesinden gelmenin yolu, en son API sürümünü versiyonsuz API tabanı URI'sına uygulamaktır. Bu durumda, API istemci geliştiricileri şunlardan birini seçebilir:
en sonuncusuna karşı geliştirin (uygulamayı kötü tasarlanmış API istemcilerini kırabilecek nihai API değişikliklerinden koruyan uygulamayı sürdürmek için kendilerini taahhüt ederler ).
API'nın belirli bir sürümüne bağlanma (görünür hale gelir) ancak yalnızca sınırlı bir süre için
Örneğin, API v3.0 en son API sürümü ise, aşağıdaki iki takma ad olmalıdır (yani, tüm API isteklerine aynı şekilde davranmalıdır):
http: // shonzilla / api / müşteriler / 1234
http: // shonzilla / api /v3.0 / müşteriler / 1234
http: // shonzilla / api / v3 / müşteriler / 1234
Buna ek olarak, eski API'yı göstermeye çalışan API istemcileri, kullandıkları API sürümü eskiyse veya artık desteklenmiyorsa , en son önceki API sürümünü kullanmaları konusunda bilgilendirilmelidir . Dolayısıyla, şu eski modaya uygun URI'lerden herhangi birine erişmek:
http: // shonzilla / api /v2.2 / müşteriler / 1234
http: // shonzilla / api /v2.0 / müşteriler / 1234
http: // shonzilla / api / v2 / müşteriler / 1234
http: // shonzilla / api /v1.1 / müşteriler / 1234
http: // shonzilla / api / v1 / müşteriler / 1234
HTTP üstbilgisiyle birlikte kullanılan ve bu kaynak olarak kalan uygun kaynak URI sürümüne yönlendiren 30x HTTP durum kodlarından herhangi birini döndürmelidir Location
:
http: // shonzilla / API / müşteri / 1234
API sürüm senaryoları için uygun en az iki yönlendirme HTTP durum kodu vardır:
301 İstenen bir URI'ye sahip kaynağın kalıcı olarak başka bir URI'ya (API sürüm bilgisi içermeyen bir kaynak örneği kalıcı bağlantısı olması gerektiğini) belirten kalıcı olarak taşındı. Bu durum kodu, API istemcisine, sürümlendirilmiş bir kaynak URI'nın bir kaynak kalıcı bağlantısıyla değiştirildiğini bildiren eski / desteklenmeyen bir API sürümünü belirtmek için kullanılabilir .
302 İstenen kaynağın geçici olarak başka bir konumda bulunduğunu belirten bulunurken, talep edilen URI hala desteklenebilir. Bu durum kodu, sürümsüz URI'ler geçici olarak kullanılamıyorsa ve yeniden yönlendirme adresi kullanılarak bir isteğin tekrarlanması gerektiğinde (ör. APi sürümü katıştırılmış URI'yi işaret ederek) ve istemcilere kullanmaya devam etmesini söylemek istediğimizde (ör. kalıcı bağlantılar).
diğer senaryolar HTTP 1.1 spesifikasyonunun Yeniden Yönlendirme 3xx bölümünde bulunabilir