Apa hubungannya "HATEOAS" dengan Status Aplikasi?

10

HATEOAS adalah akronim untuk "Hypermedia As Engine Of Application State". Apa yang dimaksud dengan "Mesin Negara Aplikasi", dan khususnya - bagaimana "mesin hypermedia" itu?

Sejauh yang saya bisa mengerti, HATEOAS, dan standar terkait seperti HAL, membahas bagian "dapat ditemukan" dari REST.

The Musim Semi diskusi tentang hal itu merangkum sebagai:

Dengan HATEOAS, output membuatnya mudah untuk mengumpulkan cara berinteraksi dengan layanan tanpa mencari spesifikasi atau dokumen eksternal lainnya.

Apa yang tampaknya dikatakan adalah bahwa ketika Anda melakukan respons yang sesuai dengan HATEOAS, menggunakan misalnya JSON yang sesuai dengan HAL, maka klien tidak perlu membuat hardcode jalur sumber daya apa pun kecuali URL API root.

Yang masuk akal, kecuali bahwa tampaknya tidak ada hubungannya dengan "Status Aplikasi". Paling-paling, dengan Konfigurasi Server (IE jika saya mengubah URL untuk sumber daya (Konfigurasi Server), konsumen masih dapat mengetahui di mana menemukannya.


Menguraikan sedikit tentang apa yang saya dapat hate bahwa HATEOAS adalah tentang, ada kutipan ini dari halaman deskripsi yang sama. Apa yang diperlihatkan adalah bahwa HATEOAS memecahkan masalah menemukan di mana sumber daya berada. Tetapi sepertinya tidak berhubungan dengan "Status Aplikasi" ....

Presentasi JSON sederhana secara tradisional diberikan sebagai:

{ 
    "name" : "Alice"
}

Data pelanggan ada di sana, tetapi data tersebut tidak berisi apa pun tentang tautan yang relevan.

Respons berbasis HATEOAS akan terlihat seperti ini:

{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } ]
}

Tanggapan ini tidak hanya memiliki nama orang tersebut, tetapi termasuk URL yang menghubungkan sendiri di mana orang itu berada.

GreenAsJade
sumber
Harap pastikan orang dapat memahami pertanyaan Anda tanpa mengklik tautan.
candied_orange
Saya berharap pertanyaannya mandiri. Tautan yang disematkan dimaksudkan untuk menunjukkan dari mana kutipan itu berasal, tetapi kutipan itu berdiri sendiri (saya pikir?)
GreenAsJade
'Apa yang dimaksud dengan "Mesin Negara Aplikasi"? <- Aku masih tidak melihat kamu memperkenalkan konsep ini jadi pertanyaannya muncul entah dari mana.
candied_orange
1
@candied_orange Saya telah mengirimkan hasil edit untuk menambahkan 'HATEOAS adalah akronim untuk "Hypermedia As The Engine Of Application State". 'untuk pertanyaan itu.
bdsl
Mari kita mulai dari awal. Apa pemahaman Anda tentang "Status Aplikasi".
Laiv

Jawaban:

9

Aplikasi web, tenang atau tidak, umumnya bukan sekadar layanan data; itu memperlihatkan berbagai sumber daya dan menyediakan beberapa perilaku, dan karenanya ia memiliki keadaan; perbedaan dibuat antara status sumber daya (klien-independen, dikelola oleh aplikasi), dan status aplikasi , yang spesifik untuk klien. Aplikasi tanpa kewarganegaraan tidak menyimpan status aplikasi (khusus klien); alih-alih, itu memungkinkan klien bertanggung jawab untuk itu, dan menyediakan API yang memungkinkan untuk mentransfer status (aplikasi) bolak-balik (dengan demikian " S tate T ransfer" di RE ST). Dari perspektif klien, aplikasi web adalah mesin negara, berada di belakang API yang memungkinkan interaksi, tetapi bagian dari negara disediakan sebagai informasi kontekstual oleh klien, untuk melengkapi permintaan.

Sekarang, saat mempelajari REST, Anda mungkin menemukan sesuatu yang disebut The Richardson Maturity Model- ini menggambarkan "kematangan" API aplikasi web (berkembang selama bertahun-tahun), tetapi bermanfaat bagi kita sebagai semacam referensi yang menempatkan segala sesuatu dalam konteks. Dalam model ini, semua level kematangan, kecuali yang terakhir, pada dasarnya menyediakan API yang memfasilitasi RPC melalui HTTP. Dalam gaya desain API ini, HTTP digunakan sebagai mekanisme transportasi, tetapi komunikasi aktual terjadi melalui protokol khusus, sehingga sistem yang berinteraksi (klien dan aplikasi) bergantung pada apa yang disebut "informasi band keluar" untuk berkomunikasi (dalam hal ini konteks, ini hanya berarti bahwa sistem ini berkomunikasi menggunakan beberapa standar khusus daripada memanfaatkan hypertext / hypermedia dan, katakanlah, protokol HTTP yang ada). Jadi apa yang mendorong transfer negara dan transisi negara ("engine of application state") bukanlah hypermedia dalam kasus ini.

Tingkat kematangan akhir memperkenalkan batasan HATEOAS, dan hanya saat itulah API menjadi tenang. Klien memulai interaksi melalui URI awal; server merespon dengan representasi yang cocok berbasis hypermedia dari negara aplikasi (yang mungkin berbeda antara perangkat, atau klien, atau karena berbagai kondisi - sehingga " Re presentasi" di RE ST), yang meliputi tindakan self-describing yang memungkinkan klien memulai transisi status berikutnya (jadi hypermedia adalah apa yang secara langsung mendukung dan mendorong status aplikasi).

Dapatkah saya mengambil pernyataan bahwa "Status Aplikasi adalah khusus klien". Begitulah cara saya memahaminya. [...] Ini semua berkaitan dengan ketersediaan sumber daya sisi server, tidak ada (jelas yang bisa saya lihat) yang berkaitan dengan keadaan klien ...

Biarkan saya terlebih dahulu memastikan bahwa kita berada di halaman yang sama. Ini bukan keadaan klien (seperti pada, keadaan internal klien itu sendiri), melainkan keadaan aplikasi web yang khusus untuk klien tertentu.

Contoh yang Anda sebutkan tidak benar-benar menggambarkannya dengan baik, tetapi daftar tautan yang dikembalikan pada dasarnya dihasilkan secara dinamis di server dan mewakili transisi status yang saat ini tersedia, dan karenanya, menyandikan status aplikasi saat ini (untuk klien tertentu). Perhatikan bahwa Anda dapat memilih untuk mentransfer bit lain dari informasi terkait negara (di kedua arah) jika aplikasi Anda memerlukannya (sehingga Anda tidak terbatas pada metadata transisi negara), tetapi kendalanya adalah jangan pernah mengingat data khusus klien pada server, karena itu menyakiti salability. Perhatikan juga bahwa negara ini tidak harus lengkap (tidak harus sepenuhnya bermakna ketika Anda melihatnya secara terpisah), tetapi itu harus cukup bagi pihak penerima untuk membuat keputusan dan melakukan logika berdasarkan itu dan tidak ada yang lain (jadi,

HATEOAS memanfaatkan antarmuka seragam (standar umum dan format pertukaran data) untuk memisahkan klien dan server sehingga di sisi server mereka dapat mengaduk-aduk barang di belakang "kontrak" yang ditentukan oleh jenis hypermedia, tetapi juga karena komunikasi berdasarkan informasi band (protokol khusus) sering tidak memanfaatkan infrastruktur jaringan dengan cara yang ingin dilakukan REST. (Lihat diskusi di bawah ini.)

Dalam contoh Anda, klien tidak akan mendasarkan logikanya pada URI, tetapi pada metadata (atau anotasi), seperti atribut "rel". Misalnya, peramban tidak peduli tentang URI dalam tautan, ia hanya perlu mengetahui jenis tautannya (tautan yang dapat diklik, formulir yang dapat digunakan untuk membuat URI, referensi stylesheet, dll.)

ISTIRAHAT dalam Konteks

Sayangnya, REST telah menjadi kata kunci, dan semua orang berbicara tentang bagaimana menjadi RESTful, tetapi seluruh konteks REST hilang, dan Anda tidak dapat memahami gaya arsitektur REST tanpa memahami konteks ini (apa masalah sebenarnya REST mencoba menyelesaikan).

REST adalah generalisasi arsitektur di balik Web . Bagi kebanyakan dari kita, Web adalah sebuah platform. Tetapi bagi orang yang mengembangkan REST, WWW adalah sebuah aplikasi , yang memiliki serangkaian persyaratan tertentu, yang berjalan pada jaringan di seluruh dunia. Jadi REST dimaksudkan untuk sistem yang seperti Web dalam beberapa hal penting, yang perlu memuaskan seperangkat properti tertentu.

Ini adalah sistem jaringan skala besar yang berumur panjang (beberapa dekade). Ini adalah sistem yang menjangkau batas-batas organisasi (misalnya perusahaan yang berkolaborasi), atau batas-batas antara berbagai subtansi dalam organisasi besar (seperti divisi yang berbeda, dan bahkan tim). Meskipun ada kolaborasi, semua entitas yang terlibat sebagian besar beroperasi (bekerja, mengembangkan, dan menggunakan perangkat lunak) dengan persyaratan mereka sendiri, dengan kecepatan mereka sendiri, dengan masalah keamanan mereka sendiri, dan mereka semua menggunakan perangkat yang berbeda, sistem operasi, dll. perlu mengakses, dan berbagi referensi ke, sumber daya masing-masing (dokumen, layanan, data) masing-masing, sambil dapat berkembang secara mandiri dan bertahap, tanpa harus melakukan koordinasi yang luas (heck, sulit untuk membuat orang melakukan penyebaran yang terkoordinasi bahkan dalam organisasi yang sama).

Mereka yang menyediakan layanan harus dapat melakukan hal-hal seperti mengembangkan versi layanan, menambahkan node, atau mengacak data dengan efek minimal pada klien. Mereka perlu mengukur. Klien (yang mungkin merupakan layanan) perlu tetap bekerja terlepas dari semua aktivitas ini di sisi server. Sistem tersebut kemungkinan akan digunakan dengan cara yang tidak diantisipasi di masa depan. Sumber daya yang mereka akses dan tukar dapat dari berbagai jenis, dan direalisasikan (dikodekan, diketik, diwakili, terstruktur) secara internal (oleh penyedia layanan) dengan berbagai cara, tetapi meskipun demikian, untuk keseluruhan sistem / jaringan, cara yang konsisten untuk akses sumber daya dan struktur data dan respons diperlukan (antarmuka seragam).

REST memperhitungkan semua ini, dan sangat mempertimbangkan sifat-sifat jaringan. Ini dimaksudkan untuk memenuhi kebutuhan aplikasi yang, pada tingkat tinggi (dalam domain bisnis mereka sendiri), serupa dalam hal persyaratan dan kendala dengan apa yang diuraikan di atas (atau ingin menjadi).

Memang benar, tapi itu bukan obat mujarab. Ada biaya dan pertukaran. Itu memaksakan gaya komunikasi tertentu, dan ada hit kinerja. Anda selalu mentransfer data dengan cara kasar, seringkali data yang sama berulang kali, dalam format yang digeneralisasi (dan karenanya mungkin bukan yang paling efisien untuk layanan Anda), dengan sekelompok metadata, seringkali melintasi node jaringan menengah ( dengan demikian semua caching di Web - meminimalkan pengiriman data bolak-balik, menjaga klien dari layanan bila memungkinkan). Kinerja yang dirasakan pengguna penting, yang memengaruhi cara Anda menulis klien (inilah sebabnya browser mulai merender halaman sebelum semuanya diunduh atau siap). Tetapi Anda dengan senang hati membayar biaya itu untuk dapat membangun sistem dengan properti yang dijelaskan di atas.

Sebaliknya, jika Anda membangun sistem yang memiliki persyaratan / kendala berbeda, biayanya mungkin tidak sepadan.

Filip Milovanović
sumber
Terima kasih atas tanggapan terperinci ini. Dapatkah saya mengambil pernyataan bahwa "Status Aplikasi adalah khusus klien". Begitulah cara saya memahaminya. Jadi apa yang saya tidak mengerti adalah apa representasi HAL yang kita lihat dalam contoh-contoh yang ada hubungannya dengan keadaan aplikasi khusus klien? Ini semua ada hubungannya dengan ketersediaan sumber daya sisi server, tidak ada (jelas yang bisa saya lihat) yang berkaitan dengan keadaan klien ...
GreenAsJade
@GreenAsJade: Maaf atas jawaban yang terlambat, tetapi saya telah memperluas jawaban saya untuk menjawab pertanyaan Anda dengan lebih baik.
Filip Milovanović
10

Jika Anda ingin memahami REST, atau HATEOAS, Anda mungkin harus mulai dengan memahami web . HAL (efektif) hanyalah pengganti HTML; jika Anda memahami bagaimana HTML "bekerja", maka memahami peran HAL jauh lebih mudah.

Apa yang dimaksud dengan "Mesin Negara Aplikasi"?

Bab 5 dari Tesis Fielding .

REST didefinisikan oleh empat batasan antarmuka: identifikasi sumber daya; manipulasi sumber daya melalui representasi; pesan deskriptif diri; dan, hypermedia sebagai mesin status aplikasi. - Antarmuka Seragam

Oleh karena itu keadaan aplikasi ditentukan oleh permintaan yang tertunda, topologi komponen yang terhubung (beberapa di antaranya mungkin memfilter data buffered), permintaan aktif pada konektor tersebut, aliran data representasi dalam menanggapi permintaan tersebut, dan pemrosesan dari mereka representasi saat diterima oleh agen pengguna. - Tampilan Data

Oleh karena itu aplikasi model merupakan mesin yang bergerak dari satu keadaan ke keadaan berikutnya dengan memeriksa dan memilih dari antara transisi keadaan alternatif dalam rangkaian representasi saat ini. Tidak mengherankan, ini persis sesuai dengan antarmuka pengguna browser hypermedia. Namun, gaya tersebut tidak menganggap bahwa semua aplikasi adalah browser. Faktanya, detail aplikasi disembunyikan dari server oleh antarmuka konektor generik, dan dengan demikian agen pengguna dapat menjadi robot otomatis yang melakukan pencarian informasi untuk layanan pengindeksan, agen pribadi yang mencari data yang sesuai dengan kriteria tertentu, atau pemeliharaan spider busy patroli informasi untuk referensi yang rusak atau konten yang dimodifikasi - Tampilan Data

Pertimbangkan cara kerja pencarian Google: Anda menggunakan bookmark untuk memperbarui salinan formulir pencarian yang di-cache secara lokal, memuat formulir, mengetik kueri Anda ke dalam formulir, mengirimkannya, dan membaca hasilnya. Tidak ada yang membutuhkan kemampuan Google apa pun yang dibangun ke dalam klien - semuanya menggunakan kemampuan HTML; metadata disertakan dengan formulir yang memberitahu browser (melalui aturan pemrosesan standar) bagaimana membangun permintaan HTTP yang akan mengembalikan representasi dari sumber daya yang diistirahatkan (alias hasil pencarian).

HAL memainkan peran yang sama - klien yang sadar HAL dapat menerapkan aturan pemrosesan untuk menemukan tautan dalam representasi, dan melakukan hal-hal cerdas dengan tautan tersebut. Klien sadar JSON tidak bisa, karena tidak ada dalam model pemrosesan JSON yang mendefinisikan tautan.

VoiceOfUnreason
sumber