Apakah sesi sisi server melanggar REST?

14

Menurut Roy Fielding (salah satu penulis utama spesifikasi HTTP) dalam tesis seminalnya, Styles Arsitektur ketika membahas REST , ia menyebutkan:

[E] karena permintaan dari klien ke server harus berisi semua informasi yang diperlukan untuk memahami permintaan tersebut, dan tidak dapat memanfaatkan konteks yang tersimpan di server.

Dengan "konteks tersimpan", ia merujuk ke status aplikasi, misalnya, apa nomor halaman untuk halaman berikutnya vs. status sumber daya, mis. Penyimpanan data, gambar, dll. - yang bisa dibilang merupakan keseluruhan poin dari REST.

Apakah adil untuk mengatakan bahwa sebagian besar upaya pada istirahat murni (dengan ini didefinisikan sebagai implementasi yang sesuai dengan tesis di atas) harus gagal karena ketergantungan mereka pada penyimpanan data sesi di server (persisten atau sebaliknya)?

Konsep sesi adalah umum - khususnya untuk pengembang Web - tetapi apakah itu tenang menurut definisi di atas?

Mat
sumber
2
Saya akan mengatakan sesuai dengan definisi itu secara praktis tidak ada yang tenang, tetapi bagaimana definisi itu bahkan cukup masuk akal? Bayangkan sebuah pencarian google "tenang" - di mana Anda harus memberikan indeks internet dalam permintaan ke google untuk itu untuk mencari Anda. Apa? Tidak, mengatakan bahwa Anda tidak dapat memiliki toko kegigihan dan tenang akan sama saja dengan mengatakan antarmuka tenang sebenarnya tidak ada gunanya. Itu tidak berarti kita semua harus mulai mempertahankan sesi dalam-memori dan mengatakan itu masih desain istirahat yang baik ...
Jimmy Hoffa
3
Saya pikir perlu dicatat ada perbedaan antara status aplikasi dan status sumber daya (indeks Google akan menjadi status sumber daya, dan sangat sah). Saya harus menjelaskannya dalam pertanyaan.
Mat
ada perbedaan seperti itu? Tolong, jelaskan. :) Saya pernah melihat orang mencoba untuk mendefinisikan ini sebelumnya, tetapi itu benar-benar kabur karena mereka sebenarnya tidak berbeda. Keduanya adalah data yang bisa berubah, satu-satunya perbedaan yang relevan antara satu bentuk negara dan yang lain adalah apakah itu persisten atau tidak, di mana bentuk yang tidak berarti itu biasanya dapat diperbarui yang membuat berbeda.
Jimmy Hoffa
1
Saya sendiri sudah bertanya-tanya. Karena tidak ada yang pernah menjelaskan mengapa aplikasi saya harus menginginkan bintang "tenang" emas baik saya tidak benar-benar khawatir tentang hal itu.
psr

Jawaban:

10

Saya akan mengatakan ya, keadaan sesi tidak membuat aplikasi TENANG non-TENANG. Contoh sepele, saudara perempuan saya berlangganan Wall Street Journal. Secara teratur dia akan membaca sesuatu di balik paywall dan memutuskan untuk mengirim tautan (melalui klien emailnya sendiri, bukan melalui WSJ) ke teman yang tidak memiliki akun WSJ. Klik, kirim, gagal. Jelas pengalaman saudara perempuan saya di URL itu berbeda dengan pengalaman temannya.

Terkait, tetapi tidak sepenuhnya pada-topik: Saya pada tahap desain awal aplikasi yang dirancang untuk mendukung upaya penelitian yang signifikan di internet (disebut pencarian (pikirkan: bookmark pada steroid dan LSD)). Pemilik pencarian ingin berbagi pandangan tertentu tentang datanya dengan orang lain, tetapi pandangan ini memerlukan kombinasi status UI (mis. Visualisasi data apa yang ditampilkan di panel mana) bersama dengan izin yang sesuai untuk mengakses UI dan data ditampilkan. Ada banyak kondisi tersimpan yang diperlukan bagi penerima untuk mendapatkan tampilan yang diinginkan.

Solusi saya saat ini adalah untuk menyimpan semua UI / ACL / info apapun yang diperlukan untuk pandangan dalam sebuah objek yang terpisah dan mengembalikan URL (mungkin UUID) untuk itu objek. Saya percaya bahwa mengakses objek tampilan dapat dianggap tenang dalam arti bahwa setiap orang yang memilikinya mendapatkan info / pengalaman yang sama.

Peter Rowell
sumber
1
Contoh objek yang Anda lihat adalah sudut lain dalam hal ini. Rapi.
Mat
Menerima ini sebagai jawabannya, terlepas dari jawaban-jawaban hebat lainnya, kebanyakan karena itu menjawab pertanyaan secara langsung dan memberikan contoh yang sangat jelas. Juga, bagian kedua pada objek tampilan memiringkan timbangan.
Mat
1
Jika Anda mengatakan bahwa situs wsj adalah contoh aplikasi yang tidak tenang, saya tidak akan setuju bahwa contoh Anda menunjukkan hal itu. Misalnya, jika situs WSJ mengandalkan data yang diberikan sepenuhnya oleh klien saudari Anda untuk menyajikan data, maka itu dengan definisi yang diberikan @Matt, RESTful. Namun, jika itu bergantung pada keadaan sesi sementara di-memori itu adalah dengan definisi Matt memberi tidak tenang. Saya hanya menunjukkan ini karena definisi yang diberikan Matt didasarkan pada implementasi spesifik sementara REST lebih baik didefinisikan oleh teknik konsumsi.
Jimmy Hoffa
@JimmyHoffa - Pemahaman saya tentang Kendala REST adalah bahwa stateless . Bagi saya itu agak membingungkan.
Peter Rowell
Jika aplikasi WSJ tidak memiliki status, artikel yang dapat dilihat harus dikirim oleh klien. Artikel itu dapat diedit kapan saja oleh admin situs, jangan salah itu bagian dari kondisi aplikasi WSJ. Saya pikir perbedaan yang diupayakan adalah bahwa ia adalah keadaan persisten , sehingga akan memiliki lebih banyak jaminan dan biaya overhead manajemen lebih sedikit daripada keadaan impersisten seperti sesi, bersama dengan kontrol atomitas yang lebih sederhana dalam transaksi di atasnya. Ini bersama dengan model konsumsi sederhana adalah apa yang orang inginkan untuk beristirahat. (Saya pikir)
Jimmy Hoffa
2

Apakah sesi sisi server melanggar REST?

Mereka pasti melakukannya! Saat Anda menerapkan REST, tidak boleh ada sesi sisi server, jika tidak, Anda memiliki solusi RPC / REST hibrid.

Klien harus mengirim ke layanan RESTful semua konteks yang diperlukan untuk melayani permintaan, termasuk informasi yang diperlukan untuk mengotentikasi klien, setiap kali permintaan baru dibuat. Server bebas untuk menyimpan informasi untuk membuat pelayanan permintaan berikutnya lebih cepat, tetapi informasi yang di-cache tidak boleh berjumlah sesi sisi server. Dengan kata lain, permintaan itu sendiri harus mengandung informasi yang cukup untuk diproses bahkan dalam keadaan tidak ada cache.

dasblinkenlight
sumber
1

Mungkin tergantung pada apa yang Anda maksud dengan "data sesi". Apakah itu istilah yang tepat?

Komunikasi yang aman antara dua pihak sering melibatkan server untuk menghasilkan (dan menyimpan) "token akses" terbatas waktu yang harus disediakan klien dengan setiap permintaan sebagai cara otorisasi. Token akses ini sudah saya sebut "data sesi" - disimpan di sisi server, terbatas waktu dan terkait dengan satu klien (biasanya izinnya).

Saya akan sangat terkejut jika operasi semacam ini dilabeli sebagai non-TENANG. OAuth adalah contohnya.

Saya bukan spesialis dan saya tidak terlalu percaya diri di sini; Saya hanya berbagi wawasan saya dengan harapan mereka terbukti bermanfaat.

Kos
sumber
1

Poin terpenting dari REST adalah bahwa URI ke ressource selalu menunjuk ke ressource yang sama. Jadi pengguna dapat membagikan referensi ke sumber daya ini dan semua orang melihat hal yang sama. Ini disebut Representational State Transfer (REST). Jika server terus menyatakan dan memberikan sumber daya yang berbeda untuk URI yang sama, saya akan mengatakan ini bukan SISA murni lagi.

Puckl
sumber
itu belum tentu benar bahwa pengguna akan melihat hal yang sama .. Akses dapat menentukan berapa banyak yang bisa dilihat oleh satu pengguna.
Erik
@Erik Tapi pengguna akan menyatakan berapa banyak yang ingin mereka lihat dalam permintaan (Termasuk menggunakan Header Terima), jadi jawaban Puckl benar.
Johan
1
@ Johan Saya akan mengembalikan data yang berbeda untuk pengguna yang berbeda, dari titik akhir yang sama. Kalau tidak, apa gunanya mengautentikasi pengguna.
Erik
@Erik, aku juga akan melakukannya. Tidak ada yang kurang saya percaya otentikasi berada di luar keadaan sumber daya, jadi secara tegas jika pandangan dipengaruhi oleh pengguna yang diautentikasi maka itu tidak lagi tenang. Mungkin jika Anda menginginkan lencana TENANG Anda harus membuat beberapa "tampilan" dari sumber daya, tergantung pada siapa yang meminta akses itu mengotorisasi akses ke hanya beberapa tampilan. Jadi publik dapat memperoleh akses ke / userprofiles / {userID} / publicview dan pengguna mendapat akses ke / userprofiles / {userID} / profil penuh dan teman yang berwenang mendapatkan akses ke / userprofiles / {userID} / friendsview
Johan
0

Sesi pada dasarnya digunakan untuk menambahkan status ke aplikasi stateless dan tenang. Jadi secara formal, ini membuat aplikasi RESTful Anda stateful, namun memiliki status server keep membuat hidup Anda sedikit lebih mudah, karena Anda tidak harus meneruskan semua data bolak-balik pada setiap permintaan / tanggapan.

Sesi, dan lebih umum menyatakan, memungkinkan Anda menghindari ini, dan ini memiliki beberapa manfaat positif dalam kinerja (lebih sedikit transfer data) dan keamanan (lebih sedikit data yang tersedia untuk diubah).

Jadi, meskipun secara resmi melanggar bagian dari definisi REST, itu sangat berguna sehingga jarang melihat aplikasi RESTful yang tidak menggunakan status melalui sesi.

Oleksi
sumber
Saya tidak setuju. Anda memiliki situs belanja yang memungkinkan Anda memfilter menurut merek, warna, dan ukuran. Situs web tradisional Web 1.0 akan menangani ini dengan beberapa kotak centang, sesi sisi server, dan POST. Jika saya ingin membagikan tautan ke example.org/shirts, orang tidak akan melihat bahwa saya memilih Medium, Black dan Roots. (Ini juga menyebabkan pesan "Anda rePOSTing data" yang jelek ketika Anda mengklik kembali.) Tetapi jika saya membagikan tautan ke (misalnya) example.org/shirts/medium-black-roots, semua orang memiliki representasi yang sama. Semua informasi status yang diperlukan ada di URL (atau badan POST jika perlu, tetapi Anda tidak dapat membagikannya).
Jesse Buchanan
... Tenang mungkin tidak cocok untuk semuanya. Apakah sumber daya aplikasi hipotetis Anda berorientasi (situs belanja tentunya!)? Mungkin itu mungkin tidak cocok untuk RIA, dengan banyak negara, yang tidak berorientasi sumber daya. Saya tidak bisa memikirkan contoh yang baik untuk jujur.
Jesse Buchanan
0

Apa yang dimaksud Fielding dengan pernyataan itu adalah bahwa server aplikasi hosting REST API tidak mengaitkan keadaan sekitar dengan permintaan oleh semacam mekanisme di balik layar. Pertimbangkan perbedaan antara server aplikasi dan server basis data . Kendala REST adalah bahwa server aplikasi harus stateless . Namun, server aplikasi dapat mendelegasikan permintaan untuk status sumber daya ke server database berdasarkan informasi yang merupakan bagian dari permintaan, seperti kombinasi pengguna / kata sandi di header Otorisasi atau Uri itu sendiri. Bagaimanapun, REST didasarkan pada model klien / server.

eulerfx
sumber