Ifølge HTTP/1.1-specifikationen:
POST
-metoden bruges til at anmode om, at origin-serveren accepterer den enhed, der er medtaget i anmodningen, som en ny underordnet enhed til den ressource, der er identificeret vedRequest-URI
iRequest-Line
.
Med andre ord bruges POST
til at skabe.
Metoden PUT
anmoder om, at den vedlagte enhed lagres under den angivne Request-URI
. Hvis Request-URI
henviser til en allerede eksisterende ressource, BØR den vedlagte enhed betragtes som en ændret version af den, der befinder sig på origin-serveren. Hvis Request-URI
ikke peger på en eksisterende ressource, og den pågældende URI kan defineres som en ny ressource af den anmodende brugeragent, kan origin-serveren oprette ressourcen med denne URI."
Det vil sige, at PUT
bruges til at skabe eller opdatere.
Så hvilken skal bruges til at oprette en ressource? Eller skal man understøtte begge dele?
Overordnet:
Både PUT og POST kan bruges til at oprette.
Du skal spørge dig selv "hvad udfører du handlingen på?" for at finde ud af, hvad du skal bruge. Lad's antage, at du'er ved at designe et API til at stille spørgsmål. Hvis du ønsker at bruge POST, så ville du gøre det til en liste af spørgsmål. Hvis du ønsker at bruge PUT, skal du gøre det til et bestemt spørgsmål.
Både kan bruges, så hvilken af dem skal jeg bruge i mit RESTful-design:
Du behøver ikke at understøtte både PUT og POST.
Det er op til dig, hvilken der skal bruges. Men husk blot at bruge den rigtige, afhængigt af hvilket objekt du refererer til i anmodningen.
Nogle overvejelser:
Eksempel:
Jeg skrev følgende som en del af et andet svar på SO om dette:
POST:
Bruges til at ændre og opdatere en ressource
POST /questions/
HTTP/1.1 Host: www.example.com/ Bemærk, at følgende er en fejl:
POST /questions/
HTTP/1.1 Host: www.example.com/ Hvis URL'en endnu ikke er oprettet, skal du bør du ikke bruge POST til at oprette den mens du angiver navnet. Dette bør resultere i en 'resource not found' fejl fordi
<new_question>
ikke eksisterer ikke findes endnu. Du skal PUT'e<new_question>
ressource på serveren først.Du kunne dog gøre noget som dette for at oprette en ressource ved hjælp af POST:
POST /questions HTTP/1.1 Host: www.example.com/
Bemærk, at i dette tilfælde er ressourcen navn ikke er angivet, vil de nye objekter URL-sti vil blive returneret til dig.
PUT:
Bruges til at oprette en ressource, eller overskrive den. Mens du angiver den ressourcer ny URL.
For en ny ressource:
PUT /questions/
HTTP/1.1 Vært: www.example.com/ For at overskrive en eksisterende ressource:
PUT /questions/
HTTP/1.1 Vært: www.example.com/
Brug POST til at oprette og PUT til at opdatere. Det er i hvert fald sådan Ruby on Rails gør det.
PUT /items/1 #=> update
POST /items #=> create
REST er et koncept på meget højt niveau. Faktisk nævner det slet ikke HTTP!
Hvis du er i tvivl om, hvordan du implementerer REST i HTTP, kan du altid tage et kig på [Atom Publication Protocol (AtomPub)][1] specifikationen. AtomPub er en standard til at skrive RESTful webservices med HTTP, som blev udviklet af mange HTTP- og REST-koryfæer med en del input fra Roy Fielding, der selv er opfinderen af REST og (med)opfinder af HTTP.
Faktisk kan du måske endda bruge AtomPub direkte. Selv om den stammer fra bloggermiljøet, er den på ingen måde begrænset til blogging: det er en generisk protokol til REST-interaktion med vilkårlige (indlejrede) samlinger af vilkårlige ressourcer via HTTP. Hvis du kan repræsentere din applikation som en nested samling af ressourcer, kan du bare bruge AtomPub og ikke bekymre dig om, hvorvidt du skal bruge PUT eller POST, hvilke HTTP-statuskoder der skal returneres og alle disse detaljer.
Dette er, hvad AtomPub har at sige om oprettelse af ressourcer (afsnit 9.2):
For at tilføje medlemmer til en samling sender klienter POST-forespørgsler til samlingens URI.