Seberapa berguna / penting REST HATEOAS (tingkat kematangan 3)?


110

Saya terlibat dalam proyek di mana beberapa anggota tim senior percaya bahwa REST API harus sesuai dengan HATEOAS dan menerapkan semua tingkat kedewasaan Richardson ( http://martinfowler.com/articles/richardsonMaturityModel.html )!

AFAIK kebanyakan implementasi REST tidak sesuai dengan HATEOAS dan seharusnya ada alasan bagus mengapa lebih banyak orang yang tidak melakukannya. Saya dapat memikirkan alasan seperti kompleksitas tambahan, kurangnya kerangka kerja (sisi server dan klien), masalah kinerja dan ...

Bagaimana menurut anda? Apakah Anda pernah memiliki pengalaman dengan HATEOAS dalam proyek dunia nyata?


Berikut adalah artikel yang bagus tentang subjek: medium.com/@andreasreiser94/… Pada dasarnya, cara "REST" biasanya diimplementasikan, ini adalah RPC ...
masterxilo

Jawaban:


213

Tak seorang pun di komunitas REST yang mengatakan REST itu mudah. HATEOAS hanyalah salah satu aspek yang menambah kesulitan pada arsitektur REST.

Orang tidak melakukan HATEOAS karena semua alasan yang Anda sarankan: itu sulit. Ini menambah kerumitan pada sisi server dan klien (jika Anda benar-benar ingin memanfaatkannya).

NAMUN, miliaran orang merasakan manfaat dari REST hari ini. Tahukah Anda apa itu URL "checkout" di Amazon? Bukan saya. Namun, saya dapat melakukan pembayaran setiap hari. Apakah URL itu berubah? Entahlah, aku tidak peduli.

Tahukah kamu apakah peduli? Siapa pun yang menulis layar melanggar klien otomatis Amazon. Seseorang yang mungkin dengan susah payah mengendus lalu lintas web, membaca halaman HTML, dll. Untuk menemukan tautan apa yang harus dipanggil kapan dan dengan muatan apa.

Dan segera setelah Amazon mengubah proses internal dan struktur URL mereka, klien yang diberi kode keras tersebut gagal - karena tautannya rusak.

Namun, para peselancar web biasa dapat berbelanja sepanjang hari tanpa hambatan.

Itu REST dalam tindakan, hanya ditambah dengan manusia yang mampu menafsirkan dan memahami antarmuka berbasis teks, mengenali grafik kecil dengan keranjang belanja, dan mencari tahu apa artinya sebenarnya.

Kebanyakan orang yang menulis perangkat lunak tidak melakukan itu. Kebanyakan orang yang menulis klien otomatis tidak peduli. Kebanyakan orang merasa lebih mudah untuk memperbaiki klien mereka ketika mereka rusak daripada merekayasa aplikasi agar tidak rusak di tempat pertama. Kebanyakan orang tidak memiliki cukup klien di tempat yang penting.

Jika Anda menulis API internal untuk berkomunikasi antara dua sistem dengan dukungan teknis ahli dan IT di kedua sisi lalu lintas, yang dapat mengomunikasikan perubahan dengan cepat, andal, dan dengan jadwal perubahan, maka REST tidak akan memberi Anda apa pun. Anda tidak membutuhkannya, aplikasi Anda tidak cukup besar, dan umurnya tidak cukup lama untuk menjadi masalah.

Situs besar dengan basis pengguna besar mengalami masalah ini. Mereka tidak bisa hanya meminta orang-orang untuk mengubah kode klien mereka saat berinteraksi dengan sistem mereka. Jadwal pengembangan server tidak sama dengan jadwal pengembangan klien. Perubahan mendadak pada API tidak dapat diterima oleh semua orang yang terlibat, karena mengganggu lalu lintas dan operasi di kedua sisi.

Jadi, operasi seperti itu kemungkinan besar akan mendapat manfaat dari HATEOAS, karena lebih mudah untuk versinya, lebih mudah bagi klien lama untuk bermigrasi, lebih mudah untuk kompatibel ke belakang daripada tidak.

Klien yang mendelegasikan sebagian besar alur kerjanya ke server, dan bertindak berdasarkan hasil jauh lebih kuat untuk perubahan server daripada klien yang tidak.

Tetapi kebanyakan orang tidak membutuhkan fleksibilitas itu. Mereka menulis kode server untuk 2 atau 3 departemen, semuanya penggunaan internal. Jika rusak, mereka memperbaikinya, dan mereka telah memperhitungkannya dalam operasi normal mereka.

Fleksibilitas, baik dari REST atau apa pun, menghasilkan kompleksitas. Jika Anda menginginkannya sederhana, dan cepat, maka Anda tidak membuatnya fleksibel, Anda "lakukan saja", dan selesai. Saat Anda menambahkan abstraksi dan dereferensi ke sistem, maka hal-hal menjadi lebih sulit, lebih banyak pelat boiler, lebih banyak kode untuk diuji.

Banyak dari REST gagal dalam poin peluru "Anda tidak akan membutuhkannya". Sampai, tentu saja, Anda melakukannya.

Jika Anda membutuhkannya, gunakanlah, dan gunakan seperti yang sudah ditata. REST tidak mendorong hal-hal bolak-balik melalui HTTP. Tidak pernah, ini jauh lebih tinggi dari itu.

Tetapi ketika Anda benar-benar membutuhkan REST, dan Anda menggunakan REST, maka HATEOAS adalah sebuah kebutuhan. Itu adalah bagian dari paket, dan kunci untuk membuatnya bekerja sama sekali.


11
Saya merasa Anda harus memiliki setidaknya seribu lebih suka untuk jawaban ini. Sejujurnya, saya harus membayangkan: Seberapa penting pertanyaan REST yang 'nyata' muncul sedikit. Sial, saya sedang melakukan googling hanya untuk alasan itu amunisi yang akan digunakan dalam pertemuan yang akan datang ketika saya menemukan utas ini.
nograde

2
terima kasih Tuhan (atau kode), seseorang berbicara tentang kerugian dari HATEOAS juga!
IlliakaillI

6
Apakah ada keuntungan lain selain kemampuan untuk mengubah URL dengan mudah? Anda tidak bisa hanya menambahkan opsi baru karena tidak seperti manusia, program tidak dapat bekerja dengan sesuatu yang baru. Selain itu, Anda hanya beralih dari membangun URL yang mengetahui ke mengetahui nama tindakan.
Jimmy T.

Jika konsumen API tidak tahu apa-apa, ia hanya dapat mendelegasikan tindakan pengguna 1: 1
Jimmy T.

2
Mengenai perubahan URL, jangan lupa bahwa klien Anda mungkin menggunakan cache dan karenanya, Anda harus menjaga perilaku di server untuk menangani URL sebelumnya juga (atau cukup lakukan pengalihan). Seperti strategi apa pun untuk mengembangkan API, Anda harus menjaga perilaku lama Anda tetap berfungsi. HATEOAS tidak banyak membantu di sana.
Bruno Costa

21

Ya, saya memiliki pengalaman dengan hypermedia di API. Berikut ini beberapa manfaatnya:

  1. Explorable API: Ini mungkin terdengar sepele tapi jangan meremehkan kekuatan API yang bisa dieksplorasi. Kemampuan untuk menjelajahi data membuatnya lebih mudah bagi pengembang klien untuk membangun model mental dari API dan struktur datanya.

  2. Dokumentasi sebaris: Penggunaan URL sebagai hubungan tautan dapat mengarahkan pengembang klien ke dokumentasi.

  3. Logika klien sederhana: Klien yang hanya mengikuti URL alih-alih membuatnya sendiri, akan lebih mudah untuk diterapkan dan dipelihara.

  4. Server mengambil kepemilikan struktur URL: Penggunaan hypermedia menghapus pengetahuan kode keras klien tentang struktur URL yang digunakan oleh server.

  5. Tidak memuat konten ke layanan lain: Hypermedia diperlukan saat memindahkan konten ke server lain (CDN misalnya).

  6. Pembuatan versi dengan tautan: Hypermedia membantu pembuatan versi API.

  7. Beberapa implementasi dari layanan / API yang sama: Hypermedia adalah kebutuhan ketika ada beberapa implementasi dari layanan / API yang sama. Sebuah layanan misalnya bisa menjadi API blog dengan sumber daya untuk menambahkan posting dan komentar. Jika layanan ditentukan dalam kaitannya dengan hubungan tautan alih-alih URL kode keras, maka layanan yang sama dapat dibuat beberapa kali di URL yang berbeda, dihosting oleh perusahaan yang berbeda tetapi masih dapat diakses melalui kumpulan tautan yang sama didefinisikan dengan baik oleh satu klien tunggal.

Anda dapat menemukan penjelasan mendalam tentang poin-poin ini di sini: http://soabits.blogspot.no/2013/12/selling-benefits-of-hypermedia.html

(ada pertanyaan serupa di sini: /software/149124/what-is-the-benefit-of-hypermedia-hateoas di mana saya telah memberikan penjelasan yang sama)


Beberapa implementasi dari layanan yang sama: dapatkah Anda menjelaskan lebih lanjut? Saya tidak melihat bagaimana itu membantu.
Abbadon

Saya telah mencoba menjelaskannya dalam teks. Apakah itu membantu?
Jørn Wildt

11

Tingkat kematangan Richardson 3 sangat berharga dan harus diadopsi. Jørn Wildt telah merangkum beberapa keuntungan dan jawaban lainnya, oleh Wilt, melengkapinya dengan sangat baik.

Namun, tingkat kematangan Richardson 3 tidak sama dengan HATEOAS milik Fielding. Tingkat kematangan Richardson 3 hanya tentang desain API. HATEOAS Fielding adalah tentang desain API juga, tetapi juga mengatur bahwa perangkat lunak klien tidak boleh berasumsi bahwa sumber daya memiliki struktur tertentu di luar struktur yang ditentukan oleh jenis media. Ini membutuhkan klien yang sangat umum, seperti browser web, yang tidak memiliki pengetahuan tentang situs web tertentu. Karena Roy Fielding telah menciptakan istilah REST dan telah menetapkan HATEOAS sebagai persyaratan kepatuhan terhadap REST, pertanyaannya adalah: apakah kita ingin mengadopsi HATEOAS dan jika tidak, apakah kita masih dapat memanggil API RESTful atau tidak? Saya pikir kita bisa. Biar saya jelaskan.

Misalkan kita telah mencapai HATEOAS. Aplikasi sisi klien sekarang sangat umum, tetapi kemungkinan besar, pengalaman pengguna buruk, karena tanpa pengetahuan tentang semantik sumber daya, presentasi sumber daya tidak dapat disesuaikan untuk mencerminkan semantik tersebut. Jika resource 'car' dan resource 'house' memiliki jenis media yang sama (misalnya application / json), maka resource tersebut akan disajikan kepada pengguna dengan cara yang sama, misalnya sebagai tabel properti (pasangan nama / nilai).

Tapi oke, API kami benar-benar RESTful.

Sekarang, misalkan kita membangun aplikasi klien kedua di atas API ini. Klien kedua ini melanggar ide HATEOAS dan memiliki informasi hardcode tentang sumber daya. Ini menampilkan mobil dan rumah dengan cara yang berbeda.

Apakah API masih bisa disebut RESTful? Aku pikir begitu. Ini bukan kesalahan API bahwa salah satu kliennya telah melanggar HATEOAS.

Saya menyarankan untuk membangun RESTful API, yaitu API yang klien generiknya dapat diimplementasikan secara teori , tetapi dalam banyak kasus, Anda memerlukan beberapa informasi hard-code tentang sumber daya di klien Anda untuk memenuhi persyaratan kegunaan. Namun, cobalah sesedikit mungkin membuat kode keras, untuk mengurangi ketergantungan antara klien dan server.

Saya telah menyertakan bagian tentang HATEOAS dalam pola implementasi REST saya yang disebut JAREST .


8

Kami sedang membangun REST level 3 API di mana tanggapan kami ada di HAL-Json. HATEOAS bagus untuk bagian depan dan belakang, tetapi memiliki tantangan. Kami membuat beberapa penyesuaian / penambahan untuk juga mengelola ACL di dalam respons HAL-Json (yang tidak melanggar standar HAL-Json).

Keuntungan terbesar dari HATEOAS yang saya lihat adalah kita tidak perlu menulis / menebak url apa pun di aplikasi front-end kita. Yang Anda butuhkan hanyalah titik masuk ( https://hostname) dan dari sana Anda dapat menelusuri sumber daya menggunakan tautan atau tautan kerangka yang disediakan di dalam respons. Seperti itu, pembuatan versi dapat ditangani dengan mudah, mengganti nama / mengganti url, memperluas sumber daya dengan hubungan tambahan tanpa merusak kode front-end.

Caching sumber daya di front-end sangat mudah menggunakan tautan mandiri. Kami juga mendorong sumber daya ke klien melalui koneksi soket, karena itu juga diberikan dalam HAL, kami dapat dengan mudah menambahkannya ke cache dengan cara yang sama.

Keuntungan lain menggunakan HAL-Json adalah jelas seperti apa model respons yang seharusnya, karena ada standar terdokumentasi yang harus diikuti.

Salah satu kustomisasi kita adalah bahwa kita menambahkan tindakan objek dalam objek self-link yang mengekspos ke ujung depan yang tindakan atau operasi CRUD pengguna dikonfirmasi diperbolehkan untuk melakukan pada sumber daya masing-masing ( create:POST, read:GET, update:PUT, edit:PATCH, delete:DELETE). Seperti ini ACL ujung depan kami benar-benar ditentukan oleh respons REST API kami, memindahkan tanggung jawab ini sepenuhnya ke model back-end.

Jadi untuk memberikan contoh singkat Anda bisa memiliki objek posting di HAL-Json yang terlihat seperti ini:

{
    "_links": {
        "self": {
            "href": "https://hostname/api/v1/posts/1",
            "actions": {
                "read": "GET",
                "update": "PUT",
                "delete": "DELETE"
            }
        }
    },
    "_embedded": {
        "owner": {
            "id": 1,
            "name": "John Doe",
            "email": "john.doe@example.com",
            "_links": {
                "self": {
                    "href": "https://hostname/api/v1/users/1",
                    "actions": {
                        "read": "GET"
                    }
                }
            }
        }
    },
    "subject": "Post subject",
    "body": "Post message body"
}

Sekarang yang harus kita lakukan di front end adalah membangun AclServicedengan isAllowedmetode yang memeriksa apakah tindakan yang ingin kita lakukan ada di objek tindakan.

Saat ini di bagian depan tampilannya sesederhana: post.isAllowed('delete');

Saya pikir REST level 3 itu bagus, tetapi itu dapat menyebabkan sakit kepala. Anda harus memiliki pemahaman yang baik tentang REST dan jika Anda ingin bekerja dengan REST level 3, saya sarankan untuk mengikuti konsep REST secara ketat jika tidak, Anda akan mudah tersesat saat menerapkannya.

Dalam kasus kami, kami memiliki keuntungan bahwa kami membangun bagian depan dan belakang tetapi pada prinsipnya itu TIDAK membuat perbedaan. Namun kesalahan umum yang saya lihat di tim kami adalah bahwa beberapa pengembang mencoba memecahkan masalah front-end (arsitektur) dengan mengubah model back-end mereka sehingga "sesuai" dengan kebutuhan front-end.


1
Jawaban yang sangat bagus. Saya pikir contoh praktis seperti itu adalah apa yang dicari oleh penanya yang asli.
www.admiraalit.nl

2

Saya telah menggunakan HATEOAS dalam beberapa proyek nyata, tetapi dengan interpretasi yang berbeda dari Richardson. Jika itu yang diinginkan atasan Anda, saya rasa Anda harus melakukannya. Saya mengartikan HATEOAS bahwa sumber daya Anda harus menyertakan doctype HTML, hyperlink ke sumber daya terkait, dan formulir HTML untuk mengekspos fungsionalitas untuk kata kerja selain GET. (Ini adalah saat jenis Terima adalah teks / html - jenis konten lain tidak memerlukan tambahan ini.) Saya tidak tahu dari mana keyakinan bahwa semua sumber daya REST di seluruh aplikasi Anda harus direkatkan. Aplikasi jaringan harus berisi banyak sumber daya yang mungkin berhubungan langsung atau tidak. Atau mengapa diyakini bahwa XML, JSON, dan jenis lainnya perlu mengikuti ini. (HATEOAS adalah khusus HTML.)

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.