Kenari di tambang batu bara.
Saya telah menunggu pertanyaan seperti ini selama hampir satu tahun sekarang. Tidak dapat dihindari bahwa hari ini akan datang dan saya yakin kita akan melihat lebih banyak pertanyaan seperti ini dalam beberapa bulan mendatang.
Tanda-tanda peringatan
Anda benar sekali, butuh waktu lebih lama untuk membangun klien tenang daripada klien SOAP. Toolkit SOAP menghilangkan banyak kode boilerplate dan membuat objek proxy klien tersedia dengan hampir tanpa usaha. Dengan alat seperti Visual Studio dan URL server saya dapat mengakses objek jarak jauh dari kompleksitas arbitrer, secara lokal dalam waktu kurang dari lima menit.
Layanan yang mengembalikan aplikasi / xml dan aplikasi / json sangat mengganggu bagi pengembang klien. Apa yang harus kita lakukan dengan gumpalan data itu?
Untungnya, banyak situs yang menyediakan layanan REST juga menyediakan banyak pustaka klien sehingga kami dapat menggunakan pustaka tersebut untuk mendapatkan akses ke banyak objek yang sangat diketik. Sepertinya agak bodoh. Jika mereka menggunakan SOAP, kita bisa membuat sendiri kode-kode kelas proksi itu.
SABUN overhead, ha. Latensi yang membunuh. Jika orang benar-benar khawatir tentang jumlah kelebihan byte yang terjadi, maka mungkin HTTP bukan pilihan yang tepat. Pernahkah Anda melihat berapa byte yang digunakan oleh header agen-pengguna?
Ya, pernahkah Anda mencoba menggunakan browser web sebagai alat debugging untuk apa pun selain HTML dan javascript. Percayalah padaku itu menyebalkan. Anda hanya dapat menggunakan dua kata kerja, caching terus-menerus menghalangi, penanganan kesalahan menelan begitu banyak informasi, selalu mencari favicon.ico. Tembak aku.
URL yang dapat dibaca. Hanya kata benda, tanpa kata kerja. Ya, itu mudah asalkan kita hanya melakukan operasi CRUD dan kita hanya perlu mengakses hierarki objek dalam satu cara. Sayangnya sebagian besar aplikasi memerlukan sedikit lebih banyak fungsionalitas dari itu.
Bencana yang akan datang
Ada sejumlah besar pengembang yang saat ini mengembangkan aplikasi yang berintegrasi dengan layanan REST yang sedang dalam proses mencapai kesimpulan yang sama dengan yang Anda miliki. Mereka dijanjikan kesederhanaan, fleksibilitas, skalabilitas, evolvabilitas, dan cawan suci penggunaan kembali kebetulan. Ciri-ciri web itu sendiri, bagaimana bisa terjadi kesalahan.
Namun, mereka menemukan bahwa versi sama banyak masalah, tetapi kompiler tidak membantu mendeteksi masalah. Kode klien tulisan tangan sangat sulit untuk dipertahankan karena struktur data berevolusi dan URL dapat di-refactored. Merancang API di sekitar hanya kata benda dan empat kata kerja bisa sangat sulit, terutama dengan fanatik Url RESTful memberi tahu Anda ketika Anda bisa dan tidak bisa menggunakan string kueri.
Pengembang akan mulai bertanya mengapa kita membuang-buang upaya kita untuk mendukung format Json dan format Xml, mengapa tidak hanya memfokuskan upaya kita pada satu dan melakukannya dengan baik?
Bagaimana semuanya menjadi sangat salah
Aku akan memberitahumu apa yang salah. Kami sebagai pengembang membiarkan departemen pemasaran memanfaatkan kelemahan utama kami. Pencarian kekal kami untuk peluru perak membutakan kami terhadap kenyataan apa sebenarnya REST. Di permukaan REST sepertinya begitu mudah dan sederhana. Beri nama sumber daya Anda dengan Url dan gunakan GET, PUT, POST dan DELETE. Sial, kita para pengembang sudah tahu bagaimana melakukan itu, kita telah berurusan dengan basis data selama bertahun-tahun yang memiliki tabel dan kolom serta pernyataan SQL yang memiliki SELECT, INSERT, UPDATE, dan DELETE. Seharusnya sepotong kue.
Ada bagian lain dari REST yang dibahas beberapa orang, seperti deskripsi diri, dan batasan hypermedia, tetapi kendala ini tidak sesederhana identifikasi sumber daya dan antarmuka yang seragam. Tampaknya menambah kompleksitas di mana tujuan yang diinginkan adalah kesederhanaan.
Versi REST yang dipermudah ini divalidasi dalam budaya pengembang dalam banyak hal. Kerangka kerja server dibuat yang mendorong Identifikasi Sumberdaya dan antarmuka yang seragam, tetapi tidak melakukan apa pun untuk mendukung kendala lainnya. Persyaratan mulai melayang di sekitar membedakan pendekatan, (HI-REST vs LO-REST, REST Perusahaan vs REST Akademik, REST vs RESTful).
Beberapa orang berteriak bahwa jika Anda tidak menerapkan semua kendala itu bukan ISTIRAHAT. Anda tidak akan mendapat manfaatnya. Tidak ada setengah SISA. Namun suara-suara itu dicap sebagai fanatik agama yang kesal karena istilah mereka yang berharga telah dicuri dari ketidakjelasan dan dijadikan arus utama. Orang-orang iri yang mencoba membuat REST terdengar lebih sulit daripada itu.
REST, istilahnya, sudah pasti menjadi mainstream. Hampir setiap properti web utama yang memiliki API mendukung "REST". Twitter dan Netflix adalah dua profil yang sangat tinggi. Yang menakutkan adalah bahwa saya hanya bisa memikirkan satu API publik yang bersifat deskriptif sendiri dan ada beberapa yang benar-benar menerapkan kendala hypermedia. Tentu saja beberapa situs seperti StackOverflow dan Gowalla mendukung tautan dalam tanggapan mereka, tetapi ada lubang besar yang menganga di tautan mereka. StackOverflow API tidak memiliki halaman root. Bayangkan seberapa sukses situs web itu jika tidak ada halaman rumah untuk situs web itu!
Anda disesatkan, saya takut
Jika Anda telah sampai sejauh ini, jawaban singkat untuk pertanyaan Anda adalah API (Netflix dan Twitter) tidak sesuai dengan semua kendala dan oleh karena itu Anda tidak akan mendapatkan manfaat yang seharusnya dibawa oleh REST apis.
Klien REST memang membutuhkan waktu lebih lama untuk membangun daripada klien SABUN tetapi mereka tidak terikat pada satu layanan tertentu, jadi Anda harus dapat menggunakannya kembali di seluruh layanan. Ambil contoh klasik, dari browser web. Berapa banyak layanan yang dapat diakses oleh browser web? Bagaimana dengan Feed Reader? Sekarang, berapa banyak layanan berbeda yang dapat diakses klien Twitter rata-rata? Ya, hanya satu.
Klien REST tidak seharusnya dibangun untuk berinteraksi dengan satu layanan, mereka seharusnya dibuat untuk menangani jenis media tertentu yang dapat dilayani oleh layanan apa pun. Pertanyaan yang jelas untuk itu adalah, bagaimana Anda bisa membangun klien REST untuk layanan yang memberikan aplikasi / json atau aplikasi / xml. Yah, kamu tidak bisa. Itu karena format tersebut sama sekali tidak berguna untuk klien REST. Anda mengatakannya sendiri,
Anda harus membuat "tebakan" tentang apa yang akan kembali ke pipa karena tidak ada skema nyata atau dokumen referensi
Anda sepenuhnya benar untuk layanan seperti Twitter. Namun, kendala deskriptif diri dalam REST mengatakan bahwa header tipe konten HTTP harus menggambarkan dengan tepat konten yang sedang dikirim melintasi kabel. Memberikan aplikasi / json dan application / xml tidak memberi tahu Anda tentang konten.
Ketika datang untuk mempertimbangkan kinerja sistem berbasis REST perlu melihat gambaran yang lebih besar. Berbicara tentang byte amplop seperti berbicara tentang loop unwinding ketika membandingkan quick-sort ke shell-sort. Ada skenario di mana SOAP dapat berkinerja lebih baik, dan ada skenario di mana REST dapat berkinerja lebih baik. Konteks adalah segalanya.
REST mendapatkan banyak keuntungan kinerjanya dengan menjadi sangat fleksibel tentang jenis media apa yang didukungnya dan dengan memiliki dukungan canggih untuk caching. Agar caching berfungsi dengan baik, meskipun hampir semua kendala harus dipatuhi.
Poin terakhir Anda tentang url yang dapat dibaca sejauh ini adalah yang paling ironis. Jika Anda benar-benar berkomitmen pada batasan hypermedia, maka setiap URL bisa menjadi GUID dan pengembang klien tidak akan kehilangan apa pun dalam keterbacaan.
Fakta bahwa URI harus buram bagi klien adalah salah satu hal terpenting saat mengembangkan sistem REST. URL yang dapat dibaca nyaman untuk pengembang server dan URL yang terstruktur dengan baik memudahkan kerangka server untuk mengirimkan permintaan, tetapi itu adalah detail implementasi yang seharusnya tidak berdampak pada pengembang yang mengonsumsi API.
API Twitter bahkan tidak dekat dengan RESTful dan itulah sebabnya Anda tidak dapat melihat manfaat apa pun untuk menggunakannya di atas SOAP. Netflix API jauh lebih dekat tetapi penggunaan jenis media generik menunjukkan bahwa kegagalan untuk mematuhi bahkan satu kendala pun dapat memiliki dampak mendalam pada manfaat yang diperoleh dari layanan.
Mungkin itu bukan salah mereka
Saya telah melakukan banyak pembuangan pada penyedia layanan, tetapi butuh dua untuk menari dengan tenang. Suatu layanan dapat mengikuti semua kendala agama dan klien masih dapat dengan mudah membatalkan semua manfaat.
Jika suatu klien membuat kode url untuk mengakses jenis sumber daya tertentu maka itu mencegah server untuk mengubah url tersebut. Segala jenis konstruksi URL berdasarkan pengetahuan implisit tentang bagaimana layanan menyusun url-nya merupakan pelanggaran.
Membuat asumsi tentang jenis representasi apa yang akan dikembalikan dari tautan dapat menimbulkan masalah. Membuat asumsi tentang konten representasi berdasarkan pengetahuan yang tidak secara eksplisit dinyatakan dalam header HTTP pasti akan membuat kopling yang akan menimbulkan rasa sakit di masa depan.
Haruskah mereka menggunakan sabun?
Secara pribadi, saya kira tidak. REST dilakukan dengan benar memungkinkan sistem terdistribusi untuk berkembang dalam jangka panjang. Jika Anda sedang membangun sistem terdistribusi yang memiliki komponen yang dikembangkan oleh orang yang berbeda dan perlu bertahan selama bertahun-tahun, maka REST adalah pilihan yang cukup bagus.