[REST] Razlika med PUT in PATCH?

Pri Laravel lahko za update izberem metodo PUT ali PATCH in mi ni jasno, v čem je razlika? Načeloma uporabljam PATCH ampak če za metodo izberem PUT, update-anje še vedno deluje brez težav in mi ni jasno v čem je sploh razlika?

8 odgovorov

When should we use the PATCH HTTP method?

The HTTP methods PATCH can be used to update partial resources. For instance, when you only need to update one field of the resource, PUTting a complete resource representation might be cumbersome and utilizes more bandwidth

Malo si preberi o REST-u, pa boš bolje razumel. (ker mi, glede na tvoje vprašanje, deluje, da gledaš ti na to s stališča PHP-ja oz Laravela, ne pa HTTP metode)

1

Glavna razlika je v tem, da je PUT namenjen zamenjavi celotnega resourca, PATCH pa se uporablja za modifikacijo obstoječega. Če v obeh primerih podaš vse lastnosti resourca, potem razlike efektivno res ni. Je pa vprašanje, če Laravel res upošteva tole ali ne, ga ne poznam. Poskusi narediti PUT s kakšnim manjkajočim propertyjem resourca, načeloma bi ti moral manjkajočega v resourcu izpraznit.

1

Ni lih fora Laravela (ali katerega koli frameworka). Fora je kako imaš ti narejeno v kodi. Drugače pa ti je Vini napisal glavno razliko.

1

spicey:

When should we use the PATCH HTTP method?

The HTTP methods PATCH can be used to update partial resources. For instance, when you only need to update one field of the resource, PUTting a complete resource representation might be cumbersome and utilizes more bandwidth

Malo si preberi o REST-u, pa boš bolje razumel. (ker mi, glede na tvoje vprašanje, deluje, da gledaš ti na to s stališča PHP-ja oz Laravela, ne pa HTTP metode)

Ne gledam iz stališča Laravela. Mi je jasno, da gre tu za HTTP request v originalu s POST metodo ter hidden input z metodo PUT, PATCH (pač za spremembo resource) in da lahko tak način implemnentiraš vsepovsod... Laravel sem omenil, ker me zanima, kako je rešeno tukaj + smisel dveh metod.

Vini:
Glavna razlika je v tem, da je PUT namenjen zamenjavi celotnega resourca, PATCH pa se uporablja za modifikacijo obstoječega. Če v obeh primerih podaš vse lastnosti resourca, potem razlike efektivno res ni. Je pa vprašanje, če Laravel res upošteva tole ali ne, ga ne poznam. Poskusi narediti PUT s kakšnim manjkajočim propertyjem resourca, načeloma bi ti moral manjkajočega v resourcu izpraznit.

Približno tako sem si tudi sam vse skupaj razlagal in sem že prej naredil test tako, da en input ni bil določen (file) in pri PUT bi mi verjetno moralo potem to polje v bazi "izprazniti" ampak mi ga ne in ostane nespremenjeno.

Recimo, da imam (dumpal sem request, enkrat za PATCH, drugič za PUT)...

Pa recimo, da sem spremenil samo vrednost "name".

V 1. primeru (PATCH) mi potem updata samo polje "name"?

V 2. primeru (PUT) pa bi mi moralo v bazi updatat name, url (+polje img, ki ga nisem spreminjal - v inputu nisem dodal nove slike zato te vrednosti v requestu ni - ampak mi ga ne, polje img v bazi ostane nespremenjeno)?

Sicer pa ne vidim potem nekega velikega smisla v PUT metodi, če pa lahko vedno uporabim PATCH in je to to? Ali v katerem primeru bi potem sploh prišla prav PUT metoda?

(* da ne bo kdo zmeden zakaj je v polju zapisano 6, dve vrednosti sem z grafičnim programom odstranil :D jasno, med njimi ni bilo img, ker je polje ne vsebuje, ker ni določena)

Točno to kar ti je spicey napisal si zamešal. PUT in PATCH nista noben POST, ampak PUT IN PATCH. POST se naredi samo zato ker brskalniki ne podpirajo patch in put in se potem s hidden elementom naredi fake metoda.

Kako ti pa potem zadeve v ozadju dela......to je pa stvar tebe. Načeloma ti lahko podatke urejaš na get in na put brišeš. Lahko nove kreiraš z DELETE, ..... To je stvar programerja ki ureja.
Se pravi kako narediš put in patch je tvoja stvar. Razliko kako NAJ BI bilo ti je pa vini napisal.

bostjan:
Točno to kar ti je spicey napisal si zamešal. PUT in PATCH nista noben POST, ampak PUT IN PATCH. POST se naredi samo zato ker brskalniki ne podpirajo patch in put in se potem s hidden elementom naredi fake metoda.

Kako ti pa potem zadeve v ozadju dela......to je pa stvar tebe. Načeloma ti lahko podatke urejaš na get in na put brišeš. Lahko nove kreiraš z DELETE, ..... To je stvar programerja ki ureja.
Se pravi kako narediš put in patch je tvoja stvar. Razliko kako NAJ BI bilo ti je pa vini napisal.

Ja saj to sem zgoraj napisal kot odgovor spicey ;) Metodo PUT/PATCH/DELETE pač "fejkamo" preko POST s hidden input, ker teh metod brskalnik ne pozna potem pa preko vrednosti za _metod (vidimo za katero "fake" metodo gre) naredimo kar želimo (generiramo SQL za UPDATE, DELETE... ). To je meni jasno. Malo sem bil v dvomim kakšna je točno razlika med PUT in PATCH, to je vini v principu pojasnil AMPAK očitno se tega pri Laravel ne držijo (me čisto informativno zamina)?

Sem zdajle dumpal query v primeru za PUT in v primeru za PATCH. V obeh primeri se v Laravel generira enak query... Recimo, če spremenim ime (input name, ostali inputi ostanejo enaki)...

pri PATCH...

string'update categories set name = ?, updated_at = ? where id = ?' (length=67)

pri PUT se generira query

string'update categories set name = ?, updated_at = ? where id = ?' (length=67)

Query-a sta identična torej je pri Laravel čisto vseeno ali uporabiš PUT ali PATCH, ker se očitno ne držijo tega, kar je zapisal Vini?

Ja, query je isti, v praksi lahko lahko isti query uporabiš tudi v POST-u ali DELETE, ampak tega ne počni.

Te metode so nekako "standardizirane", da bi tisti, ki na novo implementirajo api lažje in hitreje dojeli kaj katera metoda/klic naredi. Jaz razumem to samo kot organizacijsko vrednost.

1

Še ena opazka glede PATCH...

Just as a side note, PATCH is not yet a standard. I've encountered an issue where one customer's firewall/proxy/cache/whatever is turning our front end's PATCH into METHOD_OTHER (this is according to Bugsnag) before it reaches our API, which Laravel then cannot route.

Unless you know for certain, PUT is safer, and it might be best to put a header/flag in the request to say that a partial update. It's not ideal, but hopefully things will improve soon!

Očitno bom raje uporabljal kar PUT...

Tisti, ki programirate v Laravel, katero metodo uporabljate za update? PUT ali PATCH, me čisto informativno zanima.