PUNE-vs POST în RESTUL

Potrivit HTTP/1.1 Spec.:

POST metodă este folosită pentru a solicita ca server de origine accepta entitate închisă în cerere ca un nou subordonat resurse identificate prin Cererea-URI " în " Cerere-Line`

Cu alte cuvinte, "POST" este folosit pentru a crea.

"PUNE" metoda solicită ca entitate închisă fi stocate sub furnizate Cererea-URI. Dacă Cererea-URI se referă la o resursă existentă, închise entitate ar TREBUI să fie considerat ca o versiune modificata de cel care are reședința pe serverul de origine. Dacă Cererea-URI nu indică o resursă existentă, și asta-URI poate fi definit ca o nouă resursă de a solicita user agent, originea server poate crea resurse cu asta URI."

Că este, "a PUS" este folosit pentru a a crea sau actualiza.

Deci, care ar trebui să fie folosit pentru a crea o resursă? Sau o nevoie de a sprijini atât?

Comentarii la întrebare (14)
Soluția

În general:

Amândoi și POST pot fi utilizate pentru crearea.

Trebuie sa intrebi "ce realizează acțiunea de a?" de a distinge ceea ce ar trebui să fie folosind. Las's presupunem tine're proiectarea unui API pentru a pune întrebări. Dacă doriți să utilizați POST, atunci v-ar face asta la o listă de întrebări. Dacă doriți să utilizați PUNE apoi te-ar face asta la o anumită întrebare.

Mare ambele pot fi folosite, deci, care ar trebui să îl folosesc în Odihnitor design:

Nu aveți nevoie de sprijin, cât și de POST.

Care este folosit este lăsat până la tine. Dar doar amintiți-vă să utilizați una corectă, în funcție de ce obiect care faceți referire în cerere.

Unele considerații:

  • Ai numele URL-ul dvs. obiecte creați în mod explicit sau permite serverul decide? Dacă numele a le folosi apoi a PUS. Dacă lăsați server decide apoi utilizați POST.
  • PUNE este idempotent, așa că, dacă ai PUS un obiect de două ori, nu are nici un efect. Aceasta este o proprietate frumos, deci mi-ar folosi PUNE atunci când este posibil.
  • Puteți actualiza sau de a crea o resursă cu PUNE cu același obiect URL
  • Cu POST poti avea 2 cereri venind în același timp, de a face modificări la un URL, și se poate actualiza diferite părți ale obiectului.

Exemplu:

Am scris următoarele, ca parte a un alt răspuns pe ATÂT cu privire la acest:

MESAJ:

Folosit pentru a modifica și actualiza o resursă

POST /întrebări/ HTTP/1.1 Gazda: www.example.com/

Rețineți că următoarele este o eroare:

POST /întrebări/ HTTP/1.1 Gazda: www.example.com/

Dacă URL-ul nu este creat încă, ai nu ar trebui să fie folosind POST să-l creeze în timp ce precizând numele. Acest lucru ar trebui să rezultat 'resource nu a fost găsit' eroare pentru că <new_question> nu exista încă. Tu ar trebui să PUNĂ <new_question> resurse de pe server în primul rând.

Ai putea totuși face ceva de genul pentru a crea o resources folosind POST:

POST /întrebări HTTP/1.1 Gazda: www.example.com/

Rețineți că, în acest caz, resursa nume nu este specificat, obiecte noi cale URL-ar fi întors la tine.

PUNE:

Folosit pentru a crea o resursă, sau suprascrie-l. În timp ce specifica resurse noul URL.

Pentru o nouă resursă:

a PUNE /întrebări/ HTTP/1.1 Gazda: www.example.com/

Pentru a suprascrie o resursă existentă:

a PUNE /întrebări/ HTTP/1.1 Gazda: www.example.com/

Comentarii (41)

Puteți găsi afirmații pe web, care spune

Nici nu este destul de dreapta.


Mai bine este de a alege între a PUS și POST bazat pe idempotence de acțiune.

PUNE presupune punerea unei resurse - înlocuirea complet ceea ce este disponibil la URL-ul dat cu un alt lucru. Prin definiție, o PUNE este idempotent. Face ca de multe ori doriți, și rezultatul este același. x=5 este idempotent. Puteți PUNE o resursă dacă anterior exista, sau nu (de exemplu, pentru a Crea sau pentru a Actualiza)!

POST actualizări de o resursă, adaugă o filială de resurse, sau de a produce o schimbare. Un POST nu este idempotent, în felul în care x++ nu este idempotent.


Prin acest argument, este PUS pentru crearea când știți URL-ul de lucru pe care îl va crea. POST poate fi folosit pentru a crea, atunci când știți URL-ul de "fabrica" sau manager pentru categoria de lucruri pe care doriți să creați.

deci:

POST /expense-report

sau:

PUT  /expense-report/10929
Comentarii (16)
  • POST la un URL creează o resursă copil la o server defined URL-ul.
  • PUNE la un URL creează/înlocuiește resurse în toate elementele sale la client defined URL-ul.
  • PATCH-uri la un URL actualizări part de resurse la care clientul definite URL-ul.

Specificația relevantă pentru a PUNE și POST este RFC 2616 §9.5 ff.

POST creează o resursă copil, astfel încât POSTUL să /elemente creează o resurse care trăiește sub/elementede resurse. De exemplu./articole/1`. Trimiterea la același post de pachete de două ori va crea două resurse.

PUNE este pentru crearea sau înlocuirea unei resurse la un URL-ul cunoscut de către client.

Prin urmare: PUNE este doar un candidat pentru a CREA în cazul în care clientul știe deja url-ul înainte de resurse este creat. De exemplu. /bloguri/nigel/de intrare/when_to_use_post_vs_put ca titlul este folosit ca resursă cheie

PUNE înlocuiește resurse la cunoscut url-ul, dacă acesta există deja, așa că trimiterea aceeași cerere de două ori nu are nici un efect. Cu alte cuvinte, apeluri pentru a PUNE sunt idempotent.

RFC citește astfel:

diferența fundamentală între POST și PUNE cererile se reflectă în sens diferit de Request-URI. URI într-o cerere POST identifică resursa care se va ocupa de entitate închisă. Această resursă ar putea fi o date-acceptarea procesului, o poarta spre un alt protocol, sau de o entitate separată care acceptă adnotări. În schimb, URI într-o cerere identifică o entitate închisă cu cererea-agentul utilizator știe ce-URI este destinat și serverul NU TREBUIE să încerce să aplice solicitarea unor alte resurse. Dacă serverul dorește ca cererea să fie aplicată o altă URI,

Notă: - a PUS a fost folosit mai ales pentru a actualiza resursele (prin înlocuirea lor în entireties), dar, recent, există o mișcare spre utilizarea de PATCH-uri pentru actualizarea resurselor existente, astfel cum se specifică faptul că se înlocuiește întreaga resursă. RFC 5789.

Actualizare 2018: nu Există un caz care poate fi făcut pentru a evita PUS. Vezi "RESTUL, fără a PUNE"

Cu "RESTUL, fără a PUNE" tehnica, ideea este că consumatorii sunt nevoiți să post nou 'nounified' cererea de resurse. Cum s-a discutat mai devreme, schimbarea unui client adresa de corespondență este un POST pentru o nouă "ChangeOfAddress" de resurse, nu o PUNE de un "Client" de resurse, cu o diferite adresă de corespondență valoare de câmp.

preluat din REST API Design - Resurse de Modelare de Prakash Subramaniam de Thoughtworks

Aceasta obligă API pentru a evita starea de tranziție probleme cu mai mulți clienți actualizarea unei singure resurse, și se potrivește mai bine cu evenimentul de aprovizionare și CQRS. Atunci când munca se face asincron, Postarea de transformare și de așteptare pentru ca acesta să fie aplicate pare adecvat.

Comentarii (12)

Rezumat:

Crea:

Poate fi realizată atât cu PUI sau POSTA în felul următor:

PUS

Creează LA resurse noi cu newResourceId ca element de identificare, sub /resursele URI, sau colectarea.

a PUNE /resurse/ HTTP/1.1

POST

Creează O resurse noi sub /resursele URI, sau colectarea. De obicei, identificatorul este returnat de server.

POST /resursa HTTP/1.1

Update:

Poate **** a fi efectuat cu PUNE în felul următor:

PUS

Actualizări de resurse cu existingResourceId ca element de identificare, sub /resursele URI, sau colectarea.

a PUNE /resurse/ HTTP/1.1

Explicatie:

Atunci când se ocupă cu RESTUL și URI ca general, ai generic pe left și specifice pe right. La generice sunt de obicei numite colecții și mai mult specifice elemente poate fi numit resurse. Rețineți că un resurse poate conține un colectarea.

Exemplu:

<-- generic -- specific -->

URI: website.com/users/john website.com - tot site-ul utilizatori - colecție de utilizatori ioan - element de colectare, sau o resursă

URI:website.com/users/john/posts/23 website.com - tot site-ul utilizatori - colecție de utilizatori ioan - element de colectare, sau o resursă mesaje - colectie de mesaje de la john 23 - mesaj de la john cu 23 de identificare, de asemenea, o resursă

Atunci când utilizați POST esti mereu referindu-se la o colectarea, astfel încât ori de câte ori ai spus:

POST /users HTTP/1.1

postați un utilizator nou la users colectarea.

Dacă te duci pe și să încerce ceva de genul asta:

POST /users/john HTTP/1.1

acesta va lucra, dar semantic spuneți că doriți să adăugați o resursă pentru john colectarea sub users colectarea.

Odată ce sunteți folosind PUNE referire la o resurse sau singur element, eventual, în interiorul unui colectarea. Deci, atunci când spui:

PUT /users/john HTTP/1.1

spui la serverul de actualizare, sau pentru a crea, dacă nu't există, john resurse sub users colectarea.

Spec:

Permiteți-mi să evidențiez unele părți importante ale spec.:

POST

POST metodă este folosită pentru a solicita ca server de origine accept entitate închisă în cerere ca un new subordonate de resurse identificate prin Request-URI în Cererea-Line

Prin urmare, creează un nou resurse pe colectarea.

PUS

PUNE metoda cere ca entitatea să fie închise stocate sub furnizate de Request-URI. În cazul în care Cererea-URI se referă la un deja existente de resurse, închise entitate ar TREBUI să fie considerat ca un versiune modificată de la unul care are reședința pe serverul de origine. În cazul în care Cererea-URI nu nu punct la un existent de resurse, și asta URI este capabil de a fi definit ca un new resurse de a solicita user agent, originea server poate crea resurse cu asta URI."

Prin urmare, de a crea sau actualiza bazează pe existența resurse.

Referință:

Comentarii (16)

Am'd dori să adăugați meu "pragmatică" sfaturi. Utilizarea PUNE atunci când știi "id" prin care obiectul sunteți de economisire pot fi recuperate. Folosind PUS câștigat't merge prea bine dacă aveți nevoie de, să zicem, o bază de date generate de identitate pentru a fi returnate pentru tine să faci în viitor căutări sau actualizări.

Deci: Pentru a salva un utilizator existent, sau una în care clientul generează id-ul și it's-a verificat că id-ul este unic:


PUT /user/12345 HTTP/1.1  
Comentarii (2)

POST inseamna "a crea noi" la fel ca în "Aici este de intrare pentru a crea un utilizator, de a crea pentru mine".

PUNE-înseamnă "introduce, înlocuiți dacă există deja" la fel ca în "Aici sunt datele de utilizator de 5".

Tine POST pentru a example.com/users din moment ce tu nu't știu URL-ul utilizatorului, totuși, doriți ca serverul să-l creeze.

Ai PUS de a example.com/users/id când doriți să înlocuiți/crea un specifice utilizator.

Postarea de două ori cu aceleași date înseamnă a crea două identice utilizatorii cu id-uri diferite. Punand de două ori cu aceleași date creează utilizatorul primul și actualizări-l la același stat a doua oară (fără modificări). Când te trezești cu aceeași stare după o PUNE, indiferent de câte ori a efectua, este declarat a fi "la fel de puternic" de fiecare dată - idempotent. Acest lucru este util pentru a reîncerca automat cereri. Nu mai 'sunteți sigur că doriți să-l retrimiteți' atunci când apăsați butonul din spate de pe browser-ul.

Un sfat general este de a utiliza POSTA atunci când ai nevoie de server pentru a fi în controlul de generare URL de resurse. Utilizarea PUNE altfel. Prefera PUS pe POST.

Comentarii (15)

Utilizarea POST pentru a crea, și de a PUNE pentru a actualiza. Ca's cum Ruby on Rails este de a face, oricum.

PUT    /items/1      #=> update
POST   /items        #=> create
Comentarii (8)

Ambele sunt folosite pentru transmisia de date între client la server, dar există diferențe subtile între ele, care sunt:

Analogie:

  • PUNE-adică să ia și pune unde a fost.
  • POST ca trimite e-mail la post office.

Social Media/Rețea Analogie:

  • Post pe social media: atunci când vom posta un mesaj, se creează nouă postare.
  • Pune(de exemplu, editare) pentru mesajul care l-am Postat deja.
Comentarii (4)

RESTUL este foarte mare la nivel de concept. În fapt, aceasta nu't chiar menționez HTTP la toate!

Dacă aveți îndoieli despre cum să pună în aplicare RESTUL în HTTP, puteți lua întotdeauna o privire la [Atom Publicarea Protocolului (AtomPub)][1] caietul de sarcini. AtomPub este un standard pentru scrierea Odihnitor webservices cu HTTP, care a fost dezvoltat de către mulți HTTP și RESTUL corpuri de iluminat, cu unele intrare de Roy Fielding, inventatorul de ODIHNĂ și (co-)inventatorul HTTP el însuși.

În fapt, s-ar putea chiar să fie capabil de a utiliza AtomPub direct. În timp ce a ieșit din comunitate blogging-ul, este în nici un fel limitată la blogging: ea este un protocol generic pentru Odihnitor interacționează cu arbitrare (imbricate) colecții de arbitrare resurse prin intermediul HTTP. Dacă poți să-ți reprezinți aplicație ca un imbricate colecție de resurse, atunci puteți folosi doar AtomPub și nu vă faceți griji cu privire la posibilitatea de a folosi PUI sau de POST, ce Coduri de Stare HTTP pentru a reveni și toate acele detalii.

Aceasta este ceea ce AtomPub are de spus despre crearea de resurse (secțiunea 9.2):

pentru a adăuga membri La o Colecție, clienții trimite cereri POST la URI de Colectare.

Comentarii (9)

Decizia de a folosi PUS sau POST pentru a crea o resursă pe un server cu un HTTP + REST API este în funcție de cine deține structura de URL-ul. Având știu client, sau de a participa la definirea, URL-ul struct este un inutilă de cuplare înrudită cu cuplaje nedorite care au apărut de la SOA. Evadarea tipuri de cuplaje este motivul RESTUL este atât de popular. Prin urmare, buna metoda de a utiliza este de POST. Există și excepții de la această regulă și ele apar atunci când clientul dorește să-și păstreze controlul asupra localizarea structurii de resursele pe care le desfășoară. Acest lucru este rar și probabil înseamnă că ceva este greșit. În acest moment, unii oameni vor argumenta că, dacă Odihnitor-URL's au folosit, clientul nu știe URL-ul resursei și, prin urmare, o PUNE este acceptabil. După toate, acest lucru este de ce canonice, normalizat, Ruby on Rails, Django Url-urile sunt importante, uita-te la Twitter API ... bla bla bla. Acei oameni trebuie să înțeleagă nu există nici un astfel de lucru ca un Odihnitor-URL-ul și Roy Fielding însuși afirmă că:

UN REST API nu trebuie să definească fix nume de resurse sau ierarhii (o evident de cuplare dintre client și server). Serverele trebuie să aibă libertatea de pentru a controla propriile lor nume. În schimb, permite servere pentru a instrui clienții privind modul de a construi corespunzătoare Uri, astfel ca este facut in HTML forme URI și template-uri, prin definirea acestor instrucțiuni în mass-media tipuri și link-ul de relații. [Eșec implică faptul că clienții sunt presupunând o structura de resurse ca urmare a benzii de informații, cum ar fi un domeniu specific standard, care este orientată spre date echivalent cu RPC's de cuplare funcțională].

http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven Ideea de a o Odihnitor-URL-ul este de fapt o încălcare de ODIHNĂ ca serverul este responsabil de structura de URL-ul și ar trebui să fie liber să decidă cum să-l folosească pentru a evita cuplare. Dacă această confuzie ai citit despre semnificația de descoperire de sine pe API design. Folosind POST pentru a crea resursele vine cu un design considerare pentru că POSTUL nu este idempotent. Acest lucru înseamnă că, repetând un POST de mai multe ori nu garantează același comportament de fiecare dată. Acest lucru sperie oamenii în utilizarea PUS pentru a crea resurse atunci când acestea nu ar trebui. Ei știu că's-a întâmplat (POST este pentru a CREA), dar o fac oricum, pentru că ei don't știu cum să rezolve această problemă. Această preocupare este demonstrată în următoarele situații:

  1. Clientul POST o nouă resursă la server.
  2. Serverul procesează cererea și trimite un răspuns.
  3. Clientul nu primește răspuns.
  4. Serverul este conștient clientul nu a primit răspuns.
  5. Clientul nu are un URL pentru resurse (prin urmare, nu este o opțiune) și repetă POST.
  6. POST nu este idempotent și server ... Pasul 6 este locul unde oamenii de obicei obține confuz despre ce să facă. Cu toate acestea, nu există nici un motiv pentru a crea o improvizație pentru a rezolva această problemă. În schimb, HTTP poate fi folosit ca specificată în RFC 2616, iar serverul răspunde: 10.4.10 409 Conflict

cererea nu a putut fi finalizat din cauza unui conflict cu actualul de stat de resurse. Acest cod este permis numai în situațiile în care este de așteptat ca utilizatorul ar putea fi capabil de a rezolva conflictul și retrimiteți cererea. Organismul de răspuns ar TREBUI să includă suficient

informații pentru utilizator de a recunoaște sursa de conflict. în mod Ideal, răspunsul entității să includă suficiente informații pentru utilizatorul sau agentul utilizator pentru a rezolva problema; cu toate acestea, că ar putea să nu fie posibil și nu este necesară.

Conflicte sunt cel mai probabil să apară ca răspuns la o cerere. Pentru de exemplu, în cazul versiunilor erau folosite și entitatea fiind PUS inclus modificări la o resursă care intră în conflict cu cele realizate de un mai devreme (de la terți) cererea, serverul ar putea folosi 409 răspuns pentru a indica faptul că nu poate finaliza cererea. În acest caz, răspuns entitate ar putea conține o listă a diferențelor dintre cele două versiuni într-un format definit de răspuns Content-Type. Răspunde cu un cod de stare 409 Conflict este corect recurs pentru că:

  • Efectuarea unui POST de date care are o IDENTITATE care se potrivește o resursă deja în sistem este "un conflict cu starea actuală a resurselor."
  • De important este pentru client să înțeleagă server are resurse și să ia măsurile corespunzătoare. Aceasta este o "situație(s) în cazul în care este de așteptat ca utilizatorul ar putea fi capabil de a rezolva conflictul și retrimiteți cererea."
  • Un răspuns care conține URL-ul resursei cu conflict de IDENTITATE și corespunzătoare premise pentru resurse ar oferi "suficiente informații pentru utilizator sau user agent pentru a rezolva problema", care este cazul ideal pe RFC 2616. Actualizare bazat pe eliberarea de RFC 7231 pentru a Înlocui 2616 RFC 7231 este conceput pentru a înlocui 2616 și în Secțiunea 4.3.3 descrie urmați răspuns posibil pentru un POST Dacă rezultatul prelucrării unui POST ar fi echivalent cu un reprezentare a unei resurse existente, un server de origine POATE redirecționa agent de utilizare a resurselor prin trimiterea unui 303 (a se Vedea Alte) răspuns cu resurse existente's de identificare în câmpul Locație. Asta are avantajele de a furniza agentul utilizator o resursă de identificare și transferul de reprezentare printr-o metodă mai cedat la cache partajat, deși la costul de o solicitare în plus, dacă utilizatorul agentul nu au deja reprezentare în cache. Acum poate fi tentant să se întoarcă pur și simplu o 303 în cazul în care un MESAJ este repetat. Cu toate acestea, opusul este adevărat. Revenind un 303 ar avea sens numai dacă crea mai multe cereri (crearea de resurse diferite) a reveni la același conținut. Un exemplu ar fi un "vă mulțumim pentru trimiterea mesajului de cerere" pe care clientul nu trebuie să re-descărca de fiecare dată. RFC 7231 menține încă în secțiunea 4.2.2 că POSTUL nu trebuie să fie idempotent și continuă să mențină acest POST ar trebui să fie utilizate pentru a crea. Pentru mai multe informații despre acest lucru, citiți acest articolul.
Comentarii (11)

Îmi place acest sfat, de RFC 2616's definiție a PUS:

diferența fundamentală între POST și PUNE cererile se reflectă în sens diferit de Request-URI. URI într-o cerere POST identifică resursa care se va ocupa de entitate închisă. Această resursă ar putea fi o date-acceptarea procesului, o poarta spre un alt protocol, sau de o entitate separată care acceptă adnotări. În schimb, URI într-o cerere identifică o entitate închisă cu cererea-agentul utilizator știe ce-URI este destinat și serverul NU TREBUIE să încerce să aplice solicitarea unor alte resurse.

Acest jibes cu alte sfaturi aici, care este cel mai bine aplicat la resurse care au deja un nume, iar POSTUL este bun pentru a crea un nou obiect sub o resursă existentă (și lasă server de nume).

Eu interpretez asta, și idempotency cerințele pe PUNE, înseamnă că:

  • POSTUL este bun pentru crearea de noi obiecte sub o colecție (și de a crea nu are nevoie să fie idempotent)
  • PUNE este bun pentru actualizarea obiectelor existente (și de actualizare trebuie să fie idempotent)
  • POST poate fi de asemenea utilizat pentru non-idempotent actualizări de la obiecte existente (în special, schimbarea parte a unui obiect fără a preciza totul ... dacă stai să te gândești, crearea unui nou membru dintr-o colecție este de fapt un caz special al acestui tip de actualizare, din colectia's perspectiva)
  • PUNE, de asemenea, poate fi folosit pentru a crea, dacă și numai dacă permite clientului să-și numele resursei. Dar din moment ce RESTUL clientilor sunt't ar trebui să facă presupuneri despre structura URL-ul, acest lucru este mai puțin în cele destinate spiritul de lucruri.
Comentarii (1)

Pe scurt:

PUNE este idempotent, în cazul în care resursa de stat va fi aceeași în cazul în care aceeași operație este executată o singură dată sau de mai multe ori.

POST este non-idempotent, în cazul în care resursa de stat poate deveni diferit dacă operația este executată de mai multe ori față de a executa o singură dată.

Analogie cu interogare a bazei de date

PUNE Vă puteți gândi similar cu "ACTUALIZARE STUDENT SET adresa = "abc" în cazul în care id="123";

POST Vă puteți gândi ceva de genul "INSERT INTO STUDENT(nume, adresa) VALUES ("abc", "xyzzz");

Id-ul de Student este generat automat.

Cu PUNE, dacă interogarea este executată de mai multe ori sau o singură dată, ELEVUL tabelul de stat rămâne aceeași.

În caz de POST, dacă aceeași interogare este executat de mai multe ori, apoi de mai multe înregistrări de studenți create în baza de date și baza de date modificările de stat pe fiecare execuție a unui "INTRODUCE" de interogare.

NOTĂ: PUNE are nevoie de o resursă locație (deja-resurse) pe care de actualizare trebuie să se întâmple, întrucât POSTUL nu't nevoie de asta. Prin urmare, intuitiv POST este destinat pentru crearea unei noi resurse, întrucât PUNE este necesar pentru actualizarea deja existente de resurse.

Unii pot veni cu actualizări pot fi efectuate cu POST. Nu există nici o regulă greu pe care să o folosiți pentru actualizări sau pe care să o folosiți pentru a crea. Din nou, acestea sunt convenții, și intuitiv am'm înclinată cu cele menționate mai sus raționament și urmați-l.

Comentarii (3)

POST este ca si cum ai posta o scrisoare de la o cutie poștală sau de a posta un e-mail la un e-mail coadă. Este ca și când ai pune un obiect într-o gaura sau un loc pe un raft (are o adresă cunoscută).

Cu POST,'re posta la adresa de COADĂ sau de COLECTARE. Cu PUNE, te're punerea la adresa articolului.

PUNE este idempotent. Puteți trimite solicitarea de 100 de ori și nu va mai conta. POST nu este idempotent. Dacă trimiteți cererea de 100 de ori, te'll obține 100 de e-mailuri sau 100 de scrisori în cutia dvs. poștală.

O regulă generală: dacă știi id-ul sau numele de element, utilizați PUS. Daca vrei id-ul sau numele de elementul care urmează să fie atribuite de către partea primitoare, utilizați POST.

Comentarii (10)

Nou răspuns (acum, că am înțeles bine):

Este doar o declarație de la ce conținut de servicii ar trebui, de acum, utilizați pentru a face reprezentări de resurse identificate de către client; POST este o declarație a ceea ce conținutul de servicii ar trebui, de acum înainte, conțin (eventual duplicat), dar's up la server cum de a identifica acel conținut.

PUNE x` (dacă " x "identifică o resurse): "Înlocui conținutul de resursa identificată prin" x " cu conținutul meu."

PUNE x` (daca " x "nu a identifica o resursă): "a Crea o nouă resursă care conține conținutul meu și de a folosi" x " să-l identifice."

POST x: "Magazin conținutul meu și dă-mi un identificator pe care le pot folosi pentru a identifica o resursă (vechi sau nou) care conțin conținut (eventual amestecat cu alte tipuri de conținut). A spus resource ar trebui să fie identice sau subordonat care " x " identifică." "_y_&#39;s resurse este subordonat _x_&#39;s resurse" este de obicei dar nu neapărat puse în aplicare printr-_y_ o subpath de _x_ (de exemplu, _x_ =/fooși _y_ =/foo/bar`) și modificarea reprezentării(e) de x's resurse pentru a reflecta existența unei noi resurse, de exemplu cu un hyperlink la y's resurse și unele metadate. Numai acesta din urmă este într-adevăr esențială pentru un design bun, ca Url-uri sunt opace in REST ... ai're ar trebui să utilizare hypermedia în loc de client-side URL-ul de construcție pentru a traversa serviciu oricum.

In REST, nu's nici un astfel de lucru ca o resursă care conține "content". Ma refer ca "content" de date care serviciul utilizează pentru a face declarații în mod constant. Acesta constă de obicei în câteva rânduri legate într-o bază de date sau un fișier (de exemplu, un fișier de imagine). L's până la serviciu pentru a converti utilizator's de conținut în ceva serviciului poate folosi, de exemplu, conversia un JSON utilă în declarații SQL.

Original răspuns (ar putea fi mai ușor de citit):

PUNE /ceva (dacă/ceva există deja): "Ia tot ce ai la/ceva și înlocuiți-l cu ce-ți dau."

PUNE /ceva (dacă/ceva nu există deja): "Ia ce-ți dau și pune-l la/ceva`."

POST /ceva: "Ia ce-ți dau și pune-l oriunde doriți în/ceva atâta timp cât dă-mi URL-ul său, atunci când te're făcut."

Comentarii (4)

Răspuns Scurt:

Regulă simplă de degetul mare: Foloseste POST pentru a crea, utiliza PUNE la actualizare.

Timp De Răspuns:

POST:

  • POST este folosit pentru a trimite date la server.
  • Util atunci când resursa's URL-ul este necunoscut

PUNE:

  • PUNE-este utilizat pentru a transfera stat la server
  • Util atunci când o resursă's URL-ul este cunoscut

Mai Răspunde:

Să înțelegem că avem nevoie pentru a PUNE întrebarea de ce a fost necesar, ce probleme PUNE încerca să rezolve acest POST n't.

Din RESTUL de arhitectura's punct de vedere nu este nici unul care contează. Am fi putut trăi fără a PUNE cât mai bine. Dar de la un client developer's punctul de vedere al lui/ei de viață mult mai simplu.

Înainte de a PUNE, clientii n't direct știți URL-ul pe care serverul a generat sau, dacă nu a generat nicio sau dacă datele să fie trimise la server este deja actualizat sau nu. PUNE ușurat dezvoltator de toate aceste batai de cap. PUNE este idempotent, PUNE ocupă de condițiile de rasă, și a PUS permite clientul alege URL-ul.

Comentarii (1)

Ruby on Rails 4.0 va utiliza 'PATCH' metoda în loc de a PUNE de-a face parțială actualizări.

RFC 5789 spune despre PATCH-uri (din 1995):

O nouă metodă este necesară pentru a îmbunătăți interoperabilitatea și pentru a preveni erori. Metoda put este deja definit pentru a suprascrie o resursă cu un complet nou organism, și nu pot fi refolosite pentru a face modificări parțiale. În caz contrar, proxy-uri și cache-uri, și chiar clienți și servere, pot obține confuz cu privire la rezultatul operației. POSTUL este deja folosit, dar fără larg de interoperabilitate (pentru unul, nu există nici o modalitate standard de a descoperi patch suport format). PATCH-uri a fost menționat mai devreme în HTTP caietul de sarcini, dar nu este complet definit.

"C Șine: PATCH este noul primar metoda HTTP pentru updates" explică ea.

Comentarii (0)

Cu riscul de a se amintească ceea ce a fost deja spus, se pare important să ne amintim că PUNE presupune că clientul controale ce URL este de gând să sfârșesc prin a fi, atunci când se creează o resursă. Deci, o parte din alegerea între PUNE și POST este de gând să fie despre cât de mult poți să ai încredere în client pentru a oferi corect, normalizat URL care sunt coerente cu orice URL-ul dvs. de sistem este.

Când poți't pe deplin încredere în client pentru a face dreptul de lucru, ar fi mai adecvat pentru a utiliza POST pentru a crea un nou element și apoi trimite URL-ul înapoi la client în răspuns.

Comentarii (10)

Într-un mod foarte simplu am'm a lua exemplu de la Facebook timeline.

Cazul 1: Cand postezi ceva pe timeline-ul, l's de o nouă intrare. Deci, în acest caz se utilizează metoda POST, deoarece POSTUL metoda este non-idempotent.

Cazul 2: Dacă prietenul tău comentariu privind postarea dvs. prima dată, care, de asemenea, va crea o nouă intrare în baza de date astfel încât POST de metoda utilizată.

Cazul 3: Dacă prietenul tău editează comentariul său, în acest caz, au avut un comentariu id-ul, astfel încât acestea vor actualizați o înregistrare existentă comentariu în loc de a crea o nouă intrare în baza de date. Prin urmare, pentru acest tip de operațiune folosi PUS metodă deoarece este idempotent.*

Într-o singură linie, utilizați POST pentru a adăuga o nouă intrare în baza de date și PUNE la **** update ceva în baza de date.

Comentarii (2)

Cel mai important aspect este fiabilitate. Dacă un POST mesajul se pierde starea sistemului este nedefinit. Recuperare automată este imposibil. Pentru a PUNE mesaje, statul nu este definită numai până la primul succes încercați din nou.

De exemplu, aceasta nu poate fi o idee bună pentru a crea tranzacțiile cu carduri de credit cu POST.

Dacă se întâmplă să aveți auto generate URI's de pe resource puteți utiliza în continuare PUS prin trecerea unui generate URI (arătând spre un gol de resurse) pentru client.

Alte considerente:

  • POST invalidează în cache copii din întreaga conțin resurse (mai consistenta)
  • PUNE-răspunsurile nu sunt cacheable în timp ce POST sunt (au Nevoie de Conținut-locul de Amplasare și de expirare)
  • PUNE-este mai puțin susținută de exemplu Java me, browsere mai vechi, firewall-uri
Comentarii (6)

În plus față de diferențele sugerat de către alții, vreau să mai adaug unul.

În POST metodă puteți trimite corpul params în formă de date

În PUNE metoda trebuie să trimită corpul params în x-www-form-urlencoded

Antet Content-Type:application/x-www-form-urlencoded

În funcție de acest lucru, nu puteți trimite fișiere sau mai multe date in PUNE metoda

EDIT

conținutul de tip "application/x-www-form-urlencoded" este ineficient pentru a trimite cantități mari de date binare sau text care conține caractere non-ASCII. Tipul de conținut "multipart/form-data" ar trebui să fie folosit pentru trimiterea formularelor care conțin fișiere, non-ASCII date, și date binare.

Ceea ce înseamnă că dacă ai să prezinte

fișiere, non-ASCII date, și date binare

ar trebui să utilizați POST metoda

Comentarii (2)