PUT pret POST REST

Saskaņā ar HTTP/1.1 specifikāciju:

Pieprasījums: POST metode tiek izmantota, lai pieprasītu, lai izcelsmes serveris pieņemtu pieprasījumā ietverto vienību kā jaunu resursa, kas identificēts ar Request-URI Request-Line, pakārtotu vienību.

Citiem vārdiem sakot, POST tiek izmantots, lai izveidotu.

PUT metode pieprasa, lai pievienotā vienība tiktu saglabāta ar norādīto Request-URI. Ja Request-URI attiecas uz jau pastāvošu resursu, pievienoto būtni JĀPAGAIDA uzskatīt par izcelsmes serverī esošās būtnes modificētu versiju. Ja Request-URI nenorāda uz pastāvošu resursu un šo URI pieprasošais lietotāja aģents var definēt kā jaunu resursu, izcelsmes serveris var izveidot resursu ar šo URI."

Tas nozīmē, ka PUT tiek izmantots, lai izveidotu vai atjauninātu.

Kurš no tiem jāizmanto resursa izveidei? Vai arī ir jāatbalsta abi?

Risinājums

Kopumā:

Gan PUT, gan POST var izmantot izveidei.

Jums ir jājautā "kam jūs veicat darbību?", lai noteiktu, kas jums būtu jāizmanto. Pieņemsim, ka jūs izstrādājat API, lai uzdotu jautājumus. Ja jūs vēlaties izmantot POST, tad jūs to darītu ar jautājumu sarakstu. Ja vēlaties izmantot PUT, tad to darītu konkrētam jautājumam.

Labi, ka var izmantot abus variantus, tad kuru no tiem man vajadzētu izmantot savā RESTful projektā:.

Jums nav jāatbalsta gan PUT, gan POST.

Kurš no tiem tiks izmantots, ir atkarīgs no jums. Bet tikai atcerieties, ka jāizmanto pareizais atkarībā no tā, uz kādu objektu jūs atsaucaties pieprasījumā.

Daži apsvērumi:

  • Vai jūs skaidri nosaucat savus izveidotos URL objektus vai ļaujat serverim izlemt? Ja tos nosaucat, tad izmantojiet PUT. Ja ļaujat serverim izlemt, izmantojiet POST.
  • PUT ir idempotents, tāpēc, ja objektu PUT veicat divas reizes, tam nav ietekmes. Tā ir jauka īpašība, tāpēc, ja iespējams, es izmantotu PUT.
  • Ar PUT var atjaunināt vai izveidot resursu, izmantojot to pašu objekta URL.
  • Izmantojot POST, vienlaicīgi var tikt saņemti 2 pieprasījumi, lai veiktu izmaiņas URL adresē, un tie var atjaunināt dažādas objekta daļas.

Piemērs:

Es uzrakstīju šādu piemēru kā daļu no citas SO atbildes par šo jautājumu:

POST:

Izmanto, lai modificētu un atjauninātu resursu

POST /questions/ HTTP/1.1

Saimnieks: www.example.com/

Ievērojiet, ka turpmāk norādītais ir kļūda:

POST /questions/ HTTP/1.1 Host: www.example.com/

Ja URL vēl nav izveidots, jūs tā izveidei nevajadzētu izmantot POST norādot nosaukumu. Tam vajadzētu izraisīt kļūdu 'resurss nav atrasts'. jo nepastāv. vēl nav izveidots. Jums ir jāievada resurss serverī.

Jūs tomēr varētu darīt kaut ko līdzīgu šo, lai izveidotu resursu, izmantojot POST:

POST /questions HTTP/1.1 Host: www.example.com/

Ņemiet vērā, ka šajā gadījumā resurss nosaukums nav norādīts, jaunie objekti URL ceļš tiks atgriezts jums.

PUT:

Izmanto, lai izveidotu resursu vai to pārrakstīt. Kamēr jūs norādāt resursu jauno URL.

Jaunam resursam:

PUT /questions/ HTTP/1.1 Host: www.example.com/

Lai pārrakstītu esošo resursu:

PUT /questions/ HTTP/1.1 Host: www.example.com/

Komentāri (41)

Lai izveidotu, izmantojiet POST, bet lai atjauninātu - PUT. Tā to dara Ruby on Rails.

PUT    /items/1      #=> update
POST   /items        #=> create
Komentāri (8)

REST ir ļoti augsta līmeņa koncepcija. Patiesībā tajā vispār nav minēts HTTP!

Ja jums ir šaubas par to, kā īstenot REST HTTP, vienmēr varat ielūkoties Atom Publication Protocol (AtomPub) specifikācijā. AtomPub ir standarts REST tīmekļa pakalpojumu rakstīšanai, izmantojot HTTP, ko izstrādāja daudzi HTTP un REST slavenības, un tajā piedalījās arī REST izgudrotājs un HTTP (līdz)izgudrotājs Rojs Fildings.

Patiesībā jūs varētu pat tieši izmantot AtomPub. Lai gan tas ir radies blogu kopienā, tas nekādā ziņā neaprobežojas tikai ar blogu rakstīšanu: tas ir vispārīgs protokols, kas paredzēts REST mijiedarbībai ar patvaļīgām (ligzdotām) patvaļīgu resursu kopām, izmantojot HTTP. Ja varat attēlot savu lietojumprogrammu kā resursu sakārtotu kolekciju, tad varat vienkārši izmantot AtomPub un neuztraukties par to, vai izmantot PUT vai POST, kādus HTTP statusa kodus atdot un visas šīs detaļas.

Tas ir tas, kas AtomPub ir teikts par resursu izveidi (9.2. iedaļa):

Lai kolekcijai pievienotu locekļus, klienti sūta POST pieprasījumus uz kolekcijas URI.

Komentāri (9)