Menurut HTTP/1.1 Spec:
POST
metode ini digunakan untuk meminta server asal menerima entitas tertutup dalam permintaan sebagai bawahan dari sumber daya yang diidentifikasi olehRequest-URI
diRequest-Line
Dengan kata lain, POST
digunakan untuk buat.
MENEMPATKAN
metode permintaan yang tertutup entitas yang akan disimpan di bawah disediakanRequest-URI
. JikaRequest-URI
mengacu pada yang sudah ada sumber daya, tertutup entitas HARUS dianggap sebagai sebuah versi modifikasi dari satu berada pada server asal. JikaRequest-URI
tidak menunjuk ke sebuah sumber daya yang ada, dan bahwa URI mampu didefinisikan sebagai sumber daya baru dengan meminta user agent, server asal dapat menciptakan sumber daya dengan URI."
Artinya, MENEMPATKAN
digunakan untuk membuat atau memperbarui.
Jadi, mana yang harus digunakan untuk menciptakan sumber daya? Atau salah satu kebutuhan untuk mendukung keduanya?
Secara keseluruhan:
Kedua DIMASUKKAN dan POS dapat digunakan untuk membuat.
Anda harus bertanya "apa yang anda melakukan tindakan untuk?" untuk membedakan apa yang anda harus menggunakan. Let's asumsikan anda're merancang sebuah API untuk mengajukan pertanyaan. Jika anda ingin menggunakan POS, maka anda akan melakukan hal itu pada daftar pertanyaan. Jika anda ingin menggunakan MASUKAN maka anda akan melakukan itu untuk pertanyaan tertentu.
Besar keduanya dapat digunakan, jadi mana yang harus saya gunakan dalam saya Tidur desain:
Anda tidak perlu untuk mendukung kedua DIMASUKKAN dan POSTING.
Yang digunakan adalah diserahkan kepada anda. Tapi ingat untuk menggunakan hak satu tergantung pada obyek apa yang anda referensi dalam permintaan.
Beberapa pertimbangan:
Contoh:
Saya tulis berikut sebagai bagian dari jawaban lain SEHINGGA mengenai hal ini:
POST:**
Digunakan untuk memodifikasi dan memperbarui sumber daya
POSTING /pertanyaan/
HTTP/1.1 Host: www.example.com/ Dicatat bahwa berikut ini adalah kesalahan:
POSTING /pertanyaan/
HTTP/1.1 Host: www.example.com/ Jika URL-nya belum dibuat, anda tidak harus menggunakan POST untuk membuat saat menentukan nama. Ini harus menghasilkan 'sumber daya tidak ditemukan' kesalahan karena
<new_question>
tidak ada belum. Anda harus MENEMPATKAN<new_question>
sumber daya pada server pertama.Anda bisa melakukan sesuatu seperti ini untuk menciptakan sumber daya menggunakan POS:
POSTING /pertanyaan HTTP/1.1 Host: www.example.com/
Perhatikan bahwa dalam hal ini sumber daya nama tidak ditentukan, benda baru URL path akan dikembalikan kepada anda.
MASUKAN:
Digunakan untuk membuat sumber daya, atau menimpanya. Saat anda menentukan sumber daya URL baru.
Untuk sumber daya baru:
MASUKAN /pertanyaan/
HTTP/1.1 Host: www.example.com/ Untuk menimpa sumber daya yang ada:
MASUKAN /pertanyaan/
HTTP/1.1 Host: www.example.com/
Anda dapat menemukan pernyataan-pernyataan di web yang mengatakan
Tidak cukup tepat.
Lebih baik untuk memilih antara MASUKAN dan POS berdasarkan idempotence tindakan.
PUT berarti menempatkan sumber daya benar-benar mengganti apapun yang tersedia di URL yang diberikan dengan hal yang berbeda. Menurut definisi, adalah MENEMPATKAN idempotent. Lakukan sebanyak yang anda suka, dan hasilnya adalah sama. x=5
adalah idempotent. Anda dapat MENEMPATKAN sumber daya baik itu yang sebelumnya ada, atau tidak (misalnya, untuk Membuat, atau untuk Update)!
POST update sumber daya, menambah anak perusahaan sumber daya, atau menyebabkan perubahan. POSTING ini tidak idempotent, dalam cara yang x++
tidak idempotent.
Dengan argumen ini, MENEMPATKAN ini untuk menciptakan ketika anda tahu URL dari hal yang akan anda buat. POSTING dapat digunakan untuk membuat ketika anda tahu URL dari "pabrik" atau manajer untuk kategori hal-hal yang ingin anda buat.
jadi:
POST /expense-report
atau:
PUT /expense-report/10929
Spesifikasi relevan untuk MENEMPATKAN dan POSTING RFC 2616 §9.5 ff.
POSTING menciptakan anak resource, jadi POSTING ke /item
menciptakan sumber daya yang hidup di bawah /item
sumber daya.
Misalnya. /item/1
. Pengiriman paket pos yang sama dua kali akan membuat dua sumber daya.
PUT untuk membuat atau mengganti sumber daya pada URL yang dikenal oleh klien.
Oleh karena itu: PUT hanya kandidat untuk MENCIPTAKAN dimana klien sudah mengetahui url sebelum sumber daya yang dibuat. Misalnya. /blog/nigel/masuk/when_to_use_post_vs_put
sebagai judul digunakan sebagai sumber daya kunci
PUT menggantikan sumber daya yang dikenal url jika sudah ada, sehingga pengiriman permintaan yang sama dua kali tidak memiliki efek. Dengan kata lain, panggilan untuk MENEMPATKAN idempotent.
RFC berbunyi seperti ini:
perbedaan mendasar antara POS dan MENEMPATKAN permintaan yang tercermin dalam makna berbeda dari Request-URI. URI di POSTING permintaan mengidentifikasi sumber daya yang akan menangani tertutup badan. Sumber daya yang mungkin data-menerima proses, pintu gerbang ke beberapa protokol lain, atau entitas yang terpisah yang menerima penjelasan. Sebaliknya, URI dalam MENEMPATKAN permintaan mengidentifikasi entitas tertutup dengan meminta-agen pengguna tahu apa yang URI dimaksudkan dan server TIDAK HARUS mencoba untuk menerapkan permintaan untuk beberapa sumber daya lainnya. Jika server keinginan bahwa permintaan akan diterapkan ke URI yang berbeda,
Catatan: MENEMPATKAN sebagian besar telah digunakan untuk memperbarui sumber daya (dengan mengganti mereka entireties), tapi baru-baru ini ada gerakan ke arah menggunakan PATCH untuk memperbarui sumber daya yang ada, seperti MENEMPATKAN menentukan bahwa itu menggantikan seluruh sumber daya. RFC 5789.
Update 2018: Ada hal yang dapat dilakukan untuk menghindari MENEMPATKAN. Lihat "SISANYA tanpa MENEMPATKAN"
Dengan "ISTIRAHAT tanpa MENEMPATKAN" teknik, ide adalah bahwa konsumen dipaksa untuk posting baru 'nounified' permintaan sumber daya. Seperti yang dibahas sebelumnya, mengubah alamat surat menyurat merupakan POSTING baru "ChangeOfAddress" sumber daya, tidak MENEMPATKAN seorang "Pelanggan" sumber daya dengan berbagai alamat bidang nilai.
diambil dari REST API Desain - Sumber daya Pemodelan oleh Prakash Subramaniam dari Thoughtworks
Ini kekuatan API untuk menghindari keadaan transisi masalah dengan beberapa klien memperbarui sumber tunggal, dan pertandingan yang lebih baik dengan acara sourcing dan CQRS. Ketika pekerjaan dilakukan secara asinkron, POSTing transformasi dan menunggu untuk itu harus diterapkan tampaknya tepat.
Dapat dilakukan dengan MENEMPATKAN atau POS dengan cara sebagai berikut:
MASUKAN
Menciptakan ** baru sumber daya dengan newResourceId sebagai pengenal, di bawah /sumber daya URI, atau koleksi**.
MASUKAN /sumber/
HTTP/1.1 POS
Menciptakan A sumber daya baru di bawah /sumber daya URI, atau koleksi. Biasanya pengenal yang dikembalikan oleh server.
POS /sumber daya HTTP/1.1
Bisa hanya dapat dilakukan dengan MENEMPATKAN dengan cara sebagai berikut:
MASUKAN
Update sumber daya dengan existingResourceId sebagai pengenal, di bawah /sumber daya URI, atau koleksi.
MASUKAN /sumber/
HTTP/1.1
Ketika berhadapan dengan ISTIRAHAT dan URI secara umum, anda memiliki generic pada left dan khusus pada right. The obat generik biasanya disebut koleksi dan khusus barang yang bisa disebut sumber daya. Perhatikan bahwa sumber daya dapat mengandung koleksi.
Contoh:
<-- generik tertentu -- -->
URI: website.com/users/john website.com - seluruh situs pengguna - koleksi pengguna john - barang koleksi, atau sumber daya
URI:website.com/users/john/posts/23 website.com - seluruh situs pengguna - koleksi pengguna john - barang koleksi, atau sumber daya tulisan - kumpulan tulisan dari john 23 - post dari john dengan identifier 23, juga sumber daya
Ketika anda menggunakan POSTING anda selalu mengacu ke koleksi, sehingga setiap kali anda mengatakan:
POST /users HTTP/1.1
anda posting pengguna baru ke users koleksi.
Jika anda pergi dan mencoba sesuatu seperti ini:
POST /users/john HTTP/1.1
ia akan bekerja, tetapi secara semantik anda mengatakan bahwa anda ingin menambahkan sumber daya ke john koleksi di bawah users koleksi.
Setelah anda menggunakan MASUKAN yang merujuk ke sumber daya atau item tunggal, mungkin di dalam koleksi. Jadi, ketika anda mengatakan:
PUT /users/john HTTP/1.1
anda mengatakan ke server pembaruan, atau membuat jika itu doesn't ada, john sumber daya di bawah users koleksi.
Mari saya menyoroti beberapa bagian penting dari spec:
*POST * metode ini digunakan untuk permintaan yang asal-server menerima entitas tertutup dalam permintaan sebagai new bawahan** dari sumber daya yang diidentifikasi oleh Request-URI di Request-Line
Oleh karena itu, menciptakan baru sumber daya pada koleksi.
PUT metode permintaan yang tertutup badan menjadi disimpan di bawah disediakan Request-URI. Jika Permintaan-URI mengacu pada sudah ada sumber daya, tertutup entitas HARUS dianggap sebagai versi yang sudah dimodifikasi dari satu berada pada server asal. Jika Permintaan-URI tidak tidak arahkan ke aplikasi yang sudah ada sumber daya, dan bahwa URI mampu yang didefinisikan sebagai a new sumber daya dengan meminta user agent, server asal dapat buat sumber daya dengan URI."
Oleh karena itu, membuat atau memperbarui berdasarkan keberadaan sumber daya.
I'd ingin menambahkan saya "pragmatis" nasihat. Gunakan DIMASUKKAN ketika anda tahu "id" dengan objek yang anda simpan dapat diambil. Menggunakan MENEMPATKAN won't bekerja terlalu baik jika anda perlu, mengatakan, sebuah database yang dihasilkan id harus dikembalikan bagi anda untuk melakukan perilaku pencarian atau update.
Jadi: Untuk menyimpan pengguna yang ada, atau salah satu di mana klien menghasilkan id dan's telah diverifikasi bahwa id yang unik:
PUT /user/12345 HTTP/1.1 <-- create the user providing the id 12345
Host: mydomain.com
GET /user/12345 HTTP/1.1 <-- return that user
Host: mydomain.com
Jika tidak, gunakan POST awalnya membuat objek, dan DIMASUKKAN untuk memperbarui objek:
POST /user HTTP/1.1 <--- create the user, server returns 12345
Host: mydomain.com
PUT /user/12345 HTTP/1.1 <--- update the user
Host: mydomain.com
POSTING berarti "buat baru" seperti "di Sini adalah input untuk membuat user, membuat ini untuk saya".
MENEMPATKAN berarti "insert, ganti jika sudah ada" seperti "Berikut adalah data untuk user 5".
Anda POSTING ke example.com/users karena anda don't tahu URL dari pengguna namun, anda ingin server untuk membuat itu.
Anda MENEMPATKAN ke example.com/users/id karena anda ingin mengganti/membuat spesifik user.
POSTing dua kali dengan data yang sama berarti membuat dua identik pengguna dengan id yang berbeda. PUTing dua kali dengan data yang sama menciptakan pengguna pertama dan update-nya ke negara yang sama kedua kalinya (tidak ada perubahan). Karena anda berakhir dengan keadaan yang sama setelah DIMASUKKAN tidak peduli berapa kali anda melakukan itu, hal ini dikatakan "sama-sama ampuh" setiap waktu - idempotent. Hal ini berguna untuk secara otomatis mencoba kembali permintaan. Tidak ada lagi 'apakah anda yakin anda ingin mengirim ulang' ketika anda menekan tombol back pada browser.
Saran secara umum adalah dengan menggunakan POS ketika anda membutuhkan server dapat di kontrol dari generasi URL dari sumber daya anda. Penggunaan MENEMPATKAN sebaliknya. Sukai DILETAKKAN di atas POSTING.
Keduanya digunakan untuk transmisi data antara client ke server, tapi ada perbedaan halus antara mereka, yaitu:
Analogi:
Sosial Media/Jaringan Analogi:
SISANYA adalah sangat tinggi tingkat konsep. Pada kenyataannya, itu doesn't bahkan menyebutkan HTTP sama sekali!
Jika anda memiliki keraguan tentang bagaimana untuk melaksanakan ISTIRAHAT di HTTP, anda selalu dapat melihat di [Atom Publikasi Protocol (AtomPub)][1] spesifikasi. AtomPub adalah standar untuk menulis RESTful web services dengan HTTP yang dikembangkan oleh banyak HTTP dan SISANYA tokoh-tokoh, dengan beberapa masukan dari Roy Fielding, penemu dan SISANYA (co-)penemu HTTP dirinya sendiri.
Pada kenyataannya, anda bahkan mungkin dapat menggunakan AtomPub ini diatas. Sementara itu datang dari komunitas blogging, hal ini tidak dibatasi untuk blogging: adalah protokol yang generik untuk RESTfully berinteraksi dengan sewenang-wenang (nested) koleksi sewenang-wenang sumber daya melalui HTTP. Jika anda dapat mewakili aplikasi anda sebagai bersarang koleksi sumber daya, maka anda hanya dapat menggunakan AtomPub dan tidak khawatir tentang apakah akan menggunakan MASUKAN atau POSTING, apa Kode Status HTTP untuk kembali dan semua detail tersebut.
Ini adalah apa yang AtomPub telah mengatakan tentang sumber daya kreasi (bagian 9.2):
Untuk menambahkan anggota ke Koleksi, klien mengirimkan permintaan POST ke URI Koleksi.
Keputusan apakah akan menggunakan MASUKAN atau POSTING untuk membuat sumber daya pada server dengan HTTP + REST API didasarkan pada siapa yang memiliki struktur URL. Memiliki klien tahu, atau berpartisipasi dalam mendefinisikan, URL struct adalah aplikasi yang tidak perlu kopling mirip dengan kopling yang tidak diinginkan yang muncul dari SOA. Melarikan diri jenis kopling adalah alasan SISANYA adalah begitu populer. Oleh karena itu, metode yang tepat untuk digunakan adalah POS. Ada pengecualian untuk aturan ini dan mereka terjadi ketika klien ingin mempertahankan kontrol atas struktur lokasi dari sumber daya itu menyebarkan. Ini jarang terjadi dan mungkin berarti sesuatu yang lain adalah salah. Pada titik ini, beberapa orang akan berpendapat bahwa jika Tenang-URL's digunakan, klien tidak tahu URL dari sumber daya dan karena itu MENEMPATKAN diterima. Setelah semua, ini adalah mengapa kanonik, normal, Ruby on Rails, Django Url penting, melihat API Twitter ... bla bla bla. Orang-orang perlu memahami ada tidak ada hal seperti Tenang-URL dan Roy Fielding dirinya menyatakan bahwa:
A REST API tidak harus mendefinisikan tetap nama sumber daya atau hierarki (yang jelas coupling dari client dan server). Server harus memiliki kebebasan untuk mengontrol mereka sendiri namespace. Sebaliknya, memungkinkan server untuk menginstruksikan klien tentang bagaimana membangun sesuai Uri, seperti yang dilakukan di HTML bentuk dan URI template, dengan mendefinisikan instruksi tersebut dalam media jenis dan link hubungan. [Kegagalan di sini menyiratkan bahwa klien dengan asumsi struktur sumber daya karena out-of band informasi, seperti domain-standar tertentu, yang merupakan data yang berorientasi setara dengan RPC's fungsional kopling].
http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven Ide Tenang-URL sebenarnya adalah sebuah pelanggaran dari SISA sebagai server yang bertanggung jawab dari struktur URL dan harus bebas untuk memutuskan bagaimana menggunakan hal itu untuk menghindari kopling. Jika ini membingungkan anda baca tentang pentingnya penemuan diri pada desain API. Menggunakan POST untuk menciptakan sumber daya hadir dengan desain pertimbangan karena POSTING ini tidak idempotent. Ini berarti bahwa mengulangi POSTING beberapa kali tidak menjamin perilaku yang sama setiap waktu. Ini orang takut ke dengan menggunakan MASUKAN untuk menciptakan sumber daya ketika mereka tidak seharusnya. Mereka tahu itu's salah (POST adalah untuk MENCIPTAKAN) tapi mereka tetap melakukannya karena mereka don't tahu bagaimana untuk memecahkan masalah ini. Kekhawatiran ini ditunjukkan dalam situasi berikut:
- Klien POST sumber daya baru ke server.
- Server memproses permintaan tersebut dan mengirimkan respon.
- Klien tidak pernah menerima respon.
- Server tidak menyadari klien tidak menerima respon.
- Klien tidak memiliki URL untuk sumber daya (oleh karena itu MENEMPATKAN bukan pilihan) dan mengulangi POS.
- POSTING ini tidak idempotent dan server ... Langkah 6 adalah di mana orang-orang sering bingung tentang apa yang harus dilakukan. Namun, tidak ada alasan untuk membuat kludge untuk memecahkan masalah ini. Sebaliknya, HTTP dapat digunakan seperti yang ditentukan dalam RFC 2616 dan server balasan: 10.4.10 409 Konflik
permintaan tidak dapat diselesaikan karena konflik dengan arus negara dari sumber daya. Kode ini hanya diperbolehkan dalam situasi di mana diharapkan bahwa pengguna mungkin akan mampu menyelesaikan konflik dan kembali permintaan. Respon tubuh HARUS mencakup cukup
informasi bagi pengguna untuk mengenali sumber-sumber konflik. Pilihan, respon entitas akan mencakup informasi yang cukup untuk pengguna atau user agent untuk memperbaiki masalah; namun, itu tidak mungkin mungkin dan tidak diperlukan.
Konflik yang paling mungkin terjadi dalam respon untuk permintaan PUT. Untuk contoh, jika versi yang sedang digunakan dan entitas yang DIMASUKKAN termasuk perubahan pada sumber daya yang konflik dengan orang-orang yang dibuat oleh sebelumnya (pihak ketiga) permintaan, server mungkin menggunakan 409 respon untuk menunjukkan bahwa hal itu tidak dapat menyelesaikan permintaan. Dalam hal ini, respon entitas akan mungkin berisi daftar perbedaan antara dua versi dalam format yang ditentukan oleh respon Content-Type. Membalas dengan kode status 409 Konflik adalah jalan yang benar karena:
- Melakukan POSTING dari data yang memiliki ID yang sesuai dengan sumber daya yang sudah ada dalam sistem adalah "suatu konflik dengan keadaan saat ini sumber daya."
- Sejak bagian yang penting adalah bagi klien untuk memahami server memiliki resource dan untuk mengambil tindakan yang tepat. Ini adalah "situasi(s) di mana hal ini diharapkan bahwa pengguna akan dapat untuk menyelesaikan konflik dan kembali permintaan."
- Respon yang berisi URL dari sumber daya yang saling bertentangan ID dan sesuai prasyarat untuk sumber daya yang akan memberikan "informasi yang cukup bagi pengguna atau user agent untuk memperbaiki masalah" yang merupakan kasus yang ideal sesuai dengan RFC 2616. Update berdasarkan rilis dari RFC 7231 untuk Menggantikan 2616 RFC 7231 ini dirancang untuk menggantikan 2616 dan di Bagian 4.3.3 menjelaskan ikuti mungkin respon untuk POSTING Jika hasil pengolahan POS akan setara dengan representasi dari sebuah sumber daya yang ada, asal server DAPAT mengarahkan agen pengguna ke sumber daya dengan mengirimkan 303 (Lihat Lainnya) respon dengan sumber daya yang ada's identifier dalam bidang Lokasi. Ini memiliki manfaat yang menyediakan user agent sumber daya pengenal dan mentransfer representasi melalui metode lebih setuju untuk berbagi cache, meskipun pada biaya tambahan jika permintaan pengguna agen sudah tidak memiliki representasi di-cache. Sekarang mungkin tergoda untuk hanya kembali 303 dalam acara yang POSTING berulang-ulang. Namun, sebaliknya adalah benar. Kembali 303 hanya akan masuk akal jika banyak yang membuat permintaan (menciptakan sumber daya yang berbeda) kembali konten yang sama. Sebuah contoh akan menjadi "terima kasih untuk mengirimkan permintaan anda pesan" bahwa klien tidak perlu men-download ulang setiap waktu. RFC 7231 masih mempertahankan di bagian 4.2.2 yang POSTING tidak akan idempotent dan terus menjaga POS yang harus digunakan untuk membuat. Untuk informasi lebih lanjut tentang hal ini, baca ini artikel.
Saya suka saran ini, dari RFC 2616's definisi MENEMPATKAN:
perbedaan mendasar antara POS dan MENEMPATKAN permintaan yang tercermin dalam makna berbeda dari Request-URI. URI di POSTING permintaan mengidentifikasi sumber daya yang akan menangani tertutup badan. Sumber daya yang mungkin data-menerima proses, pintu gerbang ke beberapa protokol lain, atau entitas yang terpisah yang menerima penjelasan. Sebaliknya, URI dalam MENEMPATKAN permintaan mengidentifikasi entitas tertutup dengan meminta-agen pengguna tahu apa yang URI dimaksudkan dan server TIDAK HARUS mencoba untuk menerapkan permintaan untuk beberapa sumber daya lainnya.
Ini jibes dengan saran lainnya di sini, yang MENEMPATKAN yang terbaik diterapkan untuk sumber daya yang sudah memiliki nama, dan POSTING yang baik untuk menciptakan objek baru berdasarkan sumber daya yang ada (dan membiarkan nama server itu).
Saya menafsirkan ini, dan idempotency persyaratan DIMASUKKAN, berarti bahwa:
Singkatnya:
PUT adalah idempotent, di mana sumber daya negara akan sama jika operasi yang sama dilakukan satu kali atau beberapa kali.
POST non-idempotent, di mana sumber daya negara dapat menjadi berbeda jika operasi dilakukan beberapa kali dibandingkan dengan mengeksekusi satu waktu.
PUT yang dapat Anda pikirkan yang mirip dengan "UPDATE SISWA SET alamat = "abc" di mana id="123";
POST Anda dapat memikirkan sesuatu seperti "INSERT INTO MAHASISWA(nama, alamat) VALUES ("abc", "xyzzz");
Id mahasiswa adalah auto generated.
Dengan MENEMPATKAN, jika query yang sama dilakukan beberapa kali atau satu kali, SISWA tabel keadaan tetap sama.
Dalam kasus POST, jika query yang sama dijalankan beberapa kali kemudian beberapa catatan Siswa bisa dibuat dalam database dan database perubahan negara pada setiap pelaksanaan "INSERT" query.
CATATAN: MENEMPATKAN kebutuhan sumber daya lokasi (sudah-sumber daya) yang update harus terjadi, sedangkan POST doesn't membutuhkan itu. Oleh karena itu secara intuitif POSTING ini dimaksudkan untuk penciptaan sumber daya baru, sedangkan MASUKAN yang diperlukan untuk memperbarui yang sudah ada sumber daya.
Beberapa mungkin datang dengan update dapat dilakukan dengan POSTING. Ada tidak ada aturan keras yang digunakan untuk update atau mana yang akan digunakan untuk membuat. Sekali lagi ini adalah kesepakatan, dan secara intuitif saya'm cenderung dengan yang disebutkan di atas penalaran dan mengikutinya.
POSTING seperti posting surat ke kotak surat atau mengirimkan email ke email antrian. DIMASUKKAN adalah seperti ketika anda menempatkan objek dalam lubang cubby atau tempat pada rak (memiliki alamat yang diketahui).
Dengan POSTING ini, anda're-posting ke alamat ANTRIAN atau KOLEKSI. Dengan MENEMPATKAN, anda're menempatkan ke alamat ITEM.
PUT idempotent. Anda dapat mengirim permintaan 100 kali dan itu tidak akan peduli. POSTING ini tidak idempotent. Jika anda mengirim permintaan 100 kali, anda'll mendapatkan 100 email atau 100 surat di kotak pos.
Aturan umum: jika anda mengetahui id atau nama item, menggunakan MASUKAN. Jika anda ingin id atau nama item yang akan diberikan oleh pihak penerima, gunakan POST.
Jawaban baru (sekarang aku mengerti BERISTIRAHAT lebih baik):
MENEMPATKAN hanyalah sebuah pernyataan dari apa isi layanan harus, mulai sekarang, gunakan untuk membuat representasi sumber daya yang diidentifikasi oleh klien; POSTING adalah pernyataan tentang apa isi layanan harus, mulai sekarang, mengandung (mungkin diduplikasi) tapi itu's up ke server cara untuk mengidentifikasi konten tersebut.
MENEMPATKAN x
(jika x
mengidentifikasi sumber): "Ganti isi dari sumber daya diidentifikasi oleh x
dengan konten saya."
MENEMPATKAN x
(jika x
tidak mengidentifikasi sumber daya): "Menciptakan sumber daya baru yang berisi konten dan penggunaan x
untuk mengidentifikasi itu."
POST x
: "Toko konten saya dan memberikan saya sebuah identifier yang bisa saya gunakan untuk mengidentifikasi sumber daya (lama atau baru) yang mengandung kata isi (mungkin dicampur dengan konten lainnya). Kata sumber daya harus identik atau bawahan yang x
mengidentifikasi.", "y's sumber daya bawahan x's sumber daya" biasanya tetapi tidak selalu dilaksanakan dengan membuat y yang subpath dari x (misalnya x = /foo
dan y = /foo/bar
) dan memodifikasi representasi(s) dari x's sumber daya untuk mencerminkan adanya sumber daya baru, misalnya dengan hyperlink ke y's sumber daya dan beberapa metadata. Hanya yang terakhir ini benar-benar penting untuk desain yang baik, sebagai Url yang buram di SISA-anda're seharusnya menggunakan hypermedia sebaliknya dari sisi klien URL konstruksi untuk melintasi layanan lagian.
Di saat ISTIRAHAT, ada's ada hal seperti itu sebagai sumber daya yang mengandung "content". Saya sebut sebagai "content" untuk data yang menggunakan layanan untuk membuat pernyataan secara konsisten. Hal ini biasanya terdiri dari beberapa baris yang terkait dalam database atau file (misalnya file gambar). It's up ke layanan untuk mengkonversi pengguna's konten menjadi sesuatu layanan yang dapat digunakan, misalnya mengubah JSON muatan ke pernyataan SQL.
Jawaban asli (mungkin lebih mudah untuk membaca):
PUT /sesuatu
(jika sesuatu
sudah ada): "Mengambil apa pun yang anda miliki di sesuatu
dan menggantinya dengan apa yang saya berikan anda."
PUT /sesuatu
(jika sesuatu
sudah tidak ada): "Mengambil apa yang saya berikan anda dan meletakkannya di sesuatu
."
POST /sesuatu
: "Mengambil apa yang saya berikan anda dan meletakkannya di mana saja anda inginkan di bawah /sesuatu
selama anda berikan URL-nya bila anda're dilakukan."
Jawaban Singkat:
Sederhana aturan: Menggunakan POST untuk membuat, menggunakan, MENEMPATKAN untuk update.
Jawaban Panjang:
POSTING:
MASUKAN:
Lagi Menjawab:
Untuk memahaminya kita perlu mempertanyakan mengapa MENEMPATKAN itu diperlukan, apa yang menjadi masalah MENEMPATKAN mencoba untuk memecahkan POSTING yang tidak't.
Dari SISA arsitektur's point of view ini tidak ada yang penting. Kita bisa hidup tanpa DIMASUKKAN juga. Tapi dari client pengembang's point of view itu membuat hidupnya jauh lebih sederhana.
Sebelum DIMASUKKAN, klien tidak't langsung tahu URL yang server dihasilkan atau jika semua itu telah menghasilkan apapun atau apakah data akan dikirim ke server yang telah diperbarui atau tidak. MENEMPATKAN lega pengembang dari sakit kepala ini. PUT idempotent, MENEMPATKAN menangani kondisi ras, dan MENEMPATKAN memungkinkan klien memilih URL.
Ruby on Rails 4.0 akan menggunakan 'PATCH' metode bukannya MENEMPATKAN untuk melakukan partial update.
RFC 5789 kata tentang PATCH (sejak tahun 1995):
metode baru ini diperlukan untuk meningkatkan interoperabilitas dan mencegah kesalahan-kesalahan. MENEMPATKAN metode yang sudah didefinisikan untuk menimpa sumber daya dengan tubuh yang baru, dan tidak dapat digunakan kembali untuk melakukan perubahan parsial. Jika tidak, proxy dan cache, dan bahkan klien dan server, semoga bisa bingung dengan hasil operasi. POSTING ini sudah digunakan tapi tanpa fasilitas interoperabilitas (untuk satu, tidak ada cara standar untuk temukan patch mendukung format). PATCH telah disebutkan sebelumnya di HTTP spesifikasi, tetapi tidak benar-benar didefinisikan.
"Tepi Rel: PATCH primer baru HTTP metode untuk updates" menjelaskan hal itu.
Pada risiko ulangan apa yang telah dikatakan, tampaknya penting untuk diingat bahwa PUT menyiratkan bahwa klien mengontrol apa URL akan berakhir menjadi, ketika menciptakan sumber daya. Jadi bagian dari pilihan antara PUT dan POST adalah tentang berapa banyak yang dapat anda percaya klien untuk memberikan yang benar, normalized URL yang koheren dengan apa yang anda URL skema ini.
Ketika anda dapat't sepenuhnya percaya klien untuk melakukan hal yang benar, itu akan menjadi lebih tepat untuk menggunakan POST untuk membuat item baru dan kemudian mengirim URL kembali ke klien di respon.
Dalam cara yang sangat sederhana I'm mengambil contoh dari Facebook timeline.
Kasus 1: Ketika anda mengirim sesuatu di kronologi anda, it's baru yang segar masuk. Jadi dalam hal ini mereka menggunakan metode POST karena metode POST adalah non-idempotent.
Kasus 2: Jika teman anda memberikan komentar pada posting anda pertama kalinya, itu juga akan membuat entri baru di database sehingga metode POST digunakan.
Kasus 3: Jika teman anda mengedit komentar, dalam kasus ini, mereka memiliki komentar id, sehingga mereka akan memperbarui komentar yang ada, bukan membuat yang baru masuk di database. Oleh karena itu untuk jenis operasi ini menggunakan metode MENEMPATKAN karena itu idempotent.*
Dalam satu baris, gunakan POST untuk menambahkan entri baru dalam database dan PUT untuk update sesuatu di database.
Pertimbangan yang paling penting adalah keandalan. Jika POSTING pesan akan hilang keadaan sistem yang tidak terdefinisi. Pemulihan otomatis adalah mustahil. Untuk MENEMPATKAN pesan, negara tidak terdefinisi hanya sampai sukses pertama coba lagi.
Misalnya, ini mungkin bukan ide yang baik untuk membuat transaksi kartu kredit dengan POSTING.
Jika anda kebetulan memiliki auto generated URI's pada sumber daya anda, anda masih dapat menggunakan MASUKAN dengan melewati dihasilkan URI (menunjuk ke tempat kosong sumber daya) untuk klien.
Beberapa pertimbangan lain:
Selain perbedaan yang disarankan oleh orang lain, saya ingin menambahkan satu lagi.
Di *POST metode* anda dapat mengirim tubuh params di form-data
Di PUT metode yang anda harus mengirim tubuh params di x-www-form-urlencoded
Header Content-Type:application/x-www-form-urlencoded
Menurut ini, anda tidak dapat mengirim file atau multipart data di PUT metode
EDIT
jenis konten "application/x-www-form-urlencoded" adalah tidak efisien untuk mengirimkan sejumlah besar data biner atau teks yang mengandung karakter non-ASCII. Jenis konten "multipart/form-data" harus digunakan untuk mengirimkan formulir yang berisi file-file non-ASCII data, dan binary data.
Yang berarti jika anda harus mengirimkan
file non-ASCII data, dan data biner
anda harus menggunakan POST metode