PATCH ve PUT isteği arasındaki temel fark nedir?


187

PUTRails uygulamamda bir istek kullanıyorum . Artık PATCHtarayıcılar tarafından yeni bir HTTP fiili uygulanmıştır. Bu yüzden, talepler PATCHve PUTtalepler arasındaki temel farkın ne olduğunu ve ne zaman birini veya diğerini kullanmamız gerektiğini bilmek istiyorum .

Yanıtlar:


139

HTTP fiilleri muhtemelen HTTP protokolü ile ilgili en şifreli şeylerden biridir. Varlar ve birçoğu var, ama neden varlar?

Rails, birçok fiili desteklemek ve yerel olarak web tarayıcıları tarafından desteklenmeyen bazı fiiller eklemek istiyor gibi görünüyor.

İşte http fiillerin kapsamlı bir listesi: http://annevankesteren.nl/2007/10/http-methods

Resmi RFC'den HTTP yaması var: https://datatracker.ietf.org/doc/rfc5789/?include_text=1

YAMA istek varlığı açıklanan değişikliklerin bir dizi request- URI tarafından tanımlanan kaynağın uygulanabilir bu yöntem istekleri. Değişiklikler kümesi, ortam türü tarafından tanımlanan "yama belgesi" olarak adlandırılan bir biçimde gösterilir. İstenen URI varolan bir kaynağa işaret etmezse, sunucu OLABİLİR vb (mantik olarak boş kaynak değiştirebilir olsun) yama belge türüne bağlı olarak ve izinleri, yeni bir kaynak oluşturun

PUT ve PATCH istekleri arasındaki fark , sunucunun ekteki varlığı İstek-URI tarafından tanımlanan kaynağı değiştirmek için işleme biçiminde yansıtılır. Bir PUT isteğinde, ekteki varlık kaynak sunucuda depolanan kaynağın değiştirilmiş bir sürümü olarak kabul edilir ve istemci depolanan sürümün değiştirilmesini ister. Ancak PATCH ile ekteki varlık, kaynak sunucuda bulunan bir kaynağın yeni bir sürüm üretmek için nasıl değiştirilmesi gerektiğini açıklayan bir dizi talimat içerir. YAMA yöntemi tarafından tespit kaynak etkiler Request-URI ve aynı zamanda MAYISdiğer kaynaklar üzerinde yan etkileri vardır; yani, bir PATCH uygulamasıyla yeni kaynaklar oluşturulabilir veya mevcut kaynaklar değiştirilebilir .

Bildiğim kadarıyla, PATCH fiili ray uygulamalarında olduğu gibi kullanılmıyor ... Bunu anladığım kadarıyla, RFC yama fiili, iki dosya arasında fark yaptığınız gibi yama talimatları göndermek için kullanılmalıdır. Tüm varlığı tekrar göndermek yerine, tüm varlığı yeniden göndermekten çok daha küçük bir yama gönderirsiniz.

Büyük bir dosyayı düzenlemek istediğinizi düşünün. 3 satır düzenlersiniz. Dosyayı geri göndermek yerine, farkları göndermeniz yeterlidir. Artı tarafta, dosyaları eşzamansız olarak birleştirmek için bir yama isteği göndermek kullanılabilir. Bir sürüm kontrol sistemi, kodu uzaktan güncellemek için PATCH fiilini kullanabilir.

Bir başka olası kullanım durumu, NoSQL veritabanlarıyla biraz ilişkilidir, belgeleri saklamak mümkündür. Verileri sunucudan istemciye ileri ve geri göndermek için bir JSON yapısı kullandığımızı varsayalım. Bir alanı silmek isteseydik, $ unset için mongodb'dakine benzer bir sözdizimi kullanabiliriz . Aslında, belgeleri güncellemek için mongodb'da kullanılan yöntem muhtemelen json yamalarını işlemek için kullanılabilir.

Bu örnekte:

db.products.update(
   { sku: "unknown" },
   { $unset: { quantity: "", instock: "" } }
)

Böyle bir şeyimiz olabilir:

PATCH /products?sku=unknown
{ "$unset": { "quantity": "", "instock": "" } }

Son olarak, ama en önemlisi, insanlar HTTP fiilleri hakkında istediklerini söyleyebilirler. Sadece bir gerçek var ve gerçek RFC'lerde.


1
RFC 5789'un hala teklif aşamasında olduğunu ve resmi olarak kabul edilmediğini ve şu anda 'irrata var' olarak işaretlendiğini belirtmek önemlidir. Bu 'en iyi uygulama' oldukça tartışmalıdır ve teknik olarak PATCH henüz HTTP standardının bir parçası değildir. Buradaki tek gerçek şu ki, RFC kabul edilmediğinden bunu yapmamalısınız.
fishpen0

3
Hala teklifte olsa bile, kullanılmaması gerektiği anlamına gelmez. Durum böyle olsaydı, web teklifleri ve hala teklifte olan diğer birçok rfc'yi kullanamazdık ... Teklifi uygulamak, kimsenin uygulamadığı tamamen özel bir şey uygulamaktan 100 kat daha iyi.
Loïc Faure-Lacroix

BS. "Teklifte" değildir ve HTTP standardının bir parçasıdır (standart, RFC 7231, yöntemler için bir IANA kayıt defterine delege eder ve PATCH burada listelenir).
Julian Reschke

@JulianReschke Bu RFC'nin ikinci satırını okuduysanız, hala ÖNERİLEN STANDART olarak işaretlendiğini göreceksiniz . Yani hayır, yama yöntemi hala teklifte. Rfc burada btw. tools.ietf.org/html/rfc5789 ve rfc7231 de STANDART ÖNERİLİR . Örneğin RFC821'e bakarsanız, İNTERNET STANDARDI
Loïc Faure-Lacroix

1
@JulianReschke en.wikipedia.org/wiki/Internet_Standard#Proposed_Standard ... Bu benim sözüm değil. Önerilen bir standart, yukarıda açıkladığım gibi iyi uygulayamayacağınız anlamına gelmez. Bu, uygulanacak kadar kararlı olmadığı anlamına gelmez ... ancak İnternet Standardı olarak işaretlenmedikçe hala teklifte ... Bunu nasıl tartıştığınızdan emin değilim. Buna "önerilen standart" denir, bir tekliften başka bir şey ifade edemez. Önerilen bir standardın kullanılabileceğini iddia etmek istiyorsanız. Tam olarak yazdım.
Loïc Faure-Lacroix

104

Google ile birkaç saat geçirdim ve cevabı burada buldum

PUT => Kullanıcı kaydın tümünü veya bir kısmını güncelleyebiliyorsa , PUT'u kullanın (kullanıcı güncellenenleri kontrol eder)

PUT /users/123/email
new.email@example.org

PATCH => Kullanıcı yalnızca kısmi bir kaydı güncelleyebiliyorsa , yalnızca bir e-posta adresi söyleyin (uygulama nelerin güncellenebileceğini denetler), PATCH kullanın.

PATCH /users/123
[description of changes]

Neden Patch

PUTyöntem daha fazla bant genişliğine ihtiyaç duyar veya kısmi yerine tam kaynakları kullanır. Böylece PATCHbant genişliğini azaltmak için tanıtıldı.

PATCH hakkında açıklama

PATCH güvenli olmayan veya idempotent olmayan bir yöntemdir ve diğer kaynaklar üzerinde tam ve kısmi güncellemelere ve yan etkilere izin verir.

PATCH ekli varlık, kaynak sunucuda bulunan bir kaynağın yeni bir sürüm üretmek için nasıl değiştirilmesi gerektiğini açıklayan bir dizi talimat içeren bir yöntemdir.

PATCH /users/123
[
  { "op": "replace", "path": "/email", "value": "new.email@example.org" }
]

Burada put ve patch hakkında daha fazla bilgi


7
Bu PATCH neden güvenli değil?
Bishisht Bhatta

1
PATCHarasında POST, PUTo verilerinizi değiştirir çünkü vb "güvenli" değil (yan etkileri vardır). Karşılaştırıldığında GET, OPTIONSvb (güvenli yöntemleri) herhangi bir yan etkisi olmadan bitiş noktaları birden fazla kez çağırabilirsiniz nerede.
emix

1
Sadece bant genişliğini kaydetmek için PATCH KULLANILMAMIŞTIR. RFC 5789'un belirttiği gibi:> "Birlikte çalışabilirliği artırmak ve hataları önlemek için yeni bir yöntem gereklidir." Yalnızca paralel yükün geri kalanını içeren PUT'lara sahip çok paralel bir ortamda, kaynağın diğer özniteliklerinde değişiklik yapma riskini artıracaktır. PATCH bu sorunu çözer.
Tomasz Nazar

43


adımı değiştirmek istersem koy , firstsonra Güncelle için put isteği gönder

{ "first": "Nazmul", "last": "hasan" } 

ama burada bir sorun var putistek göndermek istediğim zaman puttüm iki parametre göndermek zorunda firstve last
böylece tüm değeri tekrar göndermek için zorunlu olduğunu isteği var

yama :
patchistek söylüyor. yalnızca datahangisini istediğinizi gönderin update, diğer verileri etkilemez veya değiştirmez.
böylece tüm değeri tekrar göndermenize gerek yok. sadece ilk adımı güncellemek istiyorum, bu yüzden güncellemek için sadece firstad göndermeliyim .


13

İşte bir HTTP protokolünün POST, PUT ve PATCH yöntemleri arasındaki fark.

İLETİ

Bir HTTP.POST yöntemi sunucuda her zaman yeni bir kaynak oluşturur. Onun idempotent olmayan bir istek yani kullanıcı aynı istekleri 2 kez vurursa, herhangi bir kısıtlama yoksa yeni bir kaynak yaratacaktır.

http post yöntemi, SQL'de her zaman veritabanında yeni bir kayıt oluşturan bir INSERT sorgusu gibidir.

Örnek: Arka uç sunucusunun yeni kaynak için kaynak kimliğine karar verdiği durumlarda yeni kullanıcı, sipariş vb. Kaydetmek için POST yöntemini kullanın.

KOYMAK

HTTP.PUT yönteminde kaynak önce URL'den tanımlanır ve varsa güncellenir, aksi takdirde yeni bir kaynak oluşturulur. Hedef kaynak mevcut olduğunda, bu kaynağın üzerine yepyeni bir gövde yazar. HTTP.PUT yöntemi, bir kaynağı YARATMAK veya GÜNCELLEMEK için kullanılır.

http put yöntemi, SQL'de verilen kaydın var olup olmamasına bağlı olarak bir kayıt ekleyen veya güncelleyen bir MERGE sorgusu gibidir.

PUT isteği idempotenttir, yani aynı istekleri iki kez vurmak mevcut kaydı günceller (Yeni kayıt oluşturulmaz). PUT yönteminde kaynak kimliği istemci tarafından belirlenir ve istek url'sinde sağlanır.

Örnek: Mevcut kullanıcıyı veya siparişi güncellemek için PUT yöntemini kullanın.

YAMA

Bir HTTP.PATCH yöntemi, bir kaynakta kısmi değişiklikler yapmak için kullanılır; örneğin delta güncellemeleri.

http yama yöntemi, SQL'de yalnızca tüm sütunları değil yalnızca seçilen sütunları ayarlayan veya güncelleyen bir UPDATE sorgusu gibidir.

Örnek: Sipariş durumunu güncellemek için PATCH yöntemini kullanabilirsiniz.

PATCH / API / Kullanıcılar / 40450236 / Sipariş / 10234557

İstek Organı: {status: 'Teslim edildi'}


Bu, herkesin put ve patch hakkında okuyabileceği en kötü açıklamadır. Ve ayrıca, zaten çok iyi cevaplar gönderdikten sonra, cevabınızın burada farklı olduğunu düşündüren nedir?
CodeHunter

3

Güncellemeler yapılırken PATCH üzerinden PUT'ta sınırlamalar vardır. PUT kullanmak, yalnızca bir özelliği değiştirmek istesek bile tüm özellikleri belirtmemizi gerektirir. Ancak PATCH yöntemini kullanırsak yalnızca ihtiyacımız olan alanları güncelleyebiliriz ve tüm alanlardan bahsetmeye gerek yoktur. PATCH, bir dizideki bir değeri değiştirmemize veya bir niteliği veya dizi girişini kaldırmamıza izin vermez.


1

PUT ve PATCH yöntemleri doğada benzerdir, ancak önemli bir fark vardır.

PUT - PUT isteğinde, ekteki varlık sunucuda bulunan bir kaynağın değiştirilmiş sürümü olarak kabul edilir ve bu değiştirilen varlık ile değiştirilir.

PATCH - PATCH isteğinde, ekteki varlık, sunucuda bulunan varlığın daha yeni bir sürüm üretecek şekilde nasıl değiştirileceğine ilişkin bir dizi talimat içerir.


1

HTTP şartlarına göre, PUTistek bir veritabanı güncelleme deyimine benzer. PUT- mevcut kaynağı değiştirmek için kullanılır (Önceden POSTED). Öte yandan, PATCHistek mevcut kaynağın bir kısmını güncellemek için kullanılır.

Örneğin:

Müşteri detayları:

// This is just a example.

firstName = "James";
lastName = "Anderson";
email = "email@domain.com";
phoneNumber = "+92 1234567890";
//..

Kaydın tamamını güncellemek istediğimizde? bunun için kullanmalıyız Http PUT verb.

gibi:

// Customer Details Updated.

firstName = "James++++";
lastName = "Anderson++++";
email = "email@Updated.com";
phoneNumber = "+92 0987654321";
//..

Öte yandan, kaydın tamamını değil, yalnızca kayıt kısmını güncellemek istiyoruz Http PATCH verb. gibi:

   // Only Customer firstName and lastName is Updated.

    firstName = "Updated FirstName";
    lastName = "Updated LastName";
   //..

POST SONRASI:

PUTİstek kullanılırken , firstName, lastName, email, phoneNumber gibi tüm parametreleri patchgöndermeliyiz.

Daha fazla bilgi için lütfen şu adresi ziyaret edin: https://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/


0

Put ve Patch yöntemi benzerdir. Ancak raylarda farklı bir metod vardır.Kayıtın tamamını güncellemek / değiştirmek istiyorsak, Put yöntemini kullanmak zorundayız. Belirli bir kaydı güncellemek istiyorsak Yama yöntemini 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.