Menurut HTTP / 1.1 Spec:
The
POST
metode yang digunakan untuk permintaan bahwa server asal menerima entitas tertutup di permintaan sebagai subordinat baru sumber daya diidentifikasi olehRequest-URI
diRequest-Line
Dengan kata lain, POST
digunakan untuk membuat .
The
PUT
Metode permintaan bahwa entitas tertutup disimpan di bawah disediakanRequest-URI
. JikaRequest-URI
merujuk ke sumber daya yang sudah ada, entitas terlampir HARUS dianggap sebagai versi modifikasi dari yang berada di server asal. JikaRequest-URI
tidak menunjuk ke sumber daya yang ada, dan bahwa URI mampu didefinisikan sebagai sumber daya baru oleh agen pengguna yang meminta, server asal dapat membuat sumber daya dengan URI itu. "
Artinya, PUT
digunakan untuk membuat atau mengganti .
Jadi, mana yang harus digunakan untuk membuat sumber daya? Atau seseorang perlu mendukung keduanya?
Jawaban:
Secara keseluruhan:
Baik PUT dan POST dapat digunakan untuk membuat.
Anda harus bertanya, "Anda melakukan tindakan apa?" untuk membedakan apa yang harus Anda gunakan. Anggap Anda sedang merancang API untuk mengajukan pertanyaan. Jika Anda ingin menggunakan POST maka Anda akan melakukannya untuk daftar pertanyaan. Jika Anda ingin menggunakan PUT maka Anda akan melakukannya untuk pertanyaan tertentu.
Hebat keduanya bisa digunakan, jadi mana yang harus saya gunakan dalam desain tenang saya:
Anda tidak perlu mendukung PUT dan POST.
Yang digunakan terserah Anda. Tapi ingatlah untuk menggunakan yang benar tergantung pada objek apa yang Anda referensikan dalam permintaan.
Beberapa pertimbangan:
Sebuah contoh:
Saya menulis berikut ini sebagai bagian dari jawaban lain pada SO mengenai hal ini :
Selain itu, dan sedikit lebih ringkas, RFC 7231 Bagian 4.3.4 PUT menyatakan (penekanan ditambahkan),
sumber
Anda dapat menemukan pernyataan di web yang mengatakan
Tidak ada yang benar.
Lebih baik memilih antara PUT dan POST berdasarkan idempotence tindakan.
PUT menyiratkan menempatkan sumber daya - sepenuhnya menggantikan apa pun yang tersedia di URL yang diberikan dengan hal yang berbeda. Menurut definisi, PUT adalah idempoten. Lakukan sebanyak yang Anda suka, dan hasilnya sama.
x=5
idempoten. Anda dapat PUT sumber daya apakah sebelumnya ada, atau tidak (misalnya, untuk Membuat, atau untuk Memperbarui)!POST memperbarui sumber daya, menambah sumber daya tambahan, atau menyebabkan perubahan. POST bukanlah idempoten, dengan cara yang
x++
tidak idempoten.Dengan argumen ini, PUT adalah untuk membuat ketika Anda mengetahui URL dari hal yang akan Anda buat. POST dapat digunakan untuk membuat ketika Anda mengetahui URL "pabrik" atau manajer untuk kategori hal-hal yang ingin Anda buat.
begitu:
atau:
sumber
name
dandate
. Jika kita memiliki entitas dengan yang sudah adaname
dandate
, tetapi kemudian membuat permintaan untuk itu hanya menentukanname
, perilaku PUT yang tepat adalah untuk melenyapkandate
entitas tersebut, sedangkan POST dapat memperbarui hanya properti yang ditentukan, meninggalkan properti yang tidak ditentukan sebagaimana adanya. sebelum permintaan dibuat. Apakah itu terdengar benar / masuk akal, atau apakah itu penggunaan PUT yang tidak tepat (saya melihat referensi ke PATCH , yang tampaknya lebih tepat, tetapi belum ada)?Spesifikasi yang relevan untuk PUT dan POST adalah RFC 2616 §9.5ff.
POST menciptakan sumber daya anak , jadi POST
/items
menciptakan sumber daya yang hidup di bawah/items
sumber daya. Misalnya./items/1
. Mengirim paket pos yang sama dua kali akan menghasilkan dua sumber daya.PUT adalah untuk membuat atau mengganti sumber daya di URL yang dikenal oleh klien .
Oleh karena itu: PUT hanya kandidat untuk BUAT di mana klien sudah mengetahui url sebelum sumber daya dibuat. Misalnya.
/blogs/nigel/entry/when_to_use_post_vs_put
sebagai judul digunakan sebagai kunci sumber dayaPUT menggantikan sumber daya di url yang dikenal jika sudah ada, jadi mengirim permintaan yang sama dua kali tidak berpengaruh. Dengan kata lain, panggilan ke PUT idempoten .
RFC berbunyi seperti ini:
Catatan: PUT sebagian besar telah digunakan untuk memperbarui sumber daya (dengan menggantinya secara keseluruhan), tetapi baru-baru ini ada gerakan menuju menggunakan PATCH untuk memperbarui sumber daya yang ada, karena PUT menentukan bahwa itu menggantikan seluruh sumber daya. RFC 5789.
Pembaruan 2018 : Ada kasus yang dapat dibuat untuk menghindari PUT. Lihat "SISA tanpa PUT"
diambil dari REST API Design - Resource Modeling oleh Prakash Subramaniam dari Thoughtworks
Ini memaksa API untuk menghindari masalah transisi negara dengan beberapa klien memperbarui satu sumber daya, dan lebih cocok dengan sumber acara dan CQRS. Ketika pekerjaan dilakukan secara serempak, POSTing transformasi dan menunggu untuk diterapkan tampaknya tepat.
sumber
Ringkasan:
Membuat:
Dapat dilakukan dengan PUT atau POST dengan cara berikut:
Memperbarui:
Dapat hanya dilakukan dengan PUT dengan cara berikut:
Penjelasan:
Ketika berurusan dengan REST dan URI sebagai umum, Anda memiliki generik di sebelah kiri dan spesifik di sebelah kanan . Obat generik biasanya disebut koleksi dan item yang lebih spesifik dapat disebut sumber daya . Perhatikan bahwa sumber daya dapat berisi koleksi .
Saat Anda menggunakan POST, Anda selalu merujuk ke koleksi , jadi setiap kali Anda mengatakan:
Anda memposting pengguna baru ke koleksi pengguna .
Jika Anda melanjutkan dan mencoba sesuatu seperti ini:
itu akan berfungsi, tetapi secara semantik Anda mengatakan bahwa Anda ingin menambahkan sumber daya ke koleksi john di bawah koleksi pengguna .
Setelah Anda menggunakan PUT, Anda merujuk ke sumber daya atau item tunggal, mungkin di dalam koleksi . Jadi, ketika Anda mengatakan:
Anda memberi tahu pembaruan server, atau membuat jika tidak ada, sumber daya john di bawah koleksi pengguna .
Spesifikasi:
Biarkan saya menyoroti beberapa bagian penting dari spesifikasi:
POS
Karenanya, ciptakan sumber daya baru pada koleksi .
TARUH
Karenanya, buat atau perbarui berdasarkan keberadaan sumber daya .
Referensi:
sumber
POST
berarti "buat baru" seperti pada "Ini adalah input untuk membuat pengguna, buat untuk saya".PUT
berarti "masukkan, ganti jika sudah ada" seperti pada "Ini adalah data untuk pengguna 5".Anda
POST
mencontoh / pengguna karena Anda belum tahuURL
tentang pengguna, Anda ingin server membuatnya.Anda
PUT
dapat example.com/users/id karena Anda ingin mengganti / membuat pengguna tertentu .POST dua kali dengan data yang sama berarti membuat dua pengguna yang identik dengan id yang berbeda. MENEMPATKAN dua kali dengan data yang sama membuat pengguna menjadi yang pertama dan memutakhirkannya ke status yang sama untuk kedua kalinya (tidak ada perubahan). Karena Anda berakhir dengan keadaan yang sama setelah
PUT
berapa kali Anda melakukan itu, dikatakan "sama kuat" setiap kali - idempoten. Ini berguna untuk mencoba ulang permintaan secara otomatis. Tidak ada lagi 'Anda yakin ingin mengirim ulang' saat Anda menekan tombol kembali pada browser.Saran umum adalah menggunakan
POST
ketika Anda membutuhkan server untuk mengendalikanURL
pembuatan sumber daya Anda. GunakanPUT
sebaliknya. LebihPUT
lebihPOST
.sumber
user 5
jika belum ada? Bukankah maksud Andaupdate, replace if already exists
? atau sesuatuPUT
juga dapat digunakan untuk mengganti nilai sumber daya yang ada secara keseluruhan.Saya ingin menambahkan saran "pragmatis" saya. Gunakan PUT ketika Anda tahu "id" dimana objek yang Anda simpan dapat diambil. Menggunakan PUT tidak akan berfungsi dengan baik jika Anda perlu, katakanlah, basis data yang dihasilkan id untuk dikembalikan agar Anda dapat melakukan pencarian atau pembaruan di masa mendatang.
Jadi: Untuk menyimpan pengguna yang ada, atau pengguna yang menghasilkan id dan diverifikasi bahwa id itu unik:
Jika tidak, gunakan POST untuk awalnya membuat objek, dan PUT untuk memperbarui objek:
sumber
POST /users
. (Perhatikan bahwa/users
itu jamak.) Ini memiliki pengaruh menciptakan pengguna baru dan menjadikannya sumber daya anak dari/users
koleksi.GET /users
masuk akal, terbaca seperti yang Anda inginkan, tetapi saya akan baik-baik saja denganGET /user/<id>
atauPOST /user
(dengan payload untuk kata pengguna baru) karena berbunyi dengan benar 'dapatkan saya pengguna 5' aneh, tetapi 'buat saya pengguna 5' lebih alami. Saya mungkin masih jatuh di sisi pluralisasi :)Gunakan POST untuk membuat, dan PUT untuk memperbarui. Begitulah Ruby on Rails melakukannya.
sumber
POST /items
menambahkan item baru ke sumber daya yang sudah didefinisikan ('item'). Itu tidak, seperti jawabannya, "buat grup." Saya tidak mengerti mengapa ini memiliki 12 suara.PUT /items/42
ini juga valid untuk membuat sumber daya, tetapi hanya jika klien memiliki hak istimewa untuk menyebutkan sumber daya . (Apakah Rails memberi klien hak istimewa penamaan ini?)Keduanya digunakan untuk transmisi data antara klien ke server, tetapi ada perbedaan halus di antaranya, yaitu:
Analogi:
Analogi Media / Jaringan Sosial:
sumber
SISA adalah sangat konsep tingkat tinggi. Bahkan, ia bahkan tidak menyebutkan HTTP sama sekali!
Jika Anda ragu tentang cara mengimplementasikan REST dalam HTTP, Anda selalu dapat melihat spesifikasi Atom Publication Protocol (AtomPub) . AtomPub adalah standar untuk menulis layanan web RESTful dengan HTTP yang dikembangkan oleh banyak tokoh HTTP dan REST, dengan beberapa masukan dari Roy Fielding, penemu REST dan (co-) penemu HTTP sendiri.
Bahkan, Anda bahkan mungkin dapat menggunakan AtomPub secara langsung. Meskipun keluar dari komunitas blogging, itu tidak terbatas pada blogging: itu adalah protokol umum untuk dengan tenang berinteraksi dengan koleksi sewenang-wenang (bersarang) sumber daya sewenang-wenang melalui HTTP. Jika Anda dapat mewakili aplikasi Anda sebagai kumpulan sumber daya yang bersarang, maka Anda bisa menggunakan AtomPub dan tidak khawatir tentang apakah akan menggunakan PUT atau POST, apa yang akan dikembalikan Kode Status HTTP dan semua detailnya.
Inilah yang dikatakan AtomPub tentang penciptaan sumber daya (bagian 9.2):
sumber
Keputusan untuk menggunakan PUT atau POST untuk membuat sumber daya pada server dengan HTTP + REST API didasarkan pada siapa yang memiliki struktur URL. Memiliki klien yang tahu, atau berpartisipasi dalam mendefinisikan, struct URL adalah kopling yang tidak perlu seperti kopling yang tidak diinginkan yang muncul dari SOA. Melarikan jenis-jenis kopling adalah alasan REST begitu populer. Oleh karena itu, metode yang tepat untuk digunakan adalah POST. Ada pengecualian untuk aturan ini dan itu terjadi ketika klien ingin mempertahankan kontrol atas struktur lokasi sumber daya yang digunakannya. Ini jarang dan kemungkinan berarti ada sesuatu yang salah.
Pada titik ini beberapa orang akan berpendapat bahwa jika RESTful-URL digunakan, klien mengetahui URL sumber daya dan karenanya PUT dapat diterima. Lagi pula, inilah sebabnya kanonik, dinormalisasi, Ruby on Rails, URL Django penting, lihat API Twitter ... bla bla bla. Orang-orang itu perlu memahami bahwa tidak ada yang namanya URL yang Tenang dan bahwa Roy Fielding sendiri menyatakan bahwa :
Gagasan RESTful-URL sebenarnya merupakan pelanggaran REST karena server bertanggung jawab atas struktur URL dan harus bebas memutuskan bagaimana menggunakannya untuk menghindari penggandengan. Jika ini membingungkan Anda membaca tentang pentingnya penemuan diri pada desain API.
Menggunakan POST untuk membuat sumber daya hadir dengan pertimbangan desain karena POST tidak idempoten. Ini berarti bahwa mengulang POST beberapa kali tidak menjamin perilaku yang sama setiap kali. Ini membuat orang takut menggunakan PUT untuk membuat sumber daya padahal seharusnya tidak. Mereka tahu itu salah (POST adalah untuk BUAT) tetapi mereka tetap melakukannya karena mereka tidak tahu bagaimana menyelesaikan masalah ini. Kekhawatiran ini ditunjukkan dalam situasi berikut:
Langkah 6 adalah di mana orang biasanya bingung tentang apa yang harus dilakukan. Namun, tidak ada alasan untuk membuat lumpur untuk menyelesaikan masalah ini. Sebaliknya, HTTP dapat digunakan seperti yang ditentukan dalam RFC 2616 dan server membalas:
Membalas dengan kode status 409 Konflik adalah jalan yang benar karena :
Pembaruan berdasarkan rilis RFC 7231 untuk Ganti 2616
RFC 7231 dirancang untuk menggantikan 2616 dan dalam Bagian 4.3.3 menjelaskan respons yang memungkinkan untuk POST
Sekarang mungkin tergoda untuk mengembalikan 303 jika POST diulangi. Namun, yang terjadi adalah sebaliknya. Mengembalikan 303 hanya akan masuk akal jika beberapa permintaan membuat (membuat sumber daya yang berbeda) mengembalikan konten yang sama. Contohnya adalah "terima kasih telah mengirimkan pesan permintaan Anda" bahwa klien tidak perlu mengunduh ulang setiap kali. RFC 7231 masih mempertahankan dalam bagian 4.2.2 bahwa POST tidak boleh idempoten dan terus mempertahankan bahwa POST harus digunakan untuk membuat.
Untuk informasi lebih lanjut tentang ini, baca artikel ini .
sumber
Saya suka saran ini, dari definisi PUT RFC 2616 :
Ini sesuai dengan saran lain di sini, bahwa PUT paling baik diterapkan pada sumber daya yang sudah memiliki nama, dan POST baik untuk membuat objek baru di bawah sumber daya yang ada (dan membiarkan server menamainya).
Saya menafsirkan ini, dan persyaratan idempotensi pada PUT, berarti bahwa:
sumber
Pendeknya:
PUT idempoten, di mana status sumber daya akan sama jika operasi yang sama dijalankan satu kali atau beberapa kali.
POST adalah non-idempoten, di mana keadaan sumber daya dapat menjadi berbeda jika operasi dijalankan beberapa kali dibandingkan dengan mengeksekusi satu kali.
Analogi dengan kueri basis data
PUT Anda dapat memikirkan mirip dengan "UPDATE STUDENT SET address =" abc "di mana id =" 123 ";
POST Anda dapat memikirkan sesuatu seperti "INSERT INTO STUDENT (nama, alamat) VALUES (" abc "," xyzzz ");
Id Pelajar dihasilkan secara otomatis.
Dengan PUT, jika kueri yang sama dijalankan beberapa kali atau satu kali, status tabel STUDENT tetap sama.
Dalam hal POST, jika kueri yang sama dijalankan beberapa kali, beberapa catatan Siswa akan dibuat dalam basis data dan status basis data berubah pada setiap eksekusi kueri "INSERT".
CATATAN: PUT membutuhkan lokasi sumber daya (sudah-sumber daya) di mana pembaruan perlu terjadi, sedangkan POST tidak mengharuskan itu. Karena itu secara intuitif POST dimaksudkan untuk menciptakan sumber daya baru, sedangkan PUT diperlukan untuk memperbarui sumber daya yang sudah ada.
Beberapa mungkin datang dengan pembaruan yang dapat dilakukan dengan POST. Tidak ada aturan keras yang mana yang digunakan untuk pembaruan atau yang digunakan untuk membuat. Sekali lagi ini adalah konvensi, dan secara intuitif saya cenderung dengan alasan yang disebutkan di atas dan mengikutinya.
sumber
POST seperti mengirim surat ke kotak surat atau memposting email ke antrian email. PUT seperti ketika Anda meletakkan objek di lubang kecil atau tempat di rak (memiliki alamat yang diketahui).
Dengan POST, Anda memposting ke alamat QUEUE atau COLLECTION. Dengan PUT, Anda memasukkan ke alamat ITEM.
PUT idempoten. Anda dapat mengirim permintaan 100 kali dan itu tidak masalah. POST tidak idempoten. Jika Anda mengirim permintaan 100 kali, Anda akan mendapatkan 100 email atau 100 surat di kotak pos Anda.
Aturan umum: jika Anda tahu id atau nama item, gunakan PUT. Jika Anda ingin id atau nama item ditugaskan oleh pihak penerima, gunakan POST.
sumber
Jawaban baru (sekarang saya mengerti REST dengan lebih baik):
PUT hanyalah pernyataan tentang konten apa yang harus digunakan layanan, mulai sekarang, untuk membuat representasi sumber daya yang diidentifikasi oleh klien; POST adalah pernyataan konten apa yang harus dimiliki layanan, mulai sekarang, (mungkin digandakan) tetapi terserah server cara mengidentifikasi konten itu.
PUT x
(jikax
mengidentifikasi sumber daya ): "Ganti konten sumber daya yang diidentifikasix
dengan konten saya."PUT x
(jikax
tidak mengidentifikasi sumber daya): "Buat sumber daya baru yang mengandung konten dan penggunaan sayax
untuk mengidentifikasinya."POST x
: "Simpan konten saya dan beri saya pengenal yang dapat saya gunakan untuk mengidentifikasi sumber daya (lama atau baru) yang mengandung konten tersebut (mungkin dicampur dengan konten lain). Sumber daya yang disebutkan harus identik atau lebih rendah dari yangx
diidentifikasi." " Sumber daya y adalah lebih rendah dari sumber x " biasanya tetapi tidak harus diimplementasikan dengan menjadikan y subpath dari x (misalnya x =/foo
dan y =/foo/bar
) dan memodifikasi representasi (s) dari sumber x untuk mencerminkan keberadaan dari sumber daya baru, misalnya dengan hyperlink ke ySumber daya dan beberapa metadata. Hanya yang terakhir yang benar-benar penting untuk desain yang baik, karena URL tidak jelas di REST - Anda seharusnya menggunakan hypermedia alih-alih konstruksi URL sisi klien untuk melintasi layanan.Di REST, tidak ada sumber daya yang mengandung "konten". Saya merujuk sebagai "konten" ke data yang digunakan layanan untuk membuat representasi secara konsisten. Biasanya terdiri dari beberapa baris terkait dalam database atau file (misalnya file gambar). Terserah layanan untuk mengubah konten pengguna menjadi sesuatu yang dapat digunakan layanan, misalnya mengubah muatan JSON menjadi pernyataan SQL.
Jawaban asli (mungkin lebih mudah dibaca) :
PUT /something
(jika/something
sudah ada): "Ambil apa pun yang Anda miliki di/something
dan gantikan dengan apa yang saya berikan kepada Anda."PUT /something
(jika/something
belum ada): "Ambil apa yang kuberikan padamu dan letakkan di situ/something
."POST /something
: "Ambil apa yang saya berikan kepada Anda dan letakkan di mana pun Anda inginkan/something
selama Anda memberi saya URL-nya ketika Anda selesai."sumber
Jawaban singkat:
Aturan praktis sederhana: Gunakan POST untuk membuat, gunakan PUT untuk memperbarui.
Jawaban panjang:
POS:
TARUH:
Jawaban yang lebih panjang:
Untuk memahaminya kita perlu mempertanyakan mengapa PUT diperlukan, masalah apa yang PUT coba selesaikan yang POST tidak bisa.
Dari sudut pandang arsitektur REST tidak ada yang penting. Kita bisa hidup tanpa PUT juga. Tetapi dari sudut pandang pengembang klien itu membuat hidupnya jauh lebih sederhana.
Sebelum PUT, klien tidak dapat secara langsung mengetahui URL yang dihasilkan server atau apakah semua itu menghasilkan atau apakah data yang akan dikirim ke server sudah diperbarui atau belum. PUT membebaskan pengembang dari semua sakit kepala ini. PUT idempoten, PUT menangani kondisi lomba, dan PUT memungkinkan klien memilih URL.
sumber
Ruby on Rails 4.0 akan menggunakan metode 'PATCH' alih-alih PUT untuk melakukan pembaruan parsial.
RFC 5789 mengatakan tentang PATCH (sejak 1995):
" Edge Rails: PATCH adalah metode HTTP primer baru untuk pembaruan " menjelaskannya.
sumber
Dengan risiko menyatakan kembali apa yang telah dikatakan, tampaknya penting untuk diingat bahwa PUT menyiratkan bahwa klien mengontrol apa yang akan terjadi pada URL , saat membuat sumber daya. Jadi bagian dari pilihan antara PUT dan POST adalah tentang seberapa besar Anda dapat mempercayai klien untuk memberikan URL yang benar dan dinormalisasi yang yang koheren dengan apa pun skema URL Anda.
Ketika Anda tidak dapat sepenuhnya memercayai klien untuk melakukan hal yang benar, akan lebih tepat menggunakan POST untuk membuat item baru dan kemudian mengirim URL kembali ke klien sebagai tanggapan.
sumber
Location
header yang tidak berisi nama sumber daya kanonik.PUT /X-files/series/4/episodes/max
) dan server merespons dengan URI yang menyediakan tautan unik pendek kanonik ke sumber daya baru (yaitu/X-Ffiles/episodes/91
)Dengan cara yang sangat sederhana saya mengambil contoh timeline Facebook.
Kasus 1: Ketika Anda memposting sesuatu di timeline Anda, itu adalah entri baru yang baru. Jadi dalam hal ini mereka menggunakan metode POST karena metode POST adalah non-idempoten.
Kasus 2: Jika teman Anda mengomentari kiriman Anda pertama kali, itu juga akan membuat entri baru di database sehingga metode POST digunakan.
Kasus 3: Jika teman Anda mengedit komentarnya, dalam hal ini, mereka memiliki id komentar, sehingga mereka akan memperbarui komentar yang sudah ada alih-alih membuat entri baru dalam database. Karenanya untuk jenis operasi ini gunakan metode PUT karena idempoten. *
Dalam satu baris, gunakan POST untuk menambahkan entri baru dalam database dan PUT untuk memperbarui sesuatu dalam database.
sumber
Pertimbangan terpenting adalah keandalan . Jika pesan POST hilang, status sistem tidak ditentukan. Pemulihan otomatis tidak mungkin. Untuk pesan PUT, status tidak ditentukan hanya sampai percobaan pertama yang berhasil.
Misalnya, mungkin bukan ide yang baik untuk membuat transaksi kartu kredit dengan POST.
Jika Anda memiliki URI yang dihasilkan secara otomatis di sumber daya Anda, Anda masih dapat menggunakan PUT dengan meneruskan URI yang dihasilkan (menunjuk ke sumber daya kosong) ke klien.
Beberapa pertimbangan lain:
sumber
Pembaca yang baru mengenal topik ini akan dikejutkan oleh diskusi tanpa akhir tentang apa yang harus Anda lakukan, dan relatif tidak adanya pelajaran dari pengalaman. Fakta bahwa REST "lebih disukai" daripada SOAP adalah, saya kira, pembelajaran tingkat tinggi dari pengalaman, tetapi kebaikan kita pasti telah berkembang dari sana? Ini 2016. Disertasi Roy tahun 2000. Apa yang kami kembangkan? Apakah itu menyenangkan? Apakah mudah diintegrasikan? Mendukung? Apakah ini akan menangani kebangkitan smartphone dan koneksi seluler yang rapuh?
Menurut ME, jaringan kehidupan nyata tidak bisa diandalkan. Permintaan batas waktu. Koneksi diatur ulang. Jaringan mati selama berjam-jam atau berhari-hari. Kereta masuk ke terowongan dengan pengguna seluler naik. Untuk setiap permintaan yang diberikan (seperti yang kadang-kadang diakui dalam semua diskusi ini) permintaan tersebut dapat jatuh ke dalam air dalam perjalanannya, atau responsnya dapat jatuh ke dalam air dalam perjalanan kembali. Dalam kondisi ini, mengeluarkan permintaan PUT, POST dan DELETE langsung terhadap sumber daya substantif selalu membuat saya sedikit brutal dan naif.
HTTP tidak melakukan apa pun untuk memastikan penyelesaian permintaan-respons yang andal, dan itu baik-baik saja karena ini adalah pekerjaan yang benar dari aplikasi yang sadar jaringan. Mengembangkan aplikasi seperti itu, Anda dapat melompat melalui lingkaran untuk menggunakan PUT daripada POST, kemudian lebih banyak lingkaran untuk memberikan jenis kesalahan tertentu pada server jika Anda mendeteksi permintaan duplikat. Kembali ke klien, Anda kemudian harus melewati rintangan untuk menafsirkan kesalahan ini, mengambil ulang, memvalidasi ulang dan memposting ulang.
Atau Anda dapat melakukan ini : anggap permintaan Anda yang tidak aman sebagai sumber daya pengguna tunggal sesaat (sebut saja tindakan). Klien meminta "tindakan" baru pada sumber daya substantif dengan POST kosong ke sumber daya. POST hanya akan digunakan untuk ini. Setelah dengan aman memiliki URI dari tindakan yang baru dicetak, klien PUT permintaan yang tidak aman untuk tindakan URI, bukan sumber daya target . Menyelesaikan tindakan dan memperbarui sumber daya "nyata" adalah pekerjaan API Anda dengan benar, dan di sini dipisahkan dari jaringan yang tidak dapat diandalkan.
Server melakukan bisnis, mengembalikan respons dan menyimpannya terhadap tindakan yang disepakati URI . Jika ada yang tidak beres, klien mengulangi permintaan (perilaku alami!), Dan jika server sudah melihatnya, ia mengulangi respons yang tersimpan dan tidak melakukan hal lain .
Anda akan segera menemukan kesamaan dengan janji: kami membuat dan mengembalikan placeholder untuk hasil sebelum melakukan apa pun. Juga seperti janji, suatu tindakan dapat berhasil atau gagal satu kali, tetapi hasilnya dapat diambil berulang kali.
Yang terbaik dari semuanya, kami memberikan aplikasi pengiriman dan penerimaan kesempatan untuk menghubungkan tindakan yang diidentifikasi secara unik dengan keunikan di lingkungan masing-masing. Dan kita dapat mulai menuntut, dan menegakkan !, perilaku yang bertanggung jawab dari klien: ulangi permintaan Anda sebanyak yang Anda suka, tetapi jangan menghasilkan tindakan baru sampai Anda memiliki hasil yang pasti dari yang sudah ada.
Dengan demikian, banyak masalah pelik hilang. Permintaan memasukkan berulang tidak akan membuat duplikat, dan kami tidak membuat sumber daya yang sebenarnya sampai kami memiliki data. (kolom basis data dapat tetap tidak dapat dibatalkan). Permintaan pembaruan berulang tidak akan mengenai kondisi yang tidak kompatibel dan tidak akan menimpa perubahan berikutnya. Klien dapat (mengambil kembali) dan memproses dengan mulus konfirmasi asli untuk alasan apa pun (klien macet, respons hilang, dll.).
Permintaan penghapusan yang berurutan dapat melihat dan memproses konfirmasi asli, tanpa menemukan kesalahan 404. Jika hal-hal memakan waktu lebih lama dari yang diharapkan, kami dapat merespons sementara, dan kami memiliki tempat di mana klien dapat memeriksa kembali untuk hasil yang pasti. Bagian terbaik dari pola ini adalah properti Kung-Fu (Panda). Kami mengambil kelemahan, kecenderungan bagi klien untuk mengulangi permintaan kapan saja mereka tidak memahami responsnya, dan mengubahnya menjadi kekuatan :-)
Sebelum memberi tahu saya ini bukan RESTful, harap pertimbangkan banyak cara di mana prinsip REST dihormati. Klien tidak membuat URL. API tetap dapat ditemukan, meskipun dengan sedikit perubahan dalam semantik. Kata kerja HTTP digunakan dengan tepat. Jika Anda pikir ini adalah perubahan besar untuk diterapkan, saya dapat memberi tahu Anda dari pengalaman bahwa itu bukan.
Jika Anda berpikir Anda akan memiliki banyak data untuk disimpan, mari kita bicara volume: konfirmasi pembaruan khas adalah sebagian kecil dari satu kilobyte. HTTP saat ini memberi Anda satu atau dua menit untuk merespons secara definitif. Bahkan jika Anda hanya menyimpan aksi selama seminggu, klien memiliki banyak kesempatan untuk mengejar ketinggalan. Jika Anda memiliki volume yang sangat tinggi, Anda mungkin menginginkan penyimpanan nilai kunci yang sesuai dengan asam, atau solusi dalam memori.
sumber
Selain perbedaan yang disarankan oleh orang lain, saya ingin menambahkan satu lagi.
Dalam metode POST Anda dapat mengirim params masuk
form-data
Dalam metode PUT Anda harus mengirim params masuk
x-www-form-urlencoded
Header
Content-Type:application/x-www-form-urlencoded
Menurut ini, Anda tidak dapat mengirim file atau data multi-bagian dalam metode PUT
EDIT
Yang berarti jika Anda harus mengirimkan
Anda harus menggunakan metode POST
sumber
Tampaknya selalu ada beberapa kebingungan kapan harus menggunakan HTTP POST versus metode HTTP PUT untuk layanan REST. Sebagian besar pengembang akan mencoba mengaitkan operasi CRUD secara langsung dengan metode HTTP. Saya akan berpendapat bahwa ini tidak benar dan kita tidak bisa begitu saja mengasosiasikan konsep CRUD dengan metode HTTP. Itu adalah:
Memang benar bahwa R (etrieve) dan D (elete) dari operasi CRUD dapat dipetakan langsung ke metode HTTP GET dan DELETE masing-masing. Namun, kebingungannya terletak pada operasi C (reate) dan U (update). Dalam beberapa kasus, seseorang dapat menggunakan PUT untuk membuat sementara dalam kasus lain POST akan diperlukan. Ambiguitas terletak pada definisi metode HTTP PUT versus metode HTTP POST.
Menurut spesifikasi HTTP 1.1, metode GET, HEAD, DELETE, dan PUT harus idempoten, dan metode POST tidak idempoten. Artinya, suatu operasi idempoten jika dapat dilakukan pada sumber daya sekali atau berkali-kali dan selalu mengembalikan keadaan yang sama dari sumber daya itu. Sedangkan operasi non idempoten dapat mengembalikan keadaan sumber daya yang dimodifikasi dari satu permintaan ke permintaan lainnya. Karenanya, dalam operasi non idempoten, tidak ada jaminan bahwa seseorang akan menerima kondisi sumber daya yang sama.
Berdasarkan definisi idempoten di atas, pendapat saya tentang menggunakan metode HTTP PUT versus menggunakan metode HTTP POST untuk layanan REST adalah: Gunakan metode HTTP PUT ketika:
Dalam kedua kasus, operasi ini dapat dilakukan beberapa kali dengan hasil yang sama. Itu adalah sumber daya tidak akan diubah dengan meminta operasi lebih dari sekali. Oleh karena itu, operasi idempoten sejati. Gunakan metode HTTP POST ketika:
Kesimpulan
Jangan langsung mengkorelasikan dan memetakan operasi CRUD ke metode HTTP untuk layanan REST. Penggunaan metode HTTP PUT versus metode HTTP POST harus didasarkan pada aspek idempoten dari operasi itu. Artinya, jika operasi idempoten, maka gunakan metode HTTP PUT. Jika operasi ini bukan idempoten, maka gunakan metode HTTP POST.
sumber
Jadi Anda menggunakan POST dan mungkin, tetapi PUT tidak perlu untuk pembuatan sumber daya. Anda tidak harus mendukung keduanya. Bagi saya POST sudah cukup sempurna. Jadi itu adalah keputusan desain.
Seperti kutipan Anda sebutkan, Anda menggunakan PUT untuk membuat tidak ada sumber daya yang ditetapkan untuk IRI, dan Anda tetap ingin membuat sumber daya. Misalnya,
PUT /users/123/password
biasanya mengganti kata sandi lama dengan yang baru, tetapi Anda dapat menggunakannya untuk membuat kata sandi jika kata sandi tersebut belum ada (misalnya, oleh pengguna yang baru terdaftar atau dengan mengembalikan pengguna yang diblokir).sumber
Saya akan mendarat dengan yang berikut:
PUT mengacu pada sumber daya, yang diidentifikasi oleh URI. Dalam hal ini, Anda memperbaruinya. Ini adalah bagian dari tiga kata kerja yang merujuk pada sumber daya - hapus dan menjadi dua lainnya.
POST pada dasarnya adalah pesan bentuk bebas, dengan artinya didefinisikan 'out of band'. Jika pesan dapat diartikan sebagai menambahkan sumber daya ke direktori, itu tidak masalah, tetapi pada dasarnya Anda perlu memahami pesan yang Anda kirim (posting) untuk mengetahui apa yang akan terjadi dengan sumber daya.
Karena PUT dan DAPATKAN dan HAPUS merujuk ke sumber daya, mereka juga menurut definisi idempoten.
POST dapat melakukan tiga fungsi lainnya, tetapi kemudian semantik permintaan akan hilang pada perantara seperti cache dan proxy. Ini juga berlaku untuk memberikan keamanan pada sumber daya, karena URI posting tidak selalu menunjukkan sumber daya yang diterapkannya (meskipun dapat).
A PUT tidak perlu menjadi sebuah ciptaan; layanan dapat error jika sumber daya belum dibuat, tetapi jika tidak perbarui. Atau sebaliknya - mungkin membuat sumber daya, tetapi tidak mengizinkan pembaruan. Satu-satunya hal yang diperlukan tentang PUT adalah bahwa ia menunjuk ke sumber daya tertentu, dan muatannya adalah representasi dari sumber daya itu. PUT yang berhasil berarti (mencegah gangguan) bahwa GET akan mengambil sumber daya yang sama.
Sunting: Satu hal lagi - seorang PUT dapat membuat, tetapi jika itu dilakukan maka ID tersebut harus merupakan ID alami - AKA alamat email. Dengan begitu ketika Anda PUT dua kali, put kedua adalah pembaruan yang pertama. Ini membuatnya idempoten .
Jika ID dibuat (misalnya ID karyawan baru), maka PUT kedua dengan URL yang sama akan membuat catatan baru, yang melanggar aturan idempoten. Dalam hal ini kata kerjanya adalah POST, dan pesannya (bukan sumber daya) adalah membuat sumber daya menggunakan nilai-nilai yang didefinisikan dalam pesan ini.
sumber
Semantiknya seharusnya berbeda, dalam "PUT", seperti "GET" seharusnya idempoten - artinya, Anda dapat meminta PUT persis sama beberapa kali dan hasilnya akan seolah-olah Anda hanya mengeksekusi sekali.
Saya akan menjelaskan tentang konvensi yang menurut saya paling banyak digunakan dan paling berguna:
Ketika Anda PUT sumber daya di URL tertentu yang terjadi adalah bahwa itu harus disimpan di URL itu, atau sesuatu di sepanjang baris itu.
Ketika Anda POST ke sumber daya di URL tertentu, seringkali Anda memposting informasi terkait ke URL itu. Ini menyiratkan bahwa sumber daya di URL sudah ada.
Misalnya, ketika Anda ingin membuat aliran baru, Anda dapat PUT ke beberapa URL. Tetapi ketika Anda ingin POST pesan ke aliran yang ada, Anda POST ke URL-nya.
Sedangkan untuk memodifikasi properti stream, Anda dapat melakukannya dengan PUT atau POST. Pada dasarnya, hanya gunakan "PUT" ketika operasi idempoten - jika tidak gunakan POST.
Perhatikan, bagaimanapun, bahwa tidak semua browser modern mendukung kata kerja HTTP selain GET atau POST.
sumber
Sebagian besar waktu, Anda akan menggunakannya seperti ini:
Sebagai contoh:
Dalam kedua kasus, badan permintaan berisi data untuk sumber daya yang akan dibuat atau diperbarui. Seharusnya jelas dari nama rute bahwa POST tidak idempoten (jika Anda menyebutnya 3 kali itu akan membuat 3 objek), tetapi PUT adalah idempoten (jika Anda memanggilnya 3 kali hasilnya sama). PUT sering digunakan untuk operasi "aktif" (buat atau perbarui), tetapi Anda selalu dapat mengembalikan kesalahan 404 jika Anda hanya ingin menggunakannya untuk memodifikasi.
Perhatikan bahwa POST "membuat" elemen baru dalam koleksi, dan PUT "mengganti" elemen pada URL yang diberikan, tetapi itu adalah praktik yang sangat umum untuk menggunakan PUT untuk modifikasi sebagian, yaitu, menggunakannya hanya untuk memperbarui sumber daya yang ada dan hanya memodifikasi bidang yang disertakan dalam tubuh (mengabaikan bidang lainnya). Ini secara teknis salah, jika Anda ingin menjadi REST-purist, PUT harus mengganti seluruh sumber daya dan Anda harus menggunakan PATCH untuk pembaruan parsial. Saya pribadi tidak terlalu peduli sejauh perilakunya jelas dan konsisten di semua titik akhir API Anda.
Ingat, REST adalah seperangkat konvensi dan pedoman untuk menjaga API Anda tetap sederhana. Jika Anda berakhir dengan penyelesaian yang rumit hanya untuk mencentang kotak "RESTfull" maka Anda mengalahkan tujuannya;)
sumber
Meskipun mungkin ada cara agnostik untuk menggambarkan ini, tampaknya bertentangan dengan berbagai pernyataan dari jawaban situs web.
Mari kita menjadi sangat jelas dan langsung ke sini. Jika Anda seorang pengembang .NET yang bekerja dengan Web API, faktanya adalah (dari dokumentasi Microsoft API), http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web -api-that-support-crud-operations :
Tentu Anda "dapat" menggunakan "POST" untuk memperbarui, tetapi cukup ikuti konvensi yang ditetapkan untuk Anda dengan kerangka kerja yang Anda berikan. Dalam kasus saya ini adalah .NET / Web API, jadi PUT untuk UPDATE tidak ada perdebatan.
Saya harap ini membantu setiap pengembang Microsoft yang membaca semua komentar dengan tautan situs web Amazon dan Sun / Java.
sumber
Ini aturan sederhana:
PUT ke URL harus digunakan untuk memperbarui atau membuat sumber daya yang dapat ditemukan di URL itu.
POST ke URL harus digunakan untuk memperbarui atau membuat sumber daya yang terletak di beberapa URL ("bawahan") lainnya, atau tidak dapat ditemukan melalui HTTP.
sumber
Jika Anda terbiasa dengan operasi basis data, ada
Saya menggunakan
PUT
untuk Gabung dan memperbarui operasi seperti dan gunakanPOST
untuk Penyisipan.sumber
Dalam praktiknya, POST bekerja dengan baik untuk menciptakan sumber daya. URL sumber daya yang baru dibuat harus dikembalikan di header respons Lokasi. PUT harus digunakan untuk memperbarui sumber daya sepenuhnya. Harap mengerti bahwa ini adalah praktik terbaik saat merancang API RESTful. Spesifikasi HTTP tidak membatasi penggunaan PUT / POST dengan beberapa batasan untuk membuat / memperbarui sumber daya. Lihatlah http://techoctave.com/c7/posts/71-twitter-rest-api-dissected yang merangkum praktik terbaik.
sumber