Używam RESTlet i utworzyłem zasób. Obsługuję POST metodą nadpisywania acceptRepresentation
.
Klient powinien wysłać mi jakieś dane, a następnie przechowuję je w DB, ustawiam odpowiedź na 201 (SUCCESS_CREATED) i muszę zwrócić klientowi niektóre dane, ale typ zwrotu acceptRepresentation
to void
.
W moim przypadku muszę zwrócić jakiś identyfikator, aby klient miał dostęp do tego zasobu.
Na przykład, jeśli mam zasób z adresem URL /resource
i klient wysyła żądanie POST, dodaję nowy wiersz w DB i jego adres powinien być /resource/{id}
. Muszę wysłać {id}
.
czy robię coś źle? Czy zasady REST pozwalają coś zwrócić po POST? Jeśli tak, jak mogę to zrobić, a jeśli nie, jaki jest sposób rozwiązania tej sytuacji?
Odpowiedzi:
REST mówi tylko, że powinieneś dostosować się do jednolitego interfejsu. Innymi słowy, mówi, że powinieneś zrobić to, co powinien zrobić POST, zgodnie ze specyfikacją HTTP . Oto cytat z tej specyfikacji, który jest istotny:
Jak widać z tego, masz dwa miejsca, w których możesz wskazać klientowi, gdzie znajduje się nowo utworzony zasób. Nagłówek lokalizacji powinien mieć adres URL wskazujący na nowy zasób, a także można zwrócić jednostkę ze szczegółami.
Nie jestem pewien, jaka jest różnica między zastępowaniem funkcji acceptRepresentation () a przesłanianiem post (), ale ten przykład pokazuje, jak zwrócić odpowiedź z POST.
źródło
Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
Zrezygnowałbym z wysłania czegokolwiek w treści odpowiedzi. Wystarczy ustawić lokalizację: na (pełny) adres URL nowo utworzonego zasobu.
Twój opis sugeruje, że jest to dokładnie ta semantyka, którą:
Wszystko inne jest zbyteczne.
źródło
Dwa różne pytania:
Czy wzorzec aplikacji REST obsługuje zwracanie danych w POST?
Nie sądzę, by REST wyraźnie tego zabronił, ale preferowane traktowanie jest określone w odpowiedzi Darrela.
Czy struktura RESTlet umożliwia zwracanie danych w POST?
Tak, mimo że zwraca void, w klasie rozszerzającej Resource masz pełny dostęp do obiektu obiektu Response za pośrednictwem metody getResponse (). Możesz więc wywołać metodę getResponse (). SetEntity () z dowolnymi danymi.
źródło
Wypisz go w dowolnym formacie. To może być:
<success> <id>5483</id> </success>
Lub:
{ "type": "success", "id": 5483 }
To zależy od tego, co zwykle robisz. Jeśli nie oczekują danych, powinni je po prostu zignorować, ale każdy klient, który chce właściwie sobie z nimi poradzić, powinien to zrobić.
źródło
Jeśli odpowiesz 201 Created za pomocą treści encji, a nie przekierowania Location, dobrym pomysłem jest dołączenie nagłówka Content-Location wskazującego na zasób, który jest reprezentowany w odpowiedzi.
Pozwoli to uniknąć potencjalnego zamieszania - w którym klient mógłby (słusznie) założyć, że jednostka odpowiedzi faktycznie reprezentuje nowy stan „twórcy”, a nie utworzony zasób.
> POST /collection > ..new item.. < 201 Created < Location: /collection/1354 < Content-Location: /collection/1354 < <div class="item">This is the new item that was created</div>
źródło