S3 REST API i metoda POST

Używam AWS S3 REST API i po rozwiązaniu kilku irytujących problemów z podpisaniem wydaje się działać. Jednak kiedy używam poprawnego czasownika REST do tworzenia zasobu, a mianowicie POST, otrzymuję 405 method not allowed. To samo żądanie działa dobrze z metodą PUT i tworzy zasób.

Czy robię coś nie tak, czy AWS S3 REST API nie jest w pełni zgodny z REST?

Author: Pedro Werneck, 2013-11-07

4 answers

Tak, mylisz siÄ™ w mapowaniu CRUD do metod HTTP.

Pomimo popularnego użycia i powszechnego nieporozumienia, w tym wysoko ocenianych odpowiedzi tutaj na Stack Overflow, POST nie jest "poprawną metodą tworzenia zasobów". Semantyka innych metod jest określona przez protokół HTTP, ale semantyka POST jest określona przez sam docelowy typ nośnika. POST jest metodą używaną do każdej operacji, która nie jest standaryzowana przez HTTP, więc może być używana do tworzenia, ale może również być używane do aktualizacji lub czegokolwiek innego, czego nie zrobiono jeszcze inną metodą. Na przykład, źle jest używać POST do pobierania, ponieważ masz się do tego standaryzowane, ale dobrze jest używać POST do tworzenia zasobu, gdy klient nie może użyć PUT z jakiegoś powodu.

W ten sam sposób, PUT nie jest "poprawną metodą aktualizacji zasobu". PUT jest metodą używaną do całkowitego zastąpienia zasobu, ignorując jego aktualny stan. Możesz użyć PUT do tworzenia, jeśli masz cały reprezentacji, której oczekuje serwer, i możesz użyć PUT do aktualizacji, jeśli zapewnisz pełną reprezentację, w tym części, których nie zmienisz, ale nie jest poprawne używanie PUT do częściowych aktualizacji, ponieważ prosisz serwer o uwzględnienie bieżącego stanu zasobu. PATCH jest metodą, aby to zrobić.

W języku nieformalnym, co każda metoda mówi do serwera to:

  • POST : Weź te dane i zastosuj je do zasobu zidentyfikowanego przez dany URI, zgodnie z zasadami, które udokumentowaÅ‚eÅ› dla typu noÅ›nika zasobów.

  • UmieĹ "ciÄ ‡ : zastÄ ... piÄ ‡ to co jest identyfikowane przez dany URI tymi danymi, ignorujÄ ... c to co Juĺľ tam jest, jeĹ" li cokolwiek tam jest.

  • PATCH: jeÅ›li zasób zidentyfikowany przez podany URI nadal ma ten sam stan, jaki miaÅ‚ przy ostatnim sprawdzaniu, Zastosuj do niego to rozróżnienie.

Zauważ, że create lub update nie jest wspomniane i nie jest częścią semantyki tych metody. Możesz tworzyć za pomocą POST I PUT, ale nie PATCH, ponieważ zależy to od aktualnego stanu. Możesz aktualizować dowolną z nich, ale z patchem masz aktualizację warunkową do stanu, z którego chcesz aktualizować, z PUT możesz aktualizować zastępując cały obiekt, więc jest to operacja idempotentna, a z postem prosisz serwer, aby zrobił to zgodnie z predefiniowanymi regułami.

Przy okazji, Nie wiem, czy sensowne jest mówienie, że API jest LUB NIE JEST zgodne z REST, ponieważ REST jest Architektura styl , nie spec czy standard, ale nawet biorąc pod uwagę, że bardzo niewiele API, które twierdzą, że są odpoczynkiem, jest naprawdę spokojnych, w większości przypadków, ponieważ nie są hipertekstem napędzanym {34]}. AWS S3 zdecydowanie nie jest RESTful, chociaż gdzie to nosi na twoje pytanie, ich użycie metod HTTP jest zgodne ze standardem HTTP przez większość czasu.

 245
Author: Pedro Werneck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 06:34:03
+--------------------------------------+---------------------+
|                 POST                 |         PUT         |
+--------------------------------------+---------------------+
| Neither safe nor idempotent Ex: x++; | Idempotent Ex: x=1; |
+--------------------------------------+---------------------+
 11
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-30 00:23:03

Aby dodać do @Nicholos

Z http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

POST:

Opublikowany podmiot jest podporządkowany URI w taki sam sposób, jak plik jest podporządkowany katalogowi zawierającemu go, artykuł jest podporządkowane grupie dyskusyjnej, do której jest zamieszczany, lub rekord jest subject to a database

Akcja wykonana metodą POST może nie spowodować powstania zasobu to może być zidentyfikowany przez URI. W tym przypadku albo 200 (OK) albo 204 (Brak treści) jest odpowiednim statusem odpowiedzi, w zależności od tego, czy or not the response includes an entity that describing the result

Jeśli zasób został utworzony na serwerze źródłowym, odpowiedź SHOULD be 201 (Created)

PUT:

Metoda PUT wymaga, aby zamknięty podmiot był przechowywany pod dostarczone zapytanie-URI. Jeśli Request-URI odnosi się do już istniejące zasobu, zamknięty podmiot należy uznać za zmodyfikowany wersja tej, która znajduje się na serwerze origin. Jeśli wniosek-URI nie wskazuje na istniejący zasób, a że URI jest w stanie jest zdefiniowany jako nowy zasób przez żądającego agenta użytkownika, serwer origin może utworzyć zasób z tym URI. Jeśli nowy zasób jest tworzony, serwer origin musi poinformować agenta użytkownika za pośrednictwem 201 (Created) response. Jeśli istniejący zasób zostanie zmodyfikowany, albo 200 (OK) lub 204 (Brak treści) kody odpowiedzi należy przesłać w celu wskazania pomyślne wypełnienie wniosku

IMO PUT może być używany do tworzenia lub modyfikowania/zastępowania zamkniętego podmiotu.

 4
Author: Ram Bavireddi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-12 23:30:21

W oryginalnej specyfikacji HTTP , zasób podany w ładunku żądania POST jest "uważany za podporządkowany podanemu obiektowi" (tj. URL żądania). TimBL powiedział wcześniej (nie może znaleźć referencji), że był wzorowany na identycznie nazwanej metodzie w NNTP.

 3
Author: Nicholas Shanks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 13:50:41