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?

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.


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


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).


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.

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


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.


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


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,


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.