Hangi HTTP yöntemleri hangi CRUD yöntemleriyle eşleşir?


213

RESTful stil programlamasında, yapı taşlarımız olarak HTTP yöntemlerini kullanmalıyız. Biraz kafam karıştı ama hangi yöntemler klasik CRUD yöntemlerine uyuyor. GET / Oku ve DELETE / Sil yeterince açıktır.

Ancak PUT / POST arasındaki fark nedir? Oluştur ve Güncelle ile birebir eşleşiyorlar mı?

Yanıtlar:


298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT, PUT ile kullanılan URI'nin varlığına bağlı olarak hem Oluştur hem de Güncelle ile eşleşebilir.

POST eşlemeleri oluşturun.

Düzeltme: POST, genellikle Oluşturma için kullanılmasına rağmen Güncelleme ile de eşleştirilebilir. POST ayrıca kısmi bir güncelleme olabilir, bu nedenle önerilen PATCH yöntemine ihtiyacımız yoktur.


16
+1: Adları (URI'leri) istemci tarafından atanan kaynakları oluşturmak için PUT ile adları sunucu tarafından atanan kaynakları oluşturmak için POST arasında yaptığınız ayrım önemlidir. Bununla ilgili bir tartışma için Richardson ve Ruby'nin Restful Web Services (O'Reilly) bölümüne bakınız.
Jim Ferrans

9
PUT ve DELETE henüz web tarayıcıları tarafından desteklenmediği için, POST olarak gönderilen URI'ye method = PUT veya method = DELETE gibi bir sorgu dizesi argümanı ekleyerek "POST'a aşırı yük" yapmanın uygun olduğu düşünülür.
Jim Ferrans


13
@JimFerrans PUT ve DELETE, XHR ile web tarayıcıları tarafından desteklenmektedir. Bununla birlikte, HTML formları bağlamında, HTML belirtimi bunları desteklemez, bu nedenle tarayıcılar da yapamaz.
eis

3
Canonically CRUD bir mektuba eşleme olmasa da, DİNLENME çerçeveler bir sürü ayrıca / GET / varlık kullanmak Liste tipi kuruluşlar varlık . GET / varlık / id, kimlikle eşleşen belirli varlığı okur .
Toddius Zho

49

Tüm anahtar, cesaretsiz bir değişiklik yapıp yapmadığınızdır. Yani, mesaj üzerinde iki kez harekete geçilmesi, yalnızca bir kez yapıldığı gibi “aynı” şeyin ortaya çıkmasına neden olacaksa, idempotent bir değişikliğe sahipsiniz ve PUT ile eşlenmelidir. Değilse, POST ile eşleşir. İstemcinin URL'leri sentezlemesine asla izin vermezseniz, PUT, Güncellemeye oldukça yakındır ve POST, İyi oluştur'u işleyebilir, ancak kesinlikle bunu yapmanın tek yolu bu değildir; müşteri /foo/abchangi içeriği oluşturmak istediğini biliyorsa ve oraya hangi içeriği koyacağını biliyorsa, bir PUT olarak iyi çalışır.

Bir POST'un kanonik açıklaması, bir şey satın almayı taahhüt ettiğiniz zamandır: bu, kimsenin bilmeden tekrarlamak istemediği bir eylemdir. Buna karşılık, sipariş için gönderim adresinin önceden ayarlanması PUT ile yapılabilir: bir 6 Anywhere Dr, Nowherevillekez, iki kez veya yüz kez göndermeniz sizin için önemli değil : yine de aynı adres. Bu onun bir güncelleme olduğu anlamına mı geliyor? Olabilir… Her şey arka ucu nasıl yazmak istediğinize bağlıdır. (Sonuçların aynı olmayabileceğini unutmayın: kaynağın temsilinin bir parçası olarak en son bir PUT yaptıkları zaman kullanıcıya tekrar bildirebilirsiniz; bu, tekrarlanan PUT'ların aynı sonuca neden olmamasını sağlar, ancak sonuç yine de işlevsel anlamda “aynı” olun.)


1
Kullanım senaryoları arasındaki POSTve PUTbu ilginç durumlar arasındaki ayrım , "hangisi" oluştur "hangisi" güncelleme "? çok daha net. Ayrıca, API'nin uygulanması ile ilgili olarak, bir tekrarlamanın PUTsessiz bir işlem yapılmaması anlamına geleceğini , ancak POSTgönderilen verilerin bazı yönlerinin veri deposunda benzersiz kalması gerekiyorsa bir tekrarlayıcı bir istisna fırlatabilir. uygulamayı destekliyor.
zerobandwidth

2
Bu cevap ve sonraki yorum önemli bir noktaya değinmektedir, CRUD'un HTTP REST anlambilimi ile yakından (1'e 1) eşitlenmesinde dikkatli olunmalıdır . Bu kanonik bir harita değil.
Martin Spamer

35

Aynı cevabı arıyordum, işte IBM'in söyledikleri. IBM Bağlantısı

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.

10

Şu anda (2016) en son HTTP fiilleri GET, POST, PATCH , PUT ve DELETE

genel bakış

  • HTTP GET - SEÇ / İstek
  • HTTP PUT - GÜNCELLEME
  • HTTP POST - INSERT / Oluştur
  • HTTP PATCH - PUT ting tam bir kaynak temsili kullanışsız ve daha fazla bant genişliği kullandığında, örneğin: bir sütunu kısmen güncellemeniz gerektiğinde
  • HTTP SİL - SİL

Bu yardımcı olur umarım!

REST API'leri tasarlamakla ilgileniyorsanız, bu alışılmış bir okumadır! web sitesi çevrimiçi sürümü github deposu


1
18 Şubat'tan itibaren PATCH'in istemci ve sunucu kitaplıklarında tam olarak uygulanmadığını unutmayın.
Dizzley

oh tamam teşekkürler ben görüyorum ... bir göz atabilirsiniz böylece bir bağlantı / referans göndermek ister misiniz lütfen?
d1jhoni1b

9

Stormpath tarafından gerçekten bunu açıklayan harika bir youtube video konuşması var, URL videonun doğru kısmına atlamalıdır:

fırtına youtube video

Ayrıca bir saatten fazla konuşmanın bir REST api inşasına zaman ayırmayı düşünüyorsanız çok intersting.


7

Somut duruma bağlıdır .. ancak genel olarak:

PUT = somut bir kaynağı, kaynağın somut bir URI'siyle güncelleyin veya değiştirin.

POST = verilen URI'nin kaynağı altında yeni bir kaynak oluştur .

yani

Blog gönderisini düzenleme:

PUT: / blog / giriş / 1

Yeni bir tane oluşturun:

POST: / blog / giriş

PUT, yeni kaynağın URI'sinin istekten önce açık olduğu bazı durumlarda yeni bir kaynak oluşturabilir. POST, başkaları tarafından kapsanmayan diğer birkaç kullanım durumunu da uygulamak için kullanılabilir (GET, PUT, DELETE, HEAD, OPTIONS)

CRUD sistemleri için genel anlayış GET = request, POST = create, Put = update, DELETE = delete


4

REST'in yapı taşları esas olarak kaynaklar (ve URI) ve hiper ortamdır. Bu bağlamda, GETkaynağın (gerçekten bir SELECTCRUD terimiyle eşleştirilebilen) bir temsilini almanın yoludur .

Ancak, CRUD işlemleri ile HTTP fiilleri arasında bire bir eşleme beklemeniz gerekmez. Arasındaki temel fark PUTve POSTonların İdempotent özelliği ile ilgili. genellikle kaynağın tamamen yeni bir temsilini göndermeyi gerektirdiğinden POSTkısmi güncellemeler için daha yaygın olarak kullanılır PUT.

Bunu okumanızı öneririm:

HTTP özellikleri da yararlı bir referans:

PUT yöntemi, ekteki varlığın sağlanan Request-URI altında saklanmasını ister.

[...]

POST ve PUT istekleri arasındaki temel fark, İstek-URI'sinin farklı anlamına yansır. Bir POST isteğindeki URI, ekteki varlığı işleyecek kaynağı tanımlar. Bu kaynak veri kabul eden bir süreç, başka bir protokole açılan bir geçit veya ek açıklamaları kabul eden ayrı bir varlık olabilir. Buna karşılık, bir PUT isteğindeki URI, istekle birlikte gelen varlığı tanımlar - kullanıcı aracısı, URI'nin ne olduğunu bilir ve sunucunun, isteği başka bir kaynağa uygulamaması GEREKİR. Sunucu, isteğin farklı bir URI'ye uygulanmasını istiyorsa,


3

Genel olarak, kullandığım kalıp budur:

  • HTTP GET - SEÇ / İstek
  • HTTP PUT - GÜNCELLEME
  • HTTP POST - INSERT / Oluştur
  • HTTP SİL - SİL

5
PUT ve POST, Güncelle veya Oluştur ile tam olarak eşleşmez; PUT “ayarlanmıştır” (yani, kaynak adını önceden bildiğiniz ve kullanılacak değeri verdiğiniz yer) ve POST diğer her şeydir. Anahtar, yaptığınız şeyin idempotent olup olmadığını düşünmektir .
Donal Fellows

1
Yorumda +1. İkisi arasında mutlak bir haritalama varsayımı yanıltıcı olabilir. Örneğin, bazı URI'lara yapılan HTTP SİLME işlemi, sunucu tarafı kaydını değiştirebilir (yani GÜNCELLEME), böylece bir HTTP GET işlemi artık bir gösterim döndürmez.
durun

4
PUT ve POST, Güncelle veya Oluştur ile tam olarak eşleşmez . Doğru ama AJ hangi kalıbı kullandığını anlattı .
Piotr Dobrogost

1

Symfony'nin onun HTTP yöntemlerini tutmak için proje çalışır CRUD yöntemleri ve birlikte katıldı onların liste aşağıdaki gibidir ortakları onları:

  • GET Kaynağı sunucudan al
  • POST Sunucuda kaynak oluşturma
  • PUT Sunucudaki kaynağı güncelleyin
  • SİL Kaynağı sunucudan sil

Bu sayfada söyledikleri gibi, "Gerçekte, birçok modern tarayıcının PUT ve DELETE yöntemlerini desteklemediğini" belirtmek gerekir.

Hatırladığım kadarıyla, Symfony, formları oluştururken onları desteklemeyen tarayıcılar için teorik olarak doğru HTTP yöntemini bir tarayıcı desteklemese bile kullanmaya daha yakın olmaya çalışmak için PUT ve DELETE "taklit eder" o.

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.