PUT ve DELETE HTTP istek yöntemlerinin faydası nedir?


91

Bununla ilgili çok şey okudum ama bu konu hakkında bir sonuca varamadım.

Ancak PUT veya DELETE HTTP İstek yöntemlerini hiç kullanmadım. Eğilim, sistemin durumu (uygulamam veya web sitem) etkilenmediğinde (ürün listeleme gibi) GET'i ve etkilendiğinde (sipariş verildiğinde) POST'u kullanmaktır. Yeterli değil mi yoksa bir şeyi mi kaçırıyorum?


2
PUT / DELETE kodlaması daha kolaydır, ancak kurulumu daha zordur (güvenlik açısından vhost / apache dizini). Benim mütevazi fikrim ... bunlar olmadan yaşayabilirsiniz.
Najzero

5
@Najzero evet onlarsız çok mutluyum :) ama neden orada olduklarına dair bazı cevaplara ihtiyacım var ?? bazı şeyler okudu ama başaramadı
Rupesh Patel

Yanıtlar:


89

DELETE, istek kaynağını silmek içindir:

DELETE yöntemi, kaynak sunucunun Request-URI tarafından tanımlanan kaynağı silmesini ister. Bu yöntem, kaynak sunucuda insan müdahalesi (veya başka yollarla) ile geçersiz kılınabilir. Kaynak sunucudan döndürülen durum kodu eylemin başarıyla tamamlandığını gösterse bile, istemciye işlemin gerçekleştirildiği garanti edilemez ...

PUT, sunucuya bir kaynak koymak veya güncellemek içindir:

PUT yöntemi, kapalı varlığın sağlanan İstek URI'si altında saklanmasını ister. İstek-URI'si halihazırda var olan bir kaynağa atıfta bulunuyorsa, ekteki varlık, kaynak sunucuda bulunanın değiştirilmiş bir sürümü olarak kabul edilmelidir. İstek-URI mevcut bir kaynağı göstermiyorsa ve bu URI, talep eden kullanıcı aracısı tarafından yeni bir kaynak olarak tanımlanabiliyorsa, kaynak sunucu kaynağı bu URI ile oluşturabilir ...

Tüm teknik özellik ziyareti için:

Mevcut tarayıcılar maalesef HTML biçimlerinde POST ve GET dışında başka fiilleri desteklemediğinden , genellikle onlarla HTTP'yi tam olarak kullanamazsınız (yine de bunların gönderimini JavaScript aracılığıyla ele geçirebilirsiniz). HTML biçimlerinde bu yöntemlerin desteklenmemesi, örneğin fiiller içeren URI'lara yol açtı.

POST http://example.com/order/1/delete

veya daha da kötüsü

POST http://example.com/deleteOrder/id/1

HTTP üzerinden CRUD semantiğini etkin bir şekilde tünelleme Ancak fiiller hiçbir zaman URI'nin bir parçası olmamıştır. Bunun yerine HTTP, HTTP yöntemleri aracılığıyla bir Kaynağı CRUD (örneğin bir sipariş) için mekanizma ve anlambilim sağlar. HTTP bir protokoldür ve sadece bazı veri tünelleme hizmetleri değildir.

Web sunucusundaki bir Kaynağı silmek için,

DELETE http://example.com/order/1

ve güncellemek için arayacaksın

PUT http://example.com/order/1

ve web sunucusunun daha sonra uygulayabilmesi için PUT gövdesinde güncellenmiş Kaynak Temsili'ni sağlayın.

Bu nedenle, bir REST API için bir tür istemci oluşturuyorsanız , büyük olasılıkla PUT ve DELETE istekleri göndermesini sağlayacaksınız. Bu, bir tarayıcının içinde oluşturulmuş bir istemci olabilir, örneğin JavaScript yoluyla istek göndermek veya bir sunucuda çalışan bir araç olabilir, vb.

Daha fazla ayrıntı için şu adresi ziyaret edin:


7
Tarayıcılar edebilir PUT göndermek ve JavaScript ile SİL!
Joe

5
@Joe Evet, ancak HTML form yöntemleri yapmaz. Ve kutunun dışında desteklenmediği sürece, çalışması için çemberlerden geçmeniz gerekir. Tarayıcı satıcılarının en büyük başarısızlıklarından biridir.
Gordon

3
Elbette yok, formlar POST ve GET için tasarlandı. Bu tasarım HTML'sindedir. Yine de PUT ve DELETE'in desteklenmediğini söylemek doğru değildir. Tarayıcılar HTML ve HTTP'yi uygular.
Joe

@Joe o zaman muhtemelen aynı "destek" tanımına sahip değiliz. Tarayıcıların çoğu JavaScript'i destekler ve evet, JavaScript HTTP istekleri yapabilir, ancak yine de bunu programlamalıyım , kodu bazı UI öğelerine bağlamalı ve önce istemciye teslim etmeliyim.
Gordon

4
Tarayıcı, HTML yazmadığınız sürece boş bir sayfa görüntüler. Evet, belki de aynı fikirde değiliz. Kabul etmemek sorun değil!
Joe

26

GET, POST, DELETE, PUT vb. Gibi HTTP İstek fiillerini kullanmak, RESTful web uygulamaları oluşturmanıza olanak sağlar. Burada okuyun: http://en.wikipedia.org/wiki/Representational_state_transfer

Bundan fayda görmenin en kolay yolu bu örneğe bakmaktır. Her MVC çerçevesinin, Router/DispatcherURL'leri actionControllers ile eşleyen bir özelliği vardır. Bu yüzden URL /blog/article/1şöyle : blogController::articleAction($id); Şimdi çağırırdı Bu Yönlendirici sadece URL'nin farkındadır veya/blog/article/1/

Ancak bu Yönlendirici yalnızca URL yerine tüm HTTP İsteği nesnesinin farkında olacaksa, HTTP İstek fiiline (GET, POST, PUT, DELETE ...) ve mevcut HTTP İsteği ile ilgili diğer birçok yararlı şeye erişebilir.

Bu, uygulamayı aynı URL'yi kabul edecek ve HTTP İstek fiiline bağlı olarak farklı actionControllers ile eşleyebilecek şekilde yapılandırmanıza olanak tanır.

Örneğin:

1. makaleyi geri almak istiyorsanız, bunu yapabilirsiniz:

GET /blog/article/1 HTTP/1.1

ancak 1. makaleyi silmek isterseniz şunu yapacaksınız:

DELETE /blog/article/1 HTTP/1.1

Her iki HTTP İsteğinin de aynı URI'ye sahip olduğuna dikkat edin, / blog / article / 1, tek fark HTTP İsteği fiilidir. Ve bu fiile bağlı olarak yönlendiriciniz farklı actionController'ı çağırabilir. Bu, düzgün URL'ler oluşturmanıza olanak sağlar.

Bu iki makaleyi okuyun, size yardımcı olabilirler:

Symfony 2 - HTTP Temelleri

Symfony 2 - Yönlendirme

Bu makaleler Symfony 2 çerçevesi hakkındadır, ancak HTTP İsteklerinin ve Yanıtlarının nasıl çalıştığını anlamanıza yardımcı olabilirler.

Bu yardımcı olur umarım!


6
arkadaşları olmasam da güzelce açıkladı +1 ;-)
olmasam da

1
Bu cevap, HTTP fiillerinin önemini açıklamayı ve gerçekten RESTful hizmetleri ve faydaları ile uyumlu olmayı en iyi şekilde açıklar. HTTP DELETE kullanmıyorsanız, bir denetleyicide (2) POST eyleminiz olabilir: 1 for Createve 1 for Delete. Bunu yaparsanız, bir sonraki aramanız " Tek bir denetleyicide birden çok Gönderme eylemine sahip olma " olacaktır: P. Bu çok kötü değil, ancak eylem adını URI'de açıkça belirtmek zorunda kalmanın aksine, fiil eylemi aracılığıyla benzersiz bir kaynağa sahip olma yeteneğini kaybedersiniz.
atconway

4

Popüler olmama riskini alsam da günümüzde işe yaramadığını söylüyorum .

Geçmişte, örneğin DELETE sunucuya sağlanan URL'de bulunan kaynağı silmesini ve PUT (kardeş PATCH ile birlikte) sunucuya idempotent bir şekilde güncelleme yapmasını söylediğinde bunların iyi tasarlanmış ve yararlı olduğunu düşünüyorum.

Şeyler gelişti ve URL'ler sanal hale geldi ( örneğin, url yeniden yazımına bakın ) kaynakların gerçek klasör / alt taşıyıcı / dosya ilk anlamını kaybetmesine neden olur ve bu nedenle, HTTP protokol yöntemleri (GET, POST, PUT / PATCH, DELETE) tarafından kapsanan CRUD eylem fiilleri .

Bir örnek alalım:

  • / api / entity / list / {id} ve GET / api / varlık / {id} karşılaştırması
  • / api / entity / add / {id} - POST / api / varlık
  • / api / varlık / düzenleme / {id} ile PUT / api / varlık / {id} karşılaştırması
  • / api / varlık / sil / {id} vs DELETE / api / varlık / {id} karşılaştırması

Sol tarafa HTTP yöntemi yazılmamış, aslında önemli değil (POST ve GET yeterli) ve sağ tarafta uygun HTTP yöntemleri kullanılıyor.

Sağ taraf zarif, temiz ve profesyonel görünüyor. Şimdi, zarif API'yi kullanan bir kod bulundurmanız gerektiğini ve silme çağrısının nerede yapıldığını aramanız gerektiğini hayal edin. Arayacaksın"Api / entity" yi ve sonuçlar arasında hangisinin DELETE yaptığını görmeniz gerekecek. Ya da daha da kötüsü, yanlışlıkla PUT'u DELETE ile değiştiren ve URL olarak aynı bok olduğu için genç bir programcınız var.

Bana göre eylem fiilini URL'ye koymak, çok zarif olmasa bile o eylem için uygun HTTP yöntemini kullanmaya göre avantajlara sahiptir. Silme çağrısının nerede yapıldığını görmek istiyorsanız, sadece "api / entity / delete" ve hemen bulacaksınız.

HTTP yöntem dizisinin tamamı olmadan bir API oluşturmak, daha sonra tüketilmesini ve korunmasını kolaylaştırır


1

Güvenli Yöntemler: Kaynak Al / Kaynak
Idempotent'te değişiklik yok : Birçok kez istenirse kaynak durumunda değişiklik yok
Güvenli
Olmayan Yöntemler: Kaynakta Kaynak Oluşturma veya Güncelleme / Değişiklik Idempotent Olmayan: Birçok kez istenirse kaynak durumunda değişiklik

İhtiyacınıza göre:

1) Güvenli ve idempotent operasyon için (Kaynak Getirme) kullanın --------- YÖNTEMİ GETİN
2) Güvenli olmayan ve idempotent olmayan operasyon için (Kaynak Ekle) kullanın --------- POST METODU
3) Güvenli olmayan ve idempotent işlem için (Kaynağı Güncelle) kullanın --------- PUT YÖNTEMİ
3) Güvensiz ve idempotent işlem için (Kaynağı Sil) --------- SİL YÖNTEMİNİ kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.