Projektując interfejs API, postawiliśmy pytanie, czy ładunek PUT powinien zawierać identyfikator aktualizowanego zasobu.
Oto, co obecnie mamy:
PUT /users/123 Payload: {name: "Adrian"}
Nasz kod trasy wyodrębnia identyfikator z identyfikatora URI i kontynuuje aktualizację.
Pierwsi użytkownicy naszego API pytają, dlaczego nie pozwalamy na identyfikatory w ładunku:
PUT /users/123 Payload: {id: 123, name: "Adrian"}
Nie zezwalamy na to, ponieważ identyfikator jest zduplikowany w ładunku i identyfikatorze URI.
Zastanawiając się nad tym, łączymy zasób z identyfikatorem URI.
Jeśli identyfikator URI nie ma identyfikatora, należy zmienić ładunek:
PUT /no/id/here Payload: {name: "Adrian"} < What user???
Czy są jakieś powody, aby tego nie robić?
/users
(nie ma potrzeby dodawania „nowego”).Odpowiedź na to pytanie zależy od tego, czy chcesz pozwolić klientowi na zmianę identyfikatora?
Jeśli klient może zmienić identyfikator za pośrednictwem PUT, wówczas zmieni się identyfikator URI zasobu i należy podać 301 Przeniesiony na stałe za każdym razem, gdy zasób uzyskuje dostęp do starego identyfikatora URI.
Na przykład zaczynasz od zasobu w
a klient PUT umieszcza następujące dane w zasobie
zasób został zaktualizowany, a jego identyfikator URI jest teraz
Location
Pola w odpowiedzi PUT powinien zawierać nowy URI, a jeśli idziesz do/users/123
was powinien dostać301
odpowiedź z pola Lokalizacja wskazując nowego/users/222
zasobu.W większości przypadków tak naprawdę nie chcesz, aby klient mógł zmienić identyfikator, ponieważ może to dość szybko zrobić bałagan. W takim przypadku identyfikator jest czymś, co tylko serwer może zmienić i należy go pozostawić poza organem PUT, ponieważ klient nie może zaktualizować tego stanu.
Powiedzmy, że jeśli umieścisz żądanie do innego identyfikatora URI w tym samym zasobie
to jeśli ten zasób nie istnieje, serwer powinien go utworzyć oraz utworzyć i ID, kiedy to robi
źródło