Apakah ada strategi untuk menemukan layanan REST menggunakan HATEOAS?

10

Saat membangun layanan REST dengan batasan HATEOAS , sangat mudah untuk mengiklankan keberadaan sumber daya melalui tautan. Anda membuat GETke root situs saya dan saya merespons dengan dokumen root yang mencantumkan semua sumber daya tingkat pertama:

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

Klien yang mengerti cara membaca hrefnilai - nilai ini dapat melakukan GETpermintaan pada mereka dan menemukan semua sumber daya saat ini yang tersedia dalam aplikasi.

Ini berfungsi baik untuk skenario pencarian dasar, tetapi tidak menunjukkan apakah sumber daya dapat diminta. Misalnya, mungkin masuk akal untuk melakukan:

GET /users?surname=Smith

Apakah ada format yang dapat mengekspresikan kemampuan kueri ini dengan informasi yang cukup sehingga klien dapat membentuk kueri yang koheren tanpa pengetahuan sumber daya yang diperlukan sebelumnya?

Selain itu, apakah ada cara untuk menyatakan bahwa klien diizinkan untuk melakukan POSTke lokasi tertentu dengan lokasi yang diharapkan. Misalnya, dapat diharapkan bahwa klien melakukan hal berikut untuk membuat sumber daya pertanyaan baru:

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..."
}

Saat menggunakan HTML sebagai format untuk konsumsi manusia, kita dapat mengekspresikan banyak hal ini melalui penggunaan formulir dan permintaan tertulis untuk memungkinkan manusia menemukan operasi yang diizinkan untuk dilakukan pada layanan.

Apakah ada format yang mampu melakukan hal serupa untuk klien?

Paul Turner
sumber
2
Masalah dengan menemukan layanan REST telah dibahas dan dijawab di sini: stackoverflow.com/questions/9101494/... Solusi paling sederhana adalah dengan menggunakan templat XHTML dengan formulir yang tidak hanya akan memberi tahu tentang metode yang dapat Anda gunakan, tetapi juga struktur objek yang akan dikirim melalui elemen form (input, pilih dll). Klien hanya perlu memiliki parser XML untuk menemukan apa yang mereka butuhkan. Cara lain adalah dengan Template URL tetapi mereka hanya membantu dengan sumber daya yang mengambil string kueri.
Spoike
Mengenai jenis konten; yang diselesaikan dengan negosiasi konten yang dilakukan dalam header HTTP. Jika server tidak dapat melayani jenis konten yang diminta, maka server tersebut harus mengembalikan kesalahan HTTP (seperti 300 atau 406) yang menyatakan jenis konten mana yang dapat dikembalikan.
Spoike

Jawaban:

1

Bagaimana Anda tahu input seperti apa yang dapat diterima? Dengan kata lain, jika klien Anda tidak memiliki pengetahuan sebelumnya, bagaimana Anda mendefinisikan semantik "nama keluarga"? Anda mulai masuk ke wilayah yang membutuhkan sesuatu seperti OWL .

Saya pikir lebih praktis untuk mengharapkan klien Anda memahami semantik dari tipe mime yang terkenal; katakan, misalnya, "text / vcard" untuk orang.

Stephen J. Anderson
sumber
Saya pikir penggunaan tipe konten adalah caranya; Saya dapat dengan mudah mengubah aplikasi saya untuk digunakan application/atomapp+xmldan membuatnya tersedia untuk semua klien yang sudah memahami format ini. Kemungkinan ada cukup banyak jenis konten terkenal di luar sana untuk menjadikan ini solusi praktis.
Paul Turner
Saya pikir komentar oleh @Spoike adalah pendekatan REST-ian yang elegan untuk bagian lain dari masalah; bahkan jika klien tahu bahwa (misalnya) pengguna direpresentasikan sebagai vCard, ia masih perlu mengetahui subset properti pengguna yang tersedia untuk pencarian.
Stephen J. Anderson
4

Anda dapat mempublikasikan detail layanan Anda melalui "WADL"

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

Ini opsional dan tidak setiap teknologi backend REST mendukung ini. Jersey, implementasi java "resmi" dari jax-rs, mendukungnya misalnya - dapat dibuat secara otomatis untuk Anda.

Ini cukup langka, untuk melihatnya digunakan.

Saya tidak tahu yang besar menggunakannya. Secara umum Anda memiliki halaman web yang menggambarkan api.

unludo
sumber
1
CXF adalah implementasi Java JAX-RS besar lainnya yang mendukung WADL, dan Anda juga mulai melihat beberapa konsumen WADL pihak ketiga yang menarik sekarang juga.
Donal Fellows
0

Musim semi memiliki beberapa dukungan untuk ini seperti halnya gelisah.

jiggy
sumber