Was ist der Hauptunterschied zwischen PATCH- und PUT-Anforderung?


185

Ich verwende eine PUTAnfrage in meiner Rails-Anwendung. Jetzt wurde ein neues HTTP-Verb PATCHvon Browsern implementiert. Ich möchte also wissen, was der Hauptunterschied zwischen PATCHund PUTAnfragen ist und wann wir die eine oder andere verwenden sollten.

Antworten:


138

HTTP-Verben sind wahrscheinlich eines der kryptischsten Dinge am HTTP-Protokoll. Sie existieren und es gibt viele von ihnen, aber warum existieren sie?

Rails scheint viele Verben unterstützen zu wollen und einige Verben hinzuzufügen, die von Webbrowsern nicht nativ unterstützt werden.

Hier ist eine vollständige Liste der http-Verben: http://annevankesteren.nl/2007/10/http-methods

Dort der HTTP-Patch aus dem offiziellen RFC: https://datatracker.ietf.org/doc/rfc5789/?include_text=1

Die PATCH- Methode fordert an, dass eine Reihe von Änderungen, die in der Anforderungsentität beschrieben sind, auf die durch den Anforderungs-URI identifizierte Ressource angewendet werden. Die Änderungen werden in einem Format dargestellt, das als "Patch-Dokument" bezeichnet wird und durch einen Medientyp gekennzeichnet ist. Wenn der Request-URI zu einer bestehenden Ressource zeigt nicht, der Server KANN eine neue Ressource erstellen, auf dem Patch Dokumenttyp abhängig (ob es logisch eine Null - Ressource ändern kann) und Berechtigungen usw.

Der Unterschied zwischen den PUT und PATCH - Anfragen in der Art und Weise reflektiert der Server die beiliegende Einheit verarbeitet die Ressource durch den Anforderungs-URI identifiziert zu modifizieren. In einer PUT- Anforderung wird die eingeschlossene Entität als modifizierte Version der auf dem Ursprungsserver gespeicherten Ressource betrachtet, und der Client fordert an, dass die gespeicherte Version ersetzt wird. Bei PATCH enthält die beigefügte Entität jedoch eine Reihe von Anweisungen, die beschreiben, wie eine Ressource, die sich derzeit auf dem Ursprungsserver befindet, geändert werden sollte, um eine neue Version zu erstellen. Die PATCH Methode wirkt sich auf die Ressource durch den identifizierten Request-URI , und es auch MAYNebenwirkungen auf andere Ressourcen haben; Das heißt, durch die Anwendung eines PATCH können neue Ressourcen erstellt oder vorhandene geändert werden .

Soweit ich weiß, wird das PATCH- Verb nicht wie in Rails-Anwendungen verwendet ... Soweit ich weiß, sollte das RFC-Patch-Verb zum Senden von Patch-Anweisungen verwendet werden, beispielsweise wenn Sie einen Unterschied zwischen zwei Dateien machen. Anstatt die gesamte Entität erneut zu senden, senden Sie einen Patch, der viel kleiner sein kann als das erneute Senden der gesamten Entität.

Stellen Sie sich vor, Sie möchten eine große Datei bearbeiten. Sie bearbeiten 3 Zeilen. Anstatt die Datei zurückzusenden, müssen Sie nur das Diff senden. Auf der positiven Seite könnte das Senden einer Patch-Anfrage verwendet werden, um Dateien asynchron zusammenzuführen. Ein Versionskontrollsystem könnte möglicherweise das PATCH- Verb verwenden, um Code aus der Ferne zu aktualisieren.

Ein anderer möglicher Anwendungsfall hängt etwas mit NoSQL-Datenbanken zusammen. Es ist möglich, Dokumente zu speichern. Angenommen, wir verwenden eine JSON-Struktur, um Daten vom Server zum Client hin und her zu senden. Wenn wir ein Feld löschen wollten, könnten wir eine Syntax verwenden, die der in mongodb für $ unset ähnelt . Tatsächlich könnte die in Mongodb zum Aktualisieren von Dokumenten verwendete Methode wahrscheinlich zum Behandeln von JSON-Patches verwendet werden.

Nehmen Sie dieses Beispiel:

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

Wir könnten so etwas haben:

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

Zu guter Letzt können die Leute über HTTP-Verben sagen, was sie wollen. Es gibt nur eine Wahrheit, und die Wahrheit ist in den RFCs.


1
Es ist wichtig zu beachten, dass sich RFC 5789 noch in der Vorschlagsphase befindet und nicht offiziell akzeptiert wurde und derzeit als "irrata exist" gekennzeichnet ist. Diese "Best Practice" ist umstritten und technisch gesehen ist PATCH noch nicht Teil des HTTP-Standards. Die einzige Wahrheit hier ist, dass Sie es nicht tun sollten, da der RFC nicht akzeptiert wird.
fishpen0

3
Selbst wenn es noch im Vorschlag ist, heißt das nicht, dass es nicht verwendet werden sollte. Wenn dies der Fall wäre, könnten wir keine Websockets und viele andere RFCs verwenden, die sich noch im Vorschlag befinden ... Die Implementierung des Vorschlags ist 100-mal besser als die Implementierung von etwas vollständig Benutzerdefiniertem, das sonst niemand implementiert.
Loïc Faure-Lacroix

BS. Es ist nicht "im Vorschlag" und Teil des HTTP-Standards (der Standard, RFC 7231 delegiert an eine IANA-Registrierung für Methoden, und PATCH ist dort aufgeführt).
Julian Reschke

@JulianReschke Wenn Sie die zweite Zeile dieses RFC lesen, werden Sie feststellen, dass sie immer noch als VORGESCHLAGENER STANDARD markiert ist . Also nein, die Patch-Methode ist noch im Vorschlag. Der RFC ist übrigens hier. tools.ietf.org/html/rfc5789 und der rfc7231 sind ebenfalls STANDARDVORGESCHLAGEN . Wenn Sie sich zum Beispiel den RFC821 ansehen, ist er als INTERNET STANDARD
Loïc Faure-Lacroix

1
@JulianReschke en.wikipedia.org/wiki/Internet_Standard#Proposed_Standard ... Es ist nicht mein Wort. Ein vorgeschlagener Standard bedeutet nicht, dass Sie ihn nicht ordnungsgemäß implementieren können, wie oben erläutert. Das bedeutet nicht, dass es nicht stabil genug ist, um implementiert zu werden ... aber es ist immer noch im Vorschlag, es sei denn, es ist als Internet Standard markiert ... Ich bin mir nicht sicher, wie Sie darüber argumentieren. Es heißt "vorgeschlagener Standard" und kann nichts anderes als einen Vorschlag bedeuten. Wenn Sie argumentieren möchten, dass ein vorgeschlagener Standard verwendet werden kann. Genau das habe ich geschrieben.
Loïc Faure-Lacroix

102

Ich habe ein paar Stunden mit Google verbracht und die Antwort hier gefunden

PUT => Wenn der Benutzer den gesamten Datensatz oder nur einen Teil davon aktualisieren kann , verwenden Sie PUT (Benutzer steuert, was aktualisiert wird).

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

PATCH => Wenn der Benutzer nur einen Teildatensatz aktualisieren kann , sagen Sie nur eine E-Mail-Adresse (die Anwendung steuert, was aktualisiert werden kann), verwenden Sie PATCH.

PATCH /users/123
[description of changes]

Warum Patch

PUTMethode benötigen mehr Bandbreite oder behandeln volle Ressourcen statt teilweise. So PATCHwurde eingeführt, um die Bandbreite zu reduzieren.

Erklärung zu PATCH

PATCH ist eine Methode, die weder sicher noch idempotent ist und vollständige und teilweise Aktualisierungen und Nebenwirkungen auf andere Ressourcen ermöglicht.

PATCH ist eine Methode, deren eingeschlossene Entität eine Reihe von Anweisungen enthält, die beschreiben, wie eine Ressource, die sich derzeit auf dem Ursprungsserver befindet, geändert werden sollte, um eine neue Version zu erstellen.

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

Hier finden Sie weitere Informationen zu Put und Patch


7
Warum ist dieser PATCH nicht sicher?
Bishisht Bhatta

1
PATCHunter POST, PUTusw. nicht „sicher“ ist, weil sie Ihre Daten modifizieren (hat Nebenwirkungen). Im Vergleich zu GET, OPTIONSusw. (sichere Methoden) , wo Sie die Endpunkte rufen mehrmals ohne irgendwelche Nebenwirkungen.
Emix

1
PATCH wurde NICHT eingeführt, um nur die Bandbreite zu sparen. In RFC 5789 heißt es:> "Eine neue Methode ist erforderlich, um die Interoperabilität zu verbessern und Fehler zu vermeiden." In einer Umgebung mit mehreren Parallelen, in der nur PUTs den Rest der Nutzlast enthalten, würde sich das Risiko einer Änderung anderer Attribute der Ressource erhöhen. PATCH löst dieses Problem.
Tomasz Nazar

43

put
Wenn ich meinen firstNamen ändern möchte, sende eine Put- Anfrage für das Update

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

aber hier hat ein Problem ist die putAnfrage, dass ich, wenn ich eine putAnfrage senden möchte , alle zwei Parameter senden muss, das heißt, firstund last
daher ist es obligatorisch, alle Werte erneut zu senden

Patch :
patchAnfrage sagt. Senden dataSie nur das, was Sie möchten, updateund es beeinflusst oder ändert keine anderen Daten.
Sie müssen also nicht alle Werte erneut senden. Ich möchte nur meinen Vornamen aktualisieren, also muss ich nur den firstNamen senden, um ihn zu aktualisieren.


13

Hier ist der Unterschied zwischen POST-, PUT- und PATCH-Methoden eines HTTP-Protokolls.

POST

Eine HTTP.POST-Methode erstellt immer eine neue Ressource auf dem Server. Es handelt sich um eine nicht idempotente Anforderung, dh wenn der Benutzer zweimal auf dieselben Anforderungen trifft, wird eine weitere neue Ressource erstellt, wenn keine Einschränkung besteht.

Die http post-Methode ähnelt einer INSERT-Abfrage in SQL, bei der immer ein neuer Datensatz in der Datenbank erstellt wird.

Beispiel: Verwenden Sie die POST-Methode, um neue Benutzer, Bestellungen usw. zu speichern, wobei der Back-End-Server die Ressourcen-ID für die neue Ressource festlegt.

STELLEN

Bei der HTTP.PUT-Methode wird die Ressource zuerst anhand der URL identifiziert. Wenn sie vorhanden ist, wird sie aktualisiert, andernfalls wird eine neue Ressource erstellt. Wenn die Zielressource vorhanden ist, überschreibt sie diese Ressource mit einem vollständig neuen Text. Das heißt, die HTTP.PUT-Methode wird verwendet, um eine Ressource zu erstellen oder zu aktualisieren.

Die http put-Methode ähnelt einer MERGE-Abfrage in SQL, bei der ein Datensatz eingefügt oder aktualisiert wird, je nachdem, ob der angegebene Datensatz vorhanden ist.

Die PUT-Anforderung ist idempotent, dh wenn zweimal dieselben Anforderungen getroffen werden, wird die vorhandene Aufzeichnung aktualisiert (kein neuer Datensatz erstellt). Bei der PUT-Methode wird die Ressourcen-ID vom Client festgelegt und in der Anforderungs-URL angegeben.

Beispiel: Verwenden Sie die PUT-Methode, um vorhandene Benutzer oder Bestellungen zu aktualisieren.

PATCH

Eine HTTP.PATCH-Methode wird für teilweise Änderungen an einer Ressource verwendet, dh Delta-Aktualisierungen.

Die http-Patch-Methode ähnelt einer UPDATE-Abfrage in SQL, bei der nur ausgewählte Spalten und nicht die gesamte Zeile festgelegt oder aktualisiert werden.

Beispiel: Sie können die PATCH-Methode verwenden, um den Auftragsstatus zu aktualisieren.

PATCH / api / users / 40450236 / order / 10234557

Anfragetext: {Status: 'Geliefert'}


Dies ist die schlechteste Erklärung, die jemals jemand über Put und Patch lesen kann. Und außerdem, nach so vielen guten Antworten, was lässt Sie denken, dass Ihre Antwort hier anders ist?
CodeHunter

3

Beim Aktualisieren gibt es Einschränkungen bei PUT over PATCH. Bei Verwendung von PUT müssen wir alle Attribute angeben, auch wenn wir nur ein Attribut ändern möchten. Wenn wir jedoch die PATCH-Methode verwenden, können wir nur die Felder aktualisieren, die wir benötigen, und es müssen nicht alle Felder erwähnt werden. Mit PATCH können wir keinen Wert in einem Array ändern oder ein Attribut oder einen Array-Eintrag entfernen.


1

PUT und PATCH Methoden sind ähnlich in der Natur, aber es gibt einen entscheidenden Unterschied.

PUT - In der PUT- Anforderung wird die eingeschlossene Entität als die geänderte Version einer Ressource betrachtet, die sich auf dem Server befindet, und durch diese geänderte Entität ersetzt.

PATCH - In der PATCH- Anforderung enthält die beigefügte Entität die Anweisungen, wie die Entität, die sich auf dem Server befindet, geändert werden soll, um eine neuere Version zu erstellen.


1

Gemäß den HTTP-Bedingungen ist die PUTAnforderung genau wie eine Datenbankaktualisierungsanweisung. PUT- wird zum Ändern vorhandener Ressourcen verwendet (zuvor POSTED). Andererseits wird die PATCHAnforderung verwendet, um einen Teil der vorhandenen Ressource zu aktualisieren.

Beispielsweise:

Kundendetails:

// This is just a example.

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

Wann möchten wir auf den gesamten Datensatz aktualisieren? wir müssen verwendenHttp PUT verb .

sowie:

// Customer Details Updated.

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

Wenn wir dagegen nur den Teil des Datensatzes aktualisieren möchten, nicht den gesamten Datensatz, dann entscheiden Sie sich für Http PATCH verb. sowie:

   // Only Customer firstName and lastName is Updated.

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

PUT VS POST:

Beim Benutzen PUT wir request verwenden, müssen wir alle Parameter wie firstName, lastName, email, phoneNumber patchsenden , wobei as as In request nur die Parameter sendet, die wir aktualisieren möchten, ohne dass andere Daten beeinflusst oder geändert werden.

Weitere Informationen finden Sie unter: https://fullstack-developer.academy/restful-api-design-post-vs-put-vs-patch/


0

Put- und Patch-Methode sind ähnlich. Aber in Schienen hat es eine andere Methode. Wenn wir den gesamten Datensatz aktualisieren / ersetzen wollen, müssen wir die Put-Methode verwenden. Wenn wir einen bestimmten Datensatz aktualisieren möchten, verwenden Sie die Patch-Methode.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.