Müşteri tarafında HATEOAS'ın amacı nedir?


35

Halen anladığım kadarıyla HATEOAS, temel olarak her şey, daha sonra yapılacaklar hakkında bilgi içeren her bir yanıt bağlantısını bir araya getirmekle ilgilidir. Basit bir örnek internette kolayca bulunabilir: bir hesap kaynağı ile birlikte bir bankacılık sistemi. Örnek, bir hesap kaynağına bir GET isteğinin ardından bu cevabı gösterir.

GET /account/12345 HTTP/1.1 HTTP/1.1 200 OK 
<?xml version="1.0"?> 
<account> 
    <account_number>12345</account_number> 
    <balance currency="usd">100.00</balance> 
    <link rel="deposit" href="/account/12345/deposit" /> 
    <link rel="withdraw" href="/account/12345/withdraw" /> 
    <link rel="transfer" href="/account/12345/transfer" /> 
    <link rel="close" href="/account/12345/close" /> 
</account>

Verilerle birlikte, daha sonra neler yapılabileceğini söyleyen bağlantılar vardır. Bakiye negatif ise,

GET /account/12345 HTTP/1.1 HTTP/1.1 200 OK 
<?xml version="1.0"?> 
<account> 
    <account_number>12345</account_number> 
    <balance currency="usd">-25.00</balance> 
    <link rel="deposit" href="/account/12345/deposit" /> 
</account>

Böylece sadece para yatırabiliriz. Her şey yolunda, Fiddler kullanıyorsanız veya tarayıcıdan istekte bulunursak neler yapılabileceğini kolayca görebiliriz. Bu tür bilgiler API'nin yeteneklerini keşfetmemiz için yararlıdır ve sunucu istemciden ayrılır.

Ne var ki, bir müşteri oluşturduğumuzda, Javascriptli bir SPA veya bir Android uygulaması veya başka birçok şey gibi, HATEOAS'ın ne kadar alakalı olduğunu göremiyorum. Demek istediğim şudur: SPA'yı javascript'te kodlarken, kodu yazmak için API'de neler yapılabileceğini bilmeliyim.

Bu yüzden kaynakları, desteklenen yöntemleri, ne almayı umduklarını ve sunucuya ajax çağrıları yazmak için ve hatta kullanıcı arayüzünü oluşturmak için ne geri verdiklerini bilmem gerekiyor. Kullanıcı Arayüzünü kurduğumda, hesap isteğinde bulunduktan sonra, örneğin bir hesaba para yatırabileceğimi veya kullanıcı arayüzünde bu seçeneği sağlayamayacağımı bilmeliyim. Ayrıca, ajax çağrısını oluşturmak için para yatırmak için URI’yi bilmem gerekecek.

Demek istediğim, API'ye talepte bulunduğumuzda, bağlantılar bizim API'yi daha iyi keşfetmemize ve kullanmamıza izin veriyor, ancak bir müşteri oluşturduğumuzda, oluşturduğumuz uygulama sadece linklere bakmayacak ve sonra kendi kendine oluşturulacak Doğru UI ve doğru ajax çağrıları yapmak.

Peki HATEOAS müşterileri için nasıl önemlidir? Neden zaten HATEOAS ile uğraşıyoruz?


1
Haklısın, ama mesele bu değil. HATEOAS, istemcideki sayfadaki bağlantılar için URI'ları oluşturmanıza engel olur.
James McLeod

Yanıtlar:


24

Yaptığımız uygulama basitçe bağlantılara bakmayacak ve sonra kendi başına doğru kullanıcı arayüzünü oluşturacak ve doğru ajax çağrılarını yapacak

Aslında, bu tam olarak HATEOAS neyi olacaktır UI verir. Değil Ne mümkün, ama ne zaman bu mümkün. Soru gibi, HAL gibi resmi bir HATEOAS , neyin mümkün olduğunu gösteren bağlantılar verir. Ancak bu bağlantılar ortaya çıktığında uygulamanın durumuna bağlıdır. Dolayısıyla, bağlantılar zamanla kaynağında değişebilir (daha önce gerçekleştirilmiş olan eylemlere dayanarak).

Bu, tüm olası durumları içeren bir UI oluşturmamızı sağlar , ancak bu durumların ne zaman aktif hale geldiği ile ilgilenmeyin . Örneğin, rel="deposit"kutunun varlığı make depositformu oluşturmanın uygun olduğu durumlarda kullanıcı arayüzüne doğrudan haber verebilir . Bu da kullanıcının bir değer girmesine ve bağlantıyı kullanarak göndermesine izin verir.


2
Yani, kullanıcı arayüzü oluştururken hala API'nin sunduğu her şeyi bilmemiz gerekir ve sonra bu bağlantılara bakarak sunucudaki bilgilerin durumunu biliyoruz. Mesela, UI para yatırmanın, çekmenin, transfer etmenin veya kapatmanın mümkün olduğunu biliyor (muhtemel rakipleri biliyor), sonra devleti görmek için neyin geri geldiğini kontrol ediyor?
user1620696

1
Evet, olabilir. Yine, almak istediğiniz dinamik ne kadar bağlıdır. Diğerlerinin de belirttiği gibi, sunucudaki bağlantıları değiştirme (ve müşterileri bozmama) diğer bir avantajdır. Bu, API'nizin hepsinin kullandığı bir iPhone, Android, Windows Phone, Mobil Web ve Web istemcilerine sahip olduklarında çok ilginç hale gelir (API'nizin başkalarının müşterileri için yayınlanması için yayınlanıp yayınlanmadığından bahsetmeyin).
Davin Tryon

@ user1620696 Yine de, eğer kaynak varsa, içerik türünü anlayan hem istemci hem de sunucu aracılığıyla tüm bunları bilmelisiniz. İçerik türü aptal xml veya Json'dan çok daha fazla. Müşterinin nasıl çalışacağını anladığı bazı "banka mevduatı" içerik türüne sahip olmalısınız
Cormac Mulhall

1
Bakmak @Nik HAL bağlantılar yanıt olarak verilmektedir nasıl bir örnek için.
Davin Tryon

1
evet, hala geriye dönük uyumluluk endişeleriniz var. Bu, bir sürüm üstbilgisi veya URL'ye sürüm ekleyerek çözülebilir. Fakat doğru anladığınızı söyleyebilirim.
Davin Tryon

3

Halen anladığım kadarıyla HATEOAS, temel olarak her şey, daha sonra yapılacaklar hakkında bilgi içeren her bir bağlantı bağlantısını birlikte gönderme

HATEOAS sadece bağlantılardan çok daha fazlasıdır. Uygulama durumunun motoru olarak "hiper medya" dır.

Açıklamanızda eksik olan içerik türü ve istemci ile sunucu arasında geçen hiper medyanın biçimsel tanımıdır.

HTML, bir hiper medya örneği ve HATEOS'un neden çalıştığına bir örnektir. HTML sayfasının kendisi, müşterinin (yani kullanıcının) site içinde hareket etmesini sağlayan motordur. HTML'yi kullanıcıya tamamen gezilebilir bir web sitesi sunma yeteneğine sahip bir tarayıcı. Basitçe diğer sayfalara linkler iletmekle kalmaz, onları linklere içerik veren anlamlı bir şekilde ve tarayıcının gezinilebilir bir site inşa etmesine izin veren bir şekilde iletir.

Ve en önemlisi, tarayıcı bunu SIFIR web sitesinin kendisinin önceden anlaşılmasıyla yapabilir. Tarayıcı sadece HTTP ve HTML'yi bilir. Bu basit anlayışa dayanarak, gezinmek için kullanıcıya New York Times sunabilir.

Bu "kullanıcı" başka bir bilgisayar programı olsa bile geçerlidir. Hiper medyanın kendisi navigasyon içeriğini tanımlamalıdır.


1
Bu bir müşteriyi tarayıcı olarak karmaşık (ve hataya eğilimli) inşa etmeniz gerektiği anlamına gelmez mi? Esneklik genellikle maliyet olarak karmaşıklıkla birlikte geliyor ...
Andres F.

@AndresF. Eğer anlamına gelmez gerekir veya gerekir , bu yüzden bunları sadece size istediğiniz veya gerekiyorsa dinamik olarak bunu yapmak için seçeneği sunar yapmak.
Peteris

2
@nik Tabii. Kafamın en üstünde, huzurlu api ile soy bilgisi veren bir hizmetin olduğunu hayal et. Onlar hakkında çeşitli bilgilere sahip bir 'Kişi' kaynağının biçimini tanımlayan, ancak aynı zamanda ilişkilerin nasıl göründüğünü de tanımlayan, 'kardeş' veya 'kız kardeş' veya 'anne' gibi şeyleri tanımlayan bir içerik türünüz var. Başka bir Kişi kaynağının URI'sine sahip olmak. HTTP fiillerini kullanan ve bu 'Kişi' içerik türünü anlayan oldukça basit bir istemci bu API'de gezinebilir. Belirli bir kişinin bütün torunlarını bulmak istediğinizi söyleyin.
Cormac Mulhall

2
@ nik Bu müşterinin erişmiş olduğu kaynağın içerik türünü ve HTTP fiillerini (GET, PUT, DELETE vb.) anlaması gerekir; bu API kaynaklarının getirilmesi ve güncellenmesi yoluyla gezinebilirsiniz. Ve, daha önemlisi, içerik türünü anlayan herhangi bir müşteri, bir URI aracılığıyla, tamamen başka bir sunucuya atlayabilir ve olduğu gibi devam edebilir. Hangi sunucuya konuştukları umrunda değil, sadece kaynağın içerik türünü önemsiyorlar, anlıyorlar mı, anlamıyorlar.
Cormac Mulhall

1
@Nik Öyleyse böyle bir durumda, orijinal içerik türünü (v1 Kişi deyin) ve yeni içerik türünü (Kişi v2 deyin) anlayan bir sunucunuz var. Müşteri yalnızca Kişi v1'i anlar. İstemci, HTTP'ye Kabul Et başlığı üzerinden hangi içerik türlerini anladığını sunucuya bildirir. İçerik görüşmesini kullanarak, sunucu müşterinin desteklediğini gönderip göndermeyeceğini belirler, bu durumda kaynağı Person v1 türünü kullanarak döndürür. Şimdi bu eski içerik türünü desteklemeyi bırakmak isteyebilir ve istemciye 406 hatası gönderebilirsiniz. Denemek ve desteklemek mümkün olsa da daha iyidir.
Cormac Mulhall

2

Dinamik olarak oluşturulmuş bir arayüz oluşturmak zorunda değilsiniz. Güzel olsa da gerekli değil. Dinamik bir arayüz oluşturamazsanız, sadece bağlantıları kullanın ve bitirdiniz. Dezavantajı, arka uçla tekrar bağlantıda olmanızın zor olması ve bir şey değiştiğinde çarpışmanızdır.

Dinamik düzeni kullanmak oldukça basit olabilir:

links.forEach(function(link) {

  switch(link.rel) {

    case 'deposit':
      showDepositButton();
      break;

    case 'withdraw':
      loadWithdrawForm(link.href);
      showWithdrawButton();
      break;
  }

});

Sizi müşteri kodunuza kaydeder:

if (balance <= 0 && negativeBalanceAllowed === false) {
  showWithdrawButton();
}

Müvekkilinizi değiştirmeden izin verilen bir olumsuz pozisyonu (örneğin, borç para alarak) uygulayabilirsiniz.


Biraz daha güçlü bir örnek olarak, banka, müşteri tarafına, her bir hesapta limitin ne olduğunu söylemek zorunda kalmadan, hesaplarında değişken fazla kredi limitleri sunabilir.
Bart van Ingen Schenau

Doğru denge limitleri kararını istediğiniz kadar karmaşık hale getirebilirsiniz ve yine de müşteride değişiklik yapmanız gerekmez. Bunu içerik türü gibi REST bölümleriyle daha da ileri götürürseniz, farklı görünümler gösterebilirsiniz. Örneğin, bir hesap işlemden farklı görünüyor. Ayrıca ilginç olanı talep kodudur (çok uygulanmadı). Bu bir borç tahmincisi için kullanılabilir. Arayüze basit bir hesap makinesi işlevi verebilir, böylece müşterinin sadece hesaplama için girişleri yapması gerekir. Arka uçtan itibaren güncel kalacaktır.
Luc Franken

2
Ancak genellikle müşterinin NEDEN geri çekilemediğini bilmesi gerekir, bu yüzden müşteriye ayrı bir alanda ENUM veya String göndermemiz gerekir reason. Ve eğer hala buna ihtiyacımız varsa, neden ona canWithdraweylemle bağlantısı yerine ona başka bir boole alanı göndermiyoruz ? Bir diğer avantaj, müşteriye dokunmadan bir işlemin URL'sini değiştirme yeteneğidir. Fakat .. URL’yi değiştirmek için ne sebep var? Çoğu durumda, aynı zamanda anlamsal ya da parametrelerde ya da istek / cevap şeklinde vb. Bazı değişiklikler. Dolayısıyla, müşteriyi değiştirmemiz gerekiyor. Bu yüzden, hala anlamadım - ne HATEOAS'ın amacı.
Ruslan Stelmachenko,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.