Saya memiliki operasi cetak untuk melakukan untuk dokumen pelanggan saya. Saya perlu operasi standar lainnya untuk dilakukan juga, seperti menambah, memperbarui, menghapus. jadi, saya telah mengikuti:
- Untuk membuat pelanggan baru:
URI = / customer / {id}, ketik = POST, Methodname = CreateCustomer () - Untuk memperbarui:
URI: / customer / {id}, ketik = PUT, metode = UpdateCstomer () - Untuk pelanggan Hapus:
URI = / pelanggan / {id}, ketik = HAPUS, Methodname = DeleteCustomer () - Untuk Tampilan:
URI: / customer / {id}, ketik = GET, method = GetCustomer ()
Sekarang, jika saya perlu mencetak dokumen untuk pelanggan itu, saya perlu fungsi cetak. URI saya mungkin terlihat seperti ini: / customer / {id}, type = POST, method = PrintCustomer (). Tapi saya telah menggunakan tipe URI dan POST untuk CreateCustomer. Saya ingin URI terlihat seperti ini: / customer / Print / {id}, type = POST, method = PrintCustomer ().
Tetapi saya tidak dapat memiliki kata kerja "Cetak" di URI saya. Apa cara terbaik untuk melakukan ini? Saya memikirkan / pelanggan / dokumen / {id} sebagai URI ... tapi saya akan mengalami masalah yang sama. Saya akan memiliki operasi CRUD pada "dokumen". Jadi, sekali lagi saya kehabisan apa yang akan saya gunakan untuk "cetak". Mohon saran.
POST /customers/123/print
adalah hal yang sah untuk dilakukan.Jawaban:
POST
tidak berarti "membuat", itu berarti "proses". Anda dapat membuat sumber daya baru dengan memposting permintaan yang sesuai ke sumber daya yang ada (yaitu mengirim ke/customers
untuk membuat pelanggan baru). Tetapi Anda juga dapat menggunakanPOST
untuk mengisi semua tindakan lain yang tidak sesuai dengan paradigma CRUD yang rapi.Dalam hal pencetakan, Anda harus mempertimbangkan tindakan mencetak sebagai sumber daya itu sendiri. Anda meminta sistem untuk membuat "pekerjaan cetak" untuk Anda. Ini berarti Anda dapat memiliki
prints/
sumber daya yang bertindak sebagai wadah untuk semua cetakan yang diminta. Ketika Anda ingin mencetak sesuatu, AndaPOST
dokumen untuk sumber daya ini yang berisi semua informasi tentang print-out yang ingin Anda buat, mengidentifikasi sumber daya yang ingin Anda cetak dengan tautan ke sana.Sebagai dokumen JSON, bisa terlihat seperti ini:
Tentunya, Anda perlu menyesuaikan ini agar relevan dengan apa yang ingin Anda lakukan. Kuncinya adalah Anda mengidentifikasi sumber daya lain untuk dicetak dengan menentukan URL mereka.
Menanggapi permintaan tersebut, Anda dapat dengan mudah mengembalikan a
200 OK
atau a204 No-Content
dan memperlakukannya sebagai proses api-dan-lupa. Namun, jika Anda ingin meningkatkannya, Anda dapat kembali201 Created
dan menentukan URL dari pekerjaan cetak yang baru dibuat, misalnya/prints/12345
.Seorang pengguna kemudian dapat melakukan
GET
pada sumber daya untuk melihat status pekerjaan cetak mereka (menunggu, dalam proses, dll), atau dapat meminta pekerjaan dibatalkan dengan mengeluarkan aDELETE
.Setelah Anda mengulangi masalah dalam hal sumber daya, desain RESTful harus datang secara alami dan memberi Anda kesempatan untuk memperluas dan meningkatkan dengan cara yang mungkin tidak segera Anda pertimbangkan.
sumber
Saya melakukan ini sebelumnya. Untuk mencetak dokumen, saya hanya mengembalikan sumber daya versi pdf. Klien hanya perlu mengirim permintaan GET untuk sumber daya dengan Accept header application / pdf.
Ini juga menghindari membuat URI baru untuk sumber daya sementara seperti pekerjaan cetak. Menggunakan header HTTP juga merupakan bagian dari REST dan menjaga URI tetap bersih.
sumber
Cukup tambahkan parameter ke GET URI saat ini
Cukup umum menggunakan URI untuk beberapa tindakan.
Jika Anda berbicara tentang sumber daya yang sama tetapi tindakan yang berbeda, Anda akan mendefinisikannya sebagai parameter.
/ customer / {id}? print = true
Kemudian di mana Anda menentukan metode GET Anda mendeteksi keberadaan parameter cetak dan menanganinya secara berbeda.
REST didefinisikan dengan cara berikut:
GET, di sisi lain, dimaksudkan untuk digunakan dalam berbagai cara karena biasanya ada banyak bentuk berbeda yang dapat diambil sumber daya. Itu juga mengapa permintaan GET direpresentasikan sebagai string kueri. Jika Anda bekerja dengan sumber daya basis data, Anda benar-benar akan mengambil tampilan melalui kueri tetapi REST sengaja disarikan ke tingkat yang lebih tinggi karena dirancang untuk menangani berbagai jenis sumber daya.
Spesifikasi REST cukup berpikir ke depan, meskipun API baru-baru ini mulai menggunakannya dengan berat.
Jika Anda tertarik untuk mempelajari lebih lanjut tentang protokol REST, saya sangat menyarankan Anda membaca " Haters Gonna Hate HATEOAS ".
Memperbarui:
@Shauna menunjukkan lubang yang menarik dalam penalaran saya. Itu tidak benar cara yang benar dan banyak bentuk yang dianggap dapat diterima. Saya memikirkannya lagi dan karena tujuan penggunaan Anda adalah untuk mentransformasikan data menjadi representasi yang berbeda, masuk akal untuk mendefinisikan transformasi sebagai MIME-Type baru.
Misalnya, Anda dapat mewakili URI sebagai:
Di mana Anda dapat mengatur respons Content-Type ke teks / html + cetak. Dengan begitu Anda juga akan memiliki opsi untuk mendefinisikan lebih banyak transformasi di masa mendatang.
Sebagai contoh:
Bagaimanapun, semua bentuk dapat diterima. Implementasi yang Anda putuskan lebih tergantung pada preferensi pribadi, dan kemampuan server Anda.
Selain itu, izinkan saya mengklarifikasi karena tampaknya ada beberapa kebingungan. Parameter-print 'query' dan / atau tipe konten digunakan untuk menentukan bagaimana sumber daya ditransformasikan. Bukan cara memicu pekerjaan cetak fisik. Untuk alasan keamanan, akses tingkat perangkat keras selalu diserahkan kepada pengguna / klien / browser.
sumber
?print=true
), Anda juga dapat menggunakan parameter URI (yaitu -/customer/{id}/printable
). Yang mana yang Anda gunakan akan sangat tergantung pada standar sistem Anda (CMS, kerangka kerja, kode pada umumnya) diatur untuk menangani. Keduanya dianggap valid dan dapat diterima .