Öncelikle para transferi, tek bir kaynak çağrısında yapamayacağınız bir şey değildir. Yapmak istediğiniz eylem para göndermektir. Böylece gönderenin hesabına bir para transferi kaynağı eklersiniz.
POST: accounts/alice, new Transfer {target:"BOB", abmount:100, currency:"CHF"}.
Bitti. Bunun atomik vb. Olması gereken bir işlem olduğunu bilmenize gerek yok. Sadece para transfer edersiniz. A'dan B'ye para gönderin.
Ancak buradaki ender durumlar için genel bir çözüm:
Pek çok kaynağı tanımlanmış bir bağlamda içeren çok karmaşık bir şey yapmak istiyorsanız, aslında neye karşı neden engelini aşan birçok kısıtlama (iş ve uygulama bilgisi) durumu aktarmanız gerekir. REST, vatansız olması gerektiğinden, bir müşteri olarak eyaleti başka bir yere aktarmanız gerekir.
Durumu aktarırsanız, içindeki bilgileri istemciden gizlemeniz gerekir. Müşteri, yalnızca uygulama için gerekli olan dahili bilgileri bilmemeli, ancak iş açısından ilgili bilgileri taşımamalıdır. Bu bilgilerin ticari değeri yoksa, devlet şifrelenmeli ve simge, geçiş veya benzeri bir metafor kullanılması gerekir.
Bu yolla kişi dahili durumu geçirebilir ve şifreleme ve sistem imzalama hala güvenli ve sağlam olabilir. Müşteri için neden durum bilgisini aktardığını doğru soyutlamayı bulmak, tasarım ve mimariye bağlı bir şeydir.
Gerçek çözüm:
REST'in HTTP'den bahsettiğini ve HTTP'nin çerez kullanma konseptiyle geldiğini unutmayın. Bu çerezler, insanlar REST API ve birden çok kaynağı veya isteği kapsayan iş akışları ve etkileşimler hakkında konuştuğunda genellikle unutulur.
Wikipedia'da HTTP çerezleri hakkında yazılanları hatırlayın:
Çerezler, web sitelerinin durum bilgisi olan bilgileri (bir alışveriş sepetindeki öğeler gibi) hatırlaması veya kullanıcının göz atma faaliyetini (belirli düğmeleri tıklama, oturum açma veya kullanıcı tarafından o ana kadar hangi sayfaların ziyaret edildiğini kaydetme dahil) kaydetmesi için güvenilir bir mekanizma olarak tasarlanmıştır. aylar veya yıllar önce).
Dolayısıyla, temelde durumu iletmeniz gerekiyorsa, bir çerez kullanın. Tam olarak aynı sebep için tasarlanmıştır, HTTP'dir ve bu nedenle tasarım gereği REST ile uyumludur :).
Daha iyi çözüm:
Birden fazla isteği içeren bir iş akışını gerçekleştiren bir müşteriden bahsediyorsanız, genellikle protokol hakkında konuşursunuz. Her protokol biçimi, B'yi yapmadan önce A adımını gerçekleştirmek gibi her potansiyel adım için bir dizi ön koşulla birlikte gelir.
Bu doğaldır ancak protokolü istemcilere açıklamak her şeyi daha karmaşık hale getirir. Bundan kaçınmak için, gerçek dünyada karmaşık etkileşimler ve şeyler yapmamız gerektiğinde ne yaptığımızı bir düşünün ... Bir Ajan kullanıyoruz.
Temsilci metaforunu kullanarak, sizin için gerekli tüm adımları gerçekleştirebilecek ve uyguladığı fiili atamayı / talimatları kendi listesinde saklayabilecek bir kaynak sağlayabilirsiniz (böylece POST'u temsilci veya bir 'ajans' üzerinde kullanabiliriz).
Karmaşık bir örnek:
Bir ev satın almak:
Güvenilirliğinizi kanıtlamanız (polis kaydı girişlerinizi sağlamak gibi), finansal ayrıntıları sağlamanız, gerçek evi bir avukat ve parayı saklayan güvenilir bir üçüncü kişi aracılığıyla satın almanız, evin artık size ait olduğunu doğrulamanız ve satın alma malzemelerini vergi kayıtlarınıza vb. ekleyin (örnek olarak, bazı adımlar yanlış veya her neyse)
Bu adımların tamamlanması birkaç gün sürebilir, bazıları paralel olarak yapılabilir vb.
Bunu yapmak için, acenteye ev satın alma görevi vermeniz yeterli:
POST: agency.com/ { task: "buy house", target:"link:toHouse", credibilities:"IamMe"}.
Bitti. Acente, size bu işin durumunu görmek ve takip etmek için kullanabileceğiniz bir referans gönderir ve geri kalanı ajans temsilcileri tarafından otomatik olarak yapılır.
Örneğin bir hata izleyiciyi düşünün. Temel olarak hatayı rapor edersiniz ve neler olup bittiğini kontrol etmek için hata kimliğini kullanabilirsiniz. Bu kaynaktaki değişiklikleri dinlemek için bir hizmet bile kullanabilirsiniz. Görev Tamamlandı.