Metoda PUT
Metoda PUT służy do zachowania obiektu przekazywanego w treści zapytania pod wskazanym adresem URL.
- W przypadku gdy pod tym adresem istniał już zasób, powinien on zostać nadpisany. Zwracany jest wtedy rezultat 200 (OK) lub 204 (No Content), gdy nastąpiło nadpisanie pustym zbiorem.
- Jeżeli zasób nie istniał, to powinien zostać utworzony pod podanym adresem. Zwracany jest wtedy rezultat 201 (Created)
PUT /article/1234 HTTP/1.1
PUT /article/1234 HTTP/1.1 { "color": "red" }
Gdy metoda PUT zakończy się powodzeniem, wykonanie metody GET dla tego samego adresu powinno zwrócić dokładnie ten sam obiekt jaki był użyty w PUT. Oczywiście tylko wtedy, gdy zasób ten nie został zmodyfikowany w międzyczasie. Warto też wspomnieć, że metoda PUT jest idempotentna, a więc wielokrotne jej wykonanie powinno przynieść identyczny rezultat.
Format treści zapytania PUT powinien być zgodny z typem wiadomości zwracanej przez metodę GET. W odpowiedzi serwer może wysłać nagłówki walidacyjne takie jak ETag i Last-Modified, jeżeli wartość zasobu jest identyczna z wartością wysłaną. PUT może także modyfikować dodatkowe zasoby poza wskazanym adresem, aby na przykład uaktualnić relacje między zasobami.
Różnice pomiędzy PUT i POST
Istnieje kilka podstawowych różnic pomiędzy tymi dwoma metodami:
- Treść zapytania POST może mieć dowolna formę, którą serwer potrafi zinterpretować, podczas gdy w metodzie PUT treść powinna być taka sama jak treść modyfikowanego zasobu.
- Metoda PUT jest idempotentna, ponieważ dotyczy tylko zasobu o konkretnym adresie, a POST może tworzyć zasoby pod kolejnymi adresami.
- PUT zakłada znajomość docelowego adresu zasobu, co jest niemożliwe w przypadku wstawiania rekordu, dla którego zostanie wygenerowany numer id. Natomiast w metodzie POST nie podajemy adresu, gdyż jest on generowany po stworzeniu danego zasobu (patrz przykład poniżej).
Request | Response |
PUT /articles/red-shoe HTTP/1.1 { name: "shoe", color: "red" } |
HTTP/1.1 201 Created Location: /articles/red-shoe |
Request | Response |
POST /articles HTTP/1.1 { name: "shoe", color: "red" } |
HTTP/1.1 201 Created Location: /articles/63636 |
Źródła:
http://tools.ietf.org/html/rfc7231#section-4.3.4