Które metody HTTP pasują do których metod CRUD?

213

W programowaniu w stylu RESTful powinniśmy używać metod HTTP jako naszych elementów składowych. Jestem trochę zdezorientowany, które metody pasują do klasycznych metod CRUD. GET / Read i DELETE / Delete są wystarczająco oczywiste.

Jaka jest jednak różnica między PUT / POST? Czy pasują one do siebie za pomocą opcji Utwórz i zaktualizuj?

Rysował
źródło

Odpowiedzi:

298
Create = PUT with a new URI
         POST to a base URI returning a newly created URI
Read   = GET
Update = PUT with an existing URI
Delete = DELETE

PUT może być mapowany zarówno na Utwórz, jak i Aktualizuj, w zależności od istnienia identyfikatora URI używanego z PUT.

POST mapuje na Utwórz.

Korekta: POST można również odwzorować na Aktualizuj, chociaż zwykle jest używany do Utwórz. POST może być również częściową aktualizacją, więc nie potrzebujemy proponowanej metody PATCH.

Paul Morgan
źródło
16
+1: Rozróżniasz między PUT do tworzenia zasobów, których nazwy (URI) są przypisywane przez klienta, a POST do tworzenia zasobów, których nazwy są przypisywane przez serwer, jest ważny. Dyskusje na ten temat można znaleźć w Richardson i Ruby's Restful Web Services (O'Reilly).
Jim Ferrans
9
A ponieważ przeglądarki PUT i DELETE nie są jeszcze obsługiwane przez przeglądarkę internetową, uważane jest za „przeciążenie testu POST” poprzez dodanie argumentu ciągu zapytania, takiego jak metoda = PUT lub metoda = DELETE w wysyłanym URI.
Jim Ferrans
2
Ładne analizy jcalcote.wordpress.com/2008/10/16/…
Boris Iwanow
13
@JimFerrans PUT i DELETE są obsługiwane przez przeglądarki internetowe w porządku, z XHR. Jednak w kontekście formularzy HTML specyfikacja HTML nie obsługuje ich, więc przeglądarki też nie mogą.
lodów
3
Chociaż nie jest to kanoniczne mapowanie na literę w CRUD, wiele frameworków REST używa również GET / entity / do Listowania encji typu encja . GET / entity / id odczyta konkretną jednostkę pasującą do identyfikatora .
Toddius Zho
49

Cały klucz polega na tym, czy robisz idempotentną zmianę, czy nie. Oznacza to, że jeśli dwukrotne podjęcie działania w związku z wiadomością spowoduje, że pojawi się „ta sama” rzecz, tak jakby to było zrobione tylko raz, masz idempotentną zmianę i powinna być odwzorowana na PUT. Jeśli nie, mapuje na POST. Jeśli nigdy nie zezwalasz klientowi na syntezowanie adresów URL, PUT jest bardzo blisko aktualizacji, a POST może sobie poradzić z funkcją Utwórz, ale z pewnością nie jest to jedyny sposób, aby to zrobić; jeśli klient wie, że chce tworzyć /foo/abci wie, jakie treści tam umieścić, działa dobrze jako PUT.

Kanoniczny opis POST ma miejsce, gdy zobowiązujesz się do zakupu: jest to akcja, której nikt nie chce powtarzać, nie wiedząc o tym. Dla kontrastu, wcześniejsze ustawienie adresu wysyłki dla zamówienia może być wykonane za pomocą PUT w porządku: nie ma znaczenia, czy ktoś poleci ci wysłać go 6 Anywhere Dr, Nowherevilleraz, dwa lub sto razy: wciąż jest to ten sam adres. Czy to oznacza, że ​​jest to aktualizacja? Może być… Wszystko zależy od tego, jak chcesz napisać zaplecze. (Pamiętaj, że wyniki mogą nie być identyczne: możesz zgłosić użytkownikowi, kiedy ostatnio zrobił PUT jako część reprezentacji zasobu, co zapewni, że powtarzane PUT nie spowodują identycznego wyniku, ale wynik nadal będzie być „tym samym” w sensie funkcjonalnym).

Donal Fellows
źródło
1
To rozróżnienie między przypadkami użycia POSTi PUTjest interesujące i powinno dać odpowiedź na pytanie „Co to jest„ tworzyć ”, a które„ aktualizować ”? o wiele jaśniej. Ponadto, w odniesieniu do implementacji interfejsu API, wynikałoby z tego, że powtarzalność PUTpowinna POSToznaczać cichy brak operacji , podczas gdy powtarzalność może zgłosić wyjątek, jeśli jakiś aspekt wysyłanych danych ma pozostać unikalny w magazynie danych popiera aplikację.
zerobandwidth
2
Ta odpowiedź i następujący komentarz podnoszą ważną kwestię, że należy zachować ostrożność przy porównywaniu CRUD do ścisłej (1 do 1) semantyki HTTP REST. To nie jest mapowanie kanoniczne.
Martin Spamer,
35

Szukałem tej samej odpowiedzi, oto, co mówi IBM. IBM Link

POST            Creates a new resource.
GET             Retrieves a resource.
PUT             Updates an existing resource.
DELETE          Deletes a resource.
ex0b1t
źródło
10

W tej chwili (2016) najnowszymi czasownikami HTTP są GET, POST, PATCH , PUT i DELETE

Przegląd

  • HTTP GET - SELECT / Request
  • PUT HTTP - AKTUALIZACJA
  • POST HTTP - WSTAW / Utwórz
  • PATCH HTTP - Kiedy PUT ting pełna reprezentacja zasobów jest uciążliwa i wykorzystuje więcej pasma, np .: gdy trzeba częściowo zaktualizować kolumnę
  • HTTP DELETE - DELETE

Mam nadzieję że to pomoże!

Jeśli jesteś zainteresowany projektowaniem interfejsów API REST, jest to lektura dla ansewome! strona internetowa wersja online repozytorium github

d1jhoni1b
źródło
1
Począwszy od lutego 1818, należy pamiętać, że PATCH nie jest dokładnie zaimplementowany w bibliotekach klientów i serwerów.
Dizzley,
o ok, dzięki, rozumiem ... czy mógłbyś zamieścić link / referencję, abym mógł zajrzeć, proszę?
d1jhoni1b
9

Jest świetna rozmowa wideo z YouTube na Stormpath z faktycznym wyjaśnieniem tego, URL powinien przejść do właściwej części filmu:

burza wideo youtube

Warto również obejrzeć ponad godzinę rozmowy, ale bardzo ciekawe, jeśli myślisz o zainwestowaniu czasu w budowę interfejsu API REST.

mięsisty
źródło
7

To zależy od konkretnej sytuacji .. ale ogólnie:

PUT = zaktualizuj lub zmień konkretny zasób za pomocą konkretnego identyfikatora URI zasobu.

POST = utwórz nowy zasób pod źródłem danego URI.

To znaczy

Edytuj post na blogu:

PUT: / blog / entry / 1

Utwórz nowy:

POST: / blog / entry

PUT może utworzyć nowy zasób w niektórych okolicznościach, w których identyfikator URI nowego zasobu jest czysty przed żądaniem. POST może być również użyty do zaimplementowania kilku innych przypadków użycia, które nie są objęte innymi (GET, PUT, DELETE, HEAD, OPCJE)

Ogólne zrozumienie dla systemów CRUD to GET = żądanie, POST = tworzenie, Put = aktualizacja, DELETE = usuwanie

Oblepiony
źródło
4

Elementy składowe REST to głównie zasoby (i URI) i hipermedia. W tym kontekście GETjest sposobem na uzyskanie reprezentacji zasobu (który może być faktycznie odwzorowany naSELECT CRUD).

Jednak niekoniecznie należy się spodziewać mapowania jeden na jeden między operacjami CRUD a czasownikami HTTP. Główna różnica między PUTi POSTdotyczy ich idempotentnej właściwości. POSTjest również częściej używany do częściowych aktualizacji, jakPUT generalnie oznacza to wysłanie pełnej nowej reprezentacji zasobu.

Sugerowałbym przeczytanie tego:

Specyfikacja HTTP jest również użytecznym odniesieniem:

Metoda PUT żąda, aby zamknięta jednostka była przechowywana pod dostarczonym URI żądania.

[...]

Podstawowa różnica między żądaniami POST i PUT znajduje odzwierciedlenie w innym znaczeniu URI żądania. Identyfikator URI w żądaniu POST identyfikuje zasób, który będzie obsługiwał zamknięty obiekt. Ten zasób może być procesem akceptującym dane, bramą do innego protokołu lub osobnym podmiotem, który przyjmuje adnotacje. W przeciwieństwie do tego, URI w żądaniu PUT identyfikuje encję dołączoną do żądania - agent użytkownika wie, jaki jest URI, a serwer NIE MOŻE próbować zastosować żądania do jakiegoś innego zasobu. Jeśli serwer chce zastosować żądanie do innego identyfikatora URI,

Bruno
źródło
3

Ogólnie mówiąc, używam tego wzoru:

  • HTTP GET - SELECT / Request
  • PUT HTTP - AKTUALIZACJA
  • POST HTTP - WSTAW / Utwórz
  • HTTP DELETE - DELETE
AJ
źródło
5
PUT i POST nie pasują dokładnie do aktualizacji ani do tworzenia; PUT jest „ustawiony” (tzn. Tam, gdzie znasz nazwę zasobu i podajesz wartość do użycia), a POST to wszystko inne. Kluczem jest zastanowienie się, czy to, co robisz, jest idempotentne, czy nie.
Donal Fellows
1
+1 w komentarzu. Założenie bezwzględnego odwzorowania między nimi może być mylące. Na przykład operacja DELETE HTTP dla niektórych identyfikatorów URI może na przykład zmodyfikować (tj. UPDATE) rekord po stronie serwera, aby operacja HTTP GET na nie zwracała już reprezentacji.
stoisko
4
PUT i POST nie pasują dokładnie do Aktualizuj lub Utwórz . To prawda, ale AJ opisał, co wzorzec on używa.
Piotr Dobrogost
1

Projekt Symfony próbuje połączyć metody HTTP z metodami CRUD, a ich lista kojarzy je w następujący sposób:

  • POBIERZ Pobierz zasób z serwera
  • POST Utwórz zasób na serwerze
  • PUT Zaktualizuj zasób na serwerze
  • USUŃ Usuń zasób z serwera

Warto zauważyć, że, jak mówią na tej stronie: „W rzeczywistości wiele współczesnych przeglądarek nie obsługuje metod PUT i DELETE”.

Z tego co pamiętam, Symfony „fałszuje” PUT i DELETE dla przeglądarek, które nie obsługują ich podczas generowania formularzy, aby starać się być tak blisko korzystania z teoretycznie poprawnej metody HTTP, nawet jeśli przeglądarka nie obsługuje to.

Matt Gibson
źródło