HATEOAS kullanarak REST hizmetlerini keşfetmek için stratejiler var mı?


10

HATEOAS kısıtlaması ile bir REST hizmeti oluştururken, bağlantı yoluyla kaynakların varlığını tanıtmak çok kolaydır. Bir yapmak GETsitemde ve tüm birinci kademe kaynaklarını listeleyen kök belgesiyle ben cevabın köküne:

{
    users: { href: "/users" }
    questions { href: "/questions" }
}

Bu hrefdeğerlerin nasıl okunacağını anlayan istemciler bu GETistekleri gerçekleştirebilir ve uygulamada mevcut olan tüm kaynakları keşfedebilir.

Bu, temel arama senaryoları için iyi çalışır, ancak bir kaynağın sorgulanabilir olup olmadığını göstermez. Örneğin, şunları yapmak makul olabilir:

GET /users?surname=Smith

Bu sorgu yeteneğini, bir istemcinin kaynak hakkında önceden bilgi sahibi olmadan tutarlı bir sorgu oluşturabileceği yeterli bilgi ile ifade edebilecek formatlar var mı?

Ayrıca, bir istemcinin POSTbelirli bir konuma, beklenen bir konuma sahip olmasına izin verildiğini ifade etmenin herhangi bir yolu var mı ? Örneğin, bir istemcinin yeni bir soru kaynağı oluşturmak için aşağıdakileri gerçekleştirmesi beklenebilir:

POST /questions

{
    title: "Are there strategies for discovering REST services using HATEOAS?",
    body: "When building a REST service with the HATEOAS constraint, it's very..."
}

HTML'yi insan tüketimi için format olarak kullanırken, bir insanın bir hizmet üzerinde gerçekleştirmesine izin verilen işlemleri keşfetmesini sağlamak için formlar ve yazılı bilgi istemleri kullanarak bunların çoğunu ifade edebiliriz.

İstemciler için benzer şeyler yapabilen biçimler var mı?


2
Bir REST hizmetini keşfetmeyle ilgili sorun burada tartışıldı ve yanıtlandı: stackoverflow.com/questions/9101494/… En basit çözüm, yalnızca kullanabileceğiniz yöntemle ilgili değil, aynı zamanda form öğeleri üzerinden gönderilecek nesne yapısı (girdi, seçim vb.). İstemcilerin ihtiyaç duyduklarını bulmak için yalnızca XML ayrıştırıcıları olması gerekir. Başka bir yol URL Şablonlarıdır, ancak yalnızca sorgu dizeleri alan kaynaklarda yardımcı olurlar.
Spoike

İçerik türleri ile ilgili olarak; HTTP üstbilgilerinde yapılan içerik anlaşmasıyla çözülür . Sunucu istenen bir içerik türünü sunamıyorsa, hangi içerik türlerini döndürebileceğini belirten bir HTTP hatası (300 veya 406 gibi) döndürmelidir.
Spoike

Yanıtlar:


1

Ne tür girdilerin kabul edilebilir olduğunu nasıl bilebilirsiniz? Yani müşterinizin önceden bilgisi yoksa "soyadı" anlamını nasıl tanımlarsınız? OWL gibi bir şeye ihtiyaç duyduğunuz bölgeye girmeye başlıyorsunuz .

Müşterilerinizin tanınmış mim türlerinin anlambilimlerini anlamalarını beklemenin daha pratik olduğunu düşünüyorum; örneğin, insanlar için "metin / vcard" diyelim.


Bence içerik türünü kullanmanın yolu bu; Uygulamamı kullanmak için kolayca değiştirebilir application/atomapp+xmlve bu biçimi zaten anlayan tüm istemciler için kullanılabilir hale getirebilirim. Bunu pratik bir çözüm haline getirmek için yeterince iyi bilinen içerik türleri vardır.
Paul Turner

@Spoike'ın yorumunun, sorunun diğer yarısına zarif bir REST-ian yaklaşımı olduğunu düşünüyorum; müşteri (örneğin) bir kullanıcının vCard olarak temsil edildiğini bilmesine rağmen, kullanıcının özelliklerinin hangi alt kümesinin arama için kullanılabilir olduğunu bilmeye devam etmesi gerekir.
Stephen J. Anderson

4

Bir "WADL" aracılığıyla hizmetlerinizle ilgili ayrıntıları yayınlayabilirsiniz

http://en.wikipedia.org/wiki/Web_Application_Description_Language

Opsiyoneldir ve her arka uç REST teknolojisi bunu desteklemez. Jersey, jax-rs'in "resmi" java uygulamasıdır, örneğin bunu destekler - sizin için otomatik olarak oluşturulabilir.

Ancak kullanıldığını görmek oldukça nadirdir.

Onu kullanan büyükleri bilmiyorum. Genelde API'yi açıklayan bir web sayfanız var.


1
CXF, WADL'yi destekleyen başka bir büyük Java JAX-RS uygulamasıdır ve şimdi de birkaç ilginç üçüncü taraf WADL tüketicisini görmeye başlıyorsunuz.
Donal Fellows

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.