Pagal HTTP/1.1 specifikaciją:
Užklausos metodas POST
naudojamas prašyti, kad pradinis serveris priimtų užklausoje nurodytą esybę kaip naują pavaldų išteklių, identifikuojamų pagal Request-URI
, esantį Request-Line
.
Kitaip tariant, POST
naudojamas kūrimui.
PUT
metodu prašoma, kad pridedama esybė būtų išsaugota pagal pateiktąRequest-URI
. JeiRequest-URI
nurodo jau egzistuojantį išteklių, pridedama esybė PRIVALO būti laikoma pakeista kilmės serveryje esančios esybės versija. JeiRequest-URI
nenurodo esamo ištekliaus, o užklausą pateikęs naudotojo agentas tą URI gali apibrėžti kaip naują išteklių, kilmės serveris gali sukurti tą URI turintį išteklių."
Tai reiškia, kad PUT
naudojamas kūrimui arba atnaujinimui.
Taigi, kuris iš jų turėtų būti naudojamas ištekliui sukurti? Ar reikia palaikyti abu?
Apskritai:
Kuriant galima naudoti ir PUT, ir POST.
Norėdami atskirti, ką turėtumėte naudoti, turite paklausti: "su kuo atliekate veiksmą?". Tarkime, kad kuriate API, skirtą klausimams užduoti. Jei norite naudoti POST, tai darytumėte klausimų sąrašui. Jei norite naudoti PUT, tai darytumėte konkrečiam klausimui.
Greitai galima naudoti abu variantus, tad kurį iš jų turėčiau naudoti savo RESTful projekte:
Nereikia palaikyti ir PUT, ir POST.
Kuris iš jų bus naudojamas, priklauso nuo jūsų. Bet tik nepamirškite naudoti tinkamą, priklausomai nuo to, į kokį objektą darote nuorodą užklausoje.
Keletas pastabų:
Pavyzdys:
Parašiau šį pavyzdį kaip dalį kito su tuo susijusio SO atsakymo:
POST:
Naudojamas ištekliui keisti ir atnaujinti
POST /questions/
HTTP/1.1 Priimantysis: www.example.com/
Atkreipkite dėmesį, kad toliau nurodyta klaida:
POST /questions/
HTTP/1.1 Host: www.example.com/ Jei URL dar nesukurtas, galite neturėtumėte naudoti POST jam sukurti nurodydami pavadinimą. Tai turėtų sukelti klaidą 'resursas nerastas' nes
<new_question>
neegzistuoja dar nėra. Turėtumėte PUT'inti<new_question>
išteklių į serverį.Tačiau galite padaryti kažką panašaus į taip sukurti išteklius naudojant POST:
POST /questions HTTP/1.1 Pagrindinis kompiuteris: www.example.com/
Atkreipkite dėmesį, kad šiuo atveju išteklius pavadinimas nenurodytas, nauji objektai URL kelias bus grąžintas jums.
PUT:
Naudojamas ištekliui sukurti arba jį perrašyti. Nors nurodote išteklių naują URL adresą.
Naujam ištekliui:
PUT /questions/
HTTP/1.1 Prieglobstis: www.example.com/
Jei norite perrašyti esamą išteklių:
PUT /questions/
HTTP/1.1 Host: www.example.com/
Norėdami sukurti, naudokite POST, o norėdami atnaujinti - PUT. Taip tai daro "Ruby on Rails".
PUT /items/1 #=> update
POST /items #=> create
REST yra labai aukšto lygio koncepcija. Tiesą sakant, joje net neminimas HTTP!
Jei abejojate, kaip įgyvendinti REST HTTP, visada galite pažvelgti į Atom Publication Protocol (AtomPub) specifikaciją. AtomPub yra REST interneto paslaugų rašymo naudojant HTTP standartas, kurį sukūrė daug HTTP ir REST žinovų, šiek tiek prisidėjo REST išradėjas ir HTTP išradėjas Roy Fielding.
Tiesą sakant, galbūt net galėsite tiesiogiai naudoti "AtomPub". Nors šis protokolas atsirado tinklaraščių bendruomenėje, jis jokiu būdu neapsiriboja tik tinklaraščiais: tai yra bendras protokolas, skirtas REST sąveikai su bet kokiais (įterptais) bet kokių išteklių rinkiniais per HTTP. Jei savo programą galite pateikti kaip įterptą išteklių rinkinį, galite tiesiog naudoti "AtomPub" ir nesirūpinti, ar naudoti PUT, ar POST, kokius HTTP būsenos kodus grąžinti ir kitomis smulkmenomis.
Štai ką "AtomPub" sako apie išteklių kūrimą (9.2 skirsnis):
Norėdami pridėti narius prie kolekcijos, klientai siunčia POST užklausas į kolekcijos URI.