Apa cara "RESTful" untuk menambahkan operasi non-CRUD ke layanan RESTful? Katakanlah saya memiliki layanan yang memungkinkan akses CRUD ke catatan seperti ini:
GET /api/car/123 <- Returns information for the Car object with ID 123
POST /api/car <- Creates a new car (with properties in the request)
PUT /api/car/123 <- Updates car 123 (with properties in the request)
DELETE /api/car/123 <- Deletes car 123
POST /api/car/123/wheel/ <- Creates a wheel and associates it to car 123
Jika saya ingin mengubah warna mobil, saya akan melakukannya POST /api/car/123
dan menyertakan variabel POST untuk warna baru.
Tapi katakanlah saya ingin membeli mobil, dan pengoperasian itu lebih rumit daripada sekadar memperbarui properti "mobil milik" catatan "pengguna". Apakah tenang untuk melakukan sesuatu seperti POST /api/car/123/purchase
, di mana "pembelian" pada dasarnya adalah nama metode? Atau haruskah saya menggunakan kata kerja HTTP khusus, sepertiPURCHASE
bukan POST
?
Atau apakah operasi non-CRUD sama sekali di luar cakupan REST?
web-services
rest
MikeWyatt
sumber
sumber
PATCH /api/car/123
dan mengirimkan parameter warna ATAU gunakanPUT /api/car/123
dan kirim seluruh objek mobil. POST akan menyimpulkan bahwa Anda sedang membuat mobil baru dan mungkin tidak boleh menyertakan id di akhir URLJawaban:
Pikirkan tentang pembelian sebagai entitas bisnis atau sumber daya dalam kamus RESTful. Meskipun demikian, melakukan pembelian sebenarnya menciptakan sumber daya baru. Begitu:
akan membuat pesanan baru. Detail (pengguna, mobil, dll.) Harus direferensikan oleh id (atau URI) di dalam konten yang dikirim ke alamat ini.
Tidak masalah bahwa memesan mobil bukan hanya INSERT sederhana di database. Sebenarnya, REST bukan tentang mengekspos tabel database Anda sebagai operasi CRUD. Dari sudut pandang logis Anda membuat pesanan (pembelian), tetapi sisi server bebas untuk melakukan sebanyak mungkin langkah pemrosesan yang diinginkan.
Anda bahkan dapat menyalahgunakan protokol HTTP lebih jauh. Gunakan
Location
tajuk untuk mengembalikan tautan ke pesanan yang baru dibuat, pilih kode respons HTTP dengan cermat untuk memberi tahu pengguna tentang masalah (sisi server atau klien), dll.sumber
Cara tenang yang saya pahami adalah Anda tidak memerlukan kata kerja HTTP baru, ada kata benda di suatu tempat yang akan berarti apa yang perlu Anda lakukan.
Beli mobil? Bukan begitu
sumber
Apa yang sebenarnya Anda lakukan adalah membuat pesanan. Jadi tambahkan sumber daya lain untuk memesan dan memposting dan meletakkannya di sana selama proses pemesanan.
Pikirkan dalam hal sumber daya daripada pemanggilan metode.
Untuk menyelesaikan pesanan Anda mungkin akan POST / api / order // menyelesaikan atau yang serupa.
sumber
Saya merasa REST API membantu dalam lebih banyak cara daripada hanya menyediakan semantik. Jadi tidak dapat memilih gaya RPC hanya karena beberapa panggilan yang tampaknya lebih masuk akal dalam gaya operasi RPC. Contohnya adalah api google maps untuk menemukan arah antara dua tempat. Tampak seperti ini: http://maps.googleapis.com/maps/api/directions/json?origin=Jakkur&destination=Hebbal
Mereka bisa menyebutnya "findDirections" (kata kerja) dan memperlakukannya sebagai operasi. Sebaliknya mereka menjadikan "direction" (kata benda) sebagai sumber daya dan memperlakukan arah pencarian sebagai kueri pada sumber daya arah (Meskipun secara internal tidak ada sumber daya nyata yang disebut arah dan dapat diimplementasikan oleh logika bisnis untuk menemukan arah berdasarkan parameter).
sumber