HTTP/1.1 Spec:n mukaan:
`
POST
-menetelmää käytetään pyytämään, että alkuperäinen palvelin hyväksyisi pyynnön sisältämän kokonaisuuden uudeksi alaisuudeksi resurssille, joka on tunnistettuRequest-URI
:lläRequest-Line
:ssä.
Toisin sanoen POST
-menetelmää käytetään luomiseen.
`
PUT
-metodi pyytää, että mukana oleva olio tallennetaan toimitetunRequest-URI
:n alle. JosRequest-URI
viittaa jo olemassa olevaan resurssiin, liitteenä olevaa oliota PITÄÄ pitää muunneltuna versiona alkuperäisellä palvelimella olevasta oliosta. JosRequest-URI
ei viittaa olemassa olevaan resurssiin ja pyynnön esittävä käyttäjäagentti voi määritellä kyseisen URI:n uudeksi resurssiksi, alkuperäispalvelin voi luoda resurssin kyseisellä URI:lla;
Toisin sanoen PUT
:ia käytetään luomiseen tai päivittämiseen.
Kumpaa pitäisi siis käyttää resurssin luomiseen? Vai pitääkö tukea molempia?
Kokonaisuutena:
Luomiseen voidaan käyttää sekä PUT- että POST-menetelmää.
Sinun on kysyttävä "mihin suoritat toiminnon?" erottaaksesi, kumpaa sinun pitäisi käyttää. Oletetaan, että olet suunnittelemassa API:ta kysymysten esittämistä varten. Jos haluat käyttää POSTia, se tehdään kysymysten luettelolle. Jos haluat käyttää PUTia, se tehdään tietylle kysymykselle.
Hienoa, että molempia voidaan käyttää, joten kumpaa minun pitäisi käyttää RESTful-suunnittelussani:
Sinun ei tarvitse tukea sekä PUT- että POST-muotoja.
Se, kumpaa käytetään, on sinun päätettävissäsi. Muista kuitenkin käyttää oikeaa sen mukaan, mihin objektiin viittaat pyynnössä.
Joitakin näkökohtia:
Esimerkki:
Kirjoitin seuraavan osana SO:n toista vastausta tähän liittyen:
POST:
Käytetään resurssin muuttamiseen ja päivittämiseen.
POST /questions/
HTTP/1.1 Host: www.example.com/ Huomaa, että seuraava on virhe:
POST /questions/
HTTP/1.1 Isäntä: www.example.com/ Jos URL-osoitetta ei ole vielä luotu, voitte ei pitäisi käyttää POSTia sen luomiseen. kun määrität nimen. Tämän pitäisi johtaa 'resurssia ei löydy' -virheeseen. koska
<new_question>
ei ole olemassa. vielä. Sinun pitäisi PUTTAA<new_question>
resurssi palvelimelle ensin.Voisit kuitenkin tehdä jotain sellaista kuin näin luoda resurssi käyttäen POSTia:
POST /questions HTTP/1.1 Host: www.example.com/
Huomaa, että tässä tapauksessa resurssi nimeä ei määritetä, uudet objektit URL-polku palautettaisiin sinulle.
PUT:
Käytetään resurssin luomiseen tai sen korvaamiseen. Kun määrität resurssien uuden URL-osoitteen.
Uudelle resurssille:
PUT /questions/
HTTP/1.1 Host: www.example.com/ Olemassa olevan resurssin korvaaminen:
PUT /questions/
HTTP/1.1 Isäntä: www.example.com/
Käytä POSTia luomiseen ja PUTia päivittämiseen. Näin Ruby on Rails ainakin tekee sen.
PUT /items/1 #=> update
POST /items #=> create
REST on erittäin korkean tason käsite. Itse asiassa siinä ei edes mainita HTTP:tä lainkaan!
Jos olet epävarma siitä, miten REST toteutetaan HTTP:ssä, voit aina tutustua [Atom Publication Protocol (AtomPub)][1] -spesifikaatioon. AtomPub on standardi REST-verkkopalveluiden kirjoittamiseen HTTP:llä, ja sen ovat kehittäneet monet HTTP- ja REST-kuuluisat henkilöt, ja siihen on osallistunut myös Roy Fielding, RESTin keksijä ja HTTP:n (osa)keksijä itse.
Itse asiassa voit ehkä jopa käyttää AtomPubia suoraan. Vaikka se on syntynyt blogiyhteisössä, se ei rajoitu millään tavalla bloggaamiseen: se on yleinen protokolla, jolla voidaan olla REST-yhteydessä HTTP:n kautta mielivaltaisten resurssien mielivaltaisten (sisäkkäisten) kokoelmien kanssa. Jos voit esittää sovelluksesi sisäkkäisinä resurssikokoelmina, voit käyttää AtomPubia, etkä tarvitse huolehtia siitä, käytetäänkö PUT- vai POST-palvelua, mitä HTTP-tilakoodeja palautetaan ja kaikista muista yksityiskohdista.
AtomPub kertoo resurssien luomisesta seuraavaa (kohta 9.2):
Lisätäkseen jäseniä kokoelmaan asiakkaat lähettävät POST-pyyntöjä kokoelman URI:hen.