Bir VM'yi REST arayüzü ile kapatma
Bu aslında 2009 yılında Tim Bray tarafından ortaya konan bir nevi ünlü örnek .
Roy Fielding, sorunu tartışırken, bu gözlemi paylaştı :
Şahsen ben izlenen durumu (güç durumu gibi) düzenlenebilir olarak görmeyen sistemleri tercih ediyorum.
Kısacası, izlenen durumun güncel bir temsilini döndüren bir bilgi kaynağınız var; Bu gösterim , bu durumda bir değişiklik istemek için bir forma bir hiper medya bağlantısı içerebilir ve formun (her biri) değişiklik isteğini işlemek için bir kaynağa başka bir bağlantısı vardır.
Seth Ladd problemle ilgili önemli görüşler edindi
Koşma, bir insanın basit durumundan yaratılabilir, güncellenebilir ve konuşulabilecek gerçek bir isme dönüştük.
Makineyi yeniden başlatmaya geri götürmek. Sana POST olacağını iddia ediyorum / VDC / 434 / küme / 4894 / sunucu / 4343 / yeniden başlatma Yayınladığınız sonra, temsil eden bir URI var bu yeniden başlatma ve durum güncellemeleri için GET olabilir. Köprü kurmanın büyüsü ile, Yeniden Başlat'ın temsili yeniden başlatılan Sunucuya bağlanır.
Bence URI alanını küçültmek ucuz ve URI'lar daha da ucuz. İsim olarak modellenmiş bir aktivite koleksiyonu oluşturun ve POST, PUT ve DELETE uzakta!
RESTful programlama web ölçeğinde Vogon bürokrasisidir. RESTful bir şeyi nasıl yaparsın ? Bunun için yeni evrak icat et ve evrakı dijitalleştir.
Biraz merak uyandıran dilde, yaptığınız şey "VM'yi kapatma" etki alanı uygulama protokolünü tanımlamak ve bu protokolü göstermeniz / uygulamanız için gereken kaynakları belirlemek.
Kendi örneklerine bakmak
PATCH /api/virtualmachines/42
Content-Type:application/json
{ "state": "shutting down" }
Bu iyi; gerçekten isteğin kendisine ayrı bir bilgi kaynağı olarak bakmıyorsunuz, ancak yine de başarabiliyorsunuz.
Değişimi temsil ettiğinizde biraz özlediniz.
Bununla birlikte PATCH ile, ekteki varlık, yeni bir sürüm üretmek için o anda sunucuda bulunan bir kaynağın nasıl değiştirilebileceğini açıklayan bir dizi talimat içerir.
Örneğin, JSON Patch ortam türü, bir JSON belgesini doğrudan değiştiriyormuşçasına talimatları biçimlendirir
[
{ "op": "replace", "path": "state", "value": "shutting down" }
]
Alternatifinde, fikir yakın, ama açıkçası doğru değil. hedef URL'dekiPUT
kaynağın durumunun tamamen değiştirilmesidir , bu nedenle muhtemelen tek bir varlığın temsilinin hedefi olarak bir koleksiyona benzeyen bir yazım denetimi yapmazsınız.
POST /api/virtualmachines/42/actions
Kuyruğa bir eylem eklediğimiz kurguyla tutarlı.
PUT /api/virtualmachines/42/latestAction
Sıradaki kuyruk öğesinde güncelleme yaptığımız kurguyla tutarlı; bu şekilde yapmak biraz garip. En küçük sürpriz ilkesi, her PUT'a, hepsini bir yere koymak ve aynı anda birden fazla kaynağı değiştirmek yerine, kendi benzersiz tanımlayıcısını vermeyi önerir.
URI'nin yazılışını tartıştığımız sürece, REST'in umrunda olmadığını; /cc719e3a-c772-48ee-b0e6-09b4e7abbf8b
, REST ile ilgili olarak mükemmel bir renk URI'sıdır. Okunabilirlik, değişken isimlerinde olduğu gibi ayrı bir husustur. RFC 3986 ile tutarlı olan yazım kurallarının kullanılması insanları daha mutlu edecektir .
CQRS
Peki ya potansiyel olarak birden fazla topluluğun güncelleştirilmesine yol açabilecek ya da somut kaynaklar ve alt kaynaklar üzerindeki CRUD işlemleriyle eşlenemeyen birçok "eylem" (aka komutu) içeren bir CQRS alanımız varsa?
Greg Young CQRS'de
CQRS, mimarisi için aksi takdirde bulunmayan birçok fırsatı sağlayan çok basit bir kalıptır. CQRS nihai tutarlılık değildir, olay değildir, mesajlaşma değildir, okuma ve yazma için ayrılmış modellere sahip değildir ve olay kaynağını kullanmaz.
Çoğu kişi CQRS hakkında konuştuğunda, gerçekten CQRS modelini uygulamanın hizmet sınırını temsil eden nesneye uygulama hakkında konuşuyorlar.
CQRS hakkında HTTP / REST bağlamında konuştuğunuz göz önüne alındığında, bu ikinci bağlamda çalıştığınızı varsaymanız makul gözükmektedir, bu yüzden devam edelim.
Bu, şaşırtıcı bir şekilde, önceki örneğinizden bile daha kolaydır. Bunun nedeni basittir: komutlar mesajlardır .
Jim Webber , HTTP’yi 1950’lerin ofisinin uygulama protokolü olarak tanımlar; iş mesajlar alıp gelen kutularına koyarak yapılır. Aynı fikir geçerli - bir formun boş bir kopyasını alıyoruz, bildiğimiz detayları doldurup teslim ediyoruz. Ta da
Mümkün olan yerlerde (örnek I'deki ilk yaklaşımı takip ederek) somut kaynaklar üzerinde somut olarak oluşturduğu veya güncellediği kadar komut vermeyi denemeli ve geri kalanı için "eylem bitiş noktaları" kullanmalı mıyız?
Evet, “somut kaynaklar” olduğu sürece, etki alanı modelindeki varlıklar yerine mesajlardır.
Anahtar fikir: REST API'niz hala bir arayüzdür ; istemcilerin mesajları değiştirmeye gerek kalmadan temel modeli değiştirebilmeniz gerekir. Yeni bir model yayınladığınızda, etki alanı protokolünüzü nasıl alacağınızı ve yeni modele nasıl uygulayacağınızı bilen web uç noktalarınızın yeni bir sürümünü yayınlarsınız.
CQRS modeli, API benzeri bir RPC için daha uygun mu?
Gerçekten değil - özellikle, web önbellekleri "sonunda tutarlı bir okuma modelinin" harika bir örneğidir. Her bir görüşünüzü bağımsız olarak adreslenebilir kılmak, her birinin kendi önbelleğe alma kuralları vardır, size ücretsiz olarak bir sürü ölçeklendirme sağlar. Okumak için sadece bir RPC yaklaşımına nispeten az itiraz var.
Yazma için, kandırıcı bir soru: tüm komutları tek bir uç noktadaki veya tek bir uç nokta ailesindeki tek bir işleyiciye göndermek kesinlikle daha kolaydır . REST, son noktanın müşteriye nerede iletişim kurduğu ile ilgili gerçekten daha fazla.
Bir mesajı kendi benzersiz kaynağı olarak ele almak, PUT'yi kullanabilme avantajına sahiptir, ara bileşenlerini mesajın kullanılmasının önemsiz olduğunu ve belirli hata işleme durumlarına katılabilmeleri konusunda uyarıda bulunur. . (Not: müşterilerin bakış açısından, eğer kaynaklar farklı URI'lar varsa, o zaman farklı kaynaklar olurlar; hepsinin, kaynak sunucuda aynı istek işleyici koduna sahip olmaları, üniforma tarafından gizlenen bir uygulama detayıdır. arayüz).
Fielding (2008)
Ayrıca, yukarıdakilerin henüz tamamen RESTful olmadığını, en azından bu terimi nasıl kullandığımı da not etmeliyim. Tek yaptığım, herhangi bir RPC'den daha fazla olmayan servis arayüzleri. RESTful yapmak için, hizmeti tanıtmak ve tanımlamak, formları ve / veya bağlantı şablonlarını kullanarak eşleştirmeyi nasıl gerçekleştireceğimi ve görselleştirmeleri faydalı şekillerde birleştirmek için kod sağlamak için köprü metni eklemem gerekecek.