W DRF mam model Post, który można polubić za pomocą zarejestrowanej w widoku akcji pod url /api/posts/{id}/like/
. Na pewnym discordzie związanym głównie z frontem, zadałem pytanie, co powinno być w response zgodnie z dobrymi praktykami, a koniec końców mój rozmówca nadmienił mi, że w url powinno być /likes
. Wynikła z tego długa dyskusja, bo zamiast to uargumentować, to tylko odpowiadał pytaniem na pytanie, zamiast napisać wprost. Wiem, że zgodnie z zasadami/wzorcem REST, endpoint powinien wskazywać na zasób, a nie czynność, którą wykonuje, ale moje rozumowanie odwołuje się do przykładu akcji z dokumentacji DRF, gdzie jest zarejestrowany endpoint pod takim url http://localhost:8000/api/users/1/set_password
, gdzie endpoint też wskazuje na to, jakie działanie wykonuje. Żeby wyjaśnić sytuację, zadałem to pytanie na oficjalnym discordzie Django i tam też optowali za moim rozwiązaniem. Wiem, że endpoint nie musi być związany z modelem, ale moje rozumowanie do wyglądu tej akcji opiera się na tym, że ten endpoint dodaje lub usuwa rekord w many to many field w modelu Post, a nie odwołuje się do osobnego modelu Like
. Które rozwiązanie jest waszym zdaniem poprawne i dlaczego?
2
1
Nie ma znaczenia. Twój restowy serwis to jeden wielki mutowalny obiekt. To czy wywołanie będzie wyglądać:
obj.set_password(1, "haslo123")
czy
obj.get_user(1).set_password("haslo123")
nie ma większego znaczenia.
Ma znaczenie dopiero, gdy konwencja jaka stosujesz na serwerze pokrywa się z konwencją jaka otrzymujesz w jakimś generycznym kliencie. Wówczas jest mniej pracy, bo opierasz się na ogólnych założeniach.