Jaki endpoint dla takiego przypadku

0

Hej, pytanie nie tylko do Javy
Zastanawia mnie jaki endpoint zrobić dla danego przypadku:

Jedno województwo może mieć wiele miast (ma listę miast), każde miasto należy do maks. jednego województwa.
Chcę aby endpoint pozwalał mi kasować jedno miasto z listy, oraz dodawać jedno miasto do listy (jeśli jeszcze nie ma)

Moje pomysły:

a)

Post, voivodeships/{id}/add-city, w ciele Posta json o strukturze (wartości przykładowe):
{
    voivodeship_id: 3,
    city_id: 4
}
Post, voivodeships/{id}/delete-city, w ciele Posta json o strukturze (wartości przykładowe):
{
    voivodeship_id: 3,
    city_id: 4
}

b)

Post, voivodeships/{id}/add-city, w ciele Posta json o strukturze (wartości przykładowe):
{
    city_id: 4
}

Post, voivodeships/{id}/delete-city, w ciele Posta json o strukturze (wartości przykładowe):
{
    city_id: 4
}

c)

Put, voivodeships/{id}, w ciele cały obiekt ze zaktualizować listą (chyba głupi pomysł)

d)

Post, voivodeships/{id}/add-city, jako query param city_id
Post, voivodeships/{id}/delete-city, jako query param city_id

e)

Post, voivodeships/{id}/add-city/{city_id}
Post, voivodeships/{id}/delete-city/{city_id}

Przepraszam jeśli głupie pytanie, ale mam 15 lat :(

6

Robiąc REST masz więcej metod http niż POST

GET - pobierz
POST - dodaj
PUT - zastąp
DELETE - usuń

Czyli wszystkie przykłady źle :)

Ja bym zrobił tak:
Dodawanie:

POST /cities

{
  "voivodeship": "Mazowieckie",
  "city": "Warszawa"
}

Zwrotka, to Id dodanego miasta.

Usuwanie:

DELETE /cidies/{cityId}

Pobieranie listy:

GET /cities

pobieranie jednego:

GET /cities/{cityId}
0

Dzięki bardzo za odpowiedź :)
Chyba się bardzo źle wyraziłem - nigdzie nie napisałem, że nie chcę mieć GET cities, POST cities itd.

Chcę mieć tylko możliwość dodania miasta do listy województwa, usunięcia miasta z listy danego województwa, pobrania listy miast w danych województwie (np. samych miast jako getAll() nie da się pobrać)
W sensie, że nie będzie edpointa dla samych miast, zawsze jest nad nimi to nadrzędne województwo

1
aspirujące_dzieciak napisał(a):

Chyba się bardzo źle wyraziłem - nigdzie nie napisałem, że nie chcę mieć GET cities, POST cities itd.

Czyli kwadraturnik kolowy.
Zapewniam cię że koło ma idealny kształt dla swego przeznaczenia, ten kto go wymyślił zbadał/sprawdził/wyeksperymentował wszystkie pozostałe kształty, owszem możesz próbować wymyślić kwadratowe koło, zaś zapewniam cię że twoje wysiłki w tym kierunku spełzną na niczym.

0

Kliniczny, klasyczny przykład, jak ubogi *) standard (REST) sobie wybraliśmy, i umocniliśmy monokulturę, jak całe kraje pokryte kukurydzą czy bananem. A zdanie krytyczne można wypowiedzieć jak na Węgrzech czy na Białorusi.

W czystym REST awykonalne, dwie listy (nawet gdyby dało się elegancko napisać "wyjmij element 17 z listy bez jego zniszczenia") to są dwa niezależne stany, nigdy w tej samej transakcji, prawo co cachowania itd...

Lekarstwo by było - i programiści przed epoką REST by nie mieli z tym najmniejszych problemów, byłby "czasownik", np jakiś swap. Każda forma np RPC, który wtedy znali, by bezproblemowo umożliwiła to zakodować.

Można wyjść zgwałconym RESTem, np
POST .../operations/swap/ { id atomu (miasta), list1 (wojewqództwo1), list2 (wojewqództwo2) }

*) nie chcę powiedzieć, że REST jest dziadowski, diabelski itd ... ale że jest skrajnie (żałośnie) prosty, w prostych przypadkach typu "crud" pasujący idealnie, ale generalnie jest cofnięciem się poniżej tego, co w branży posiadaliśmy

1
aspirujące_dzieciak napisał(a):

Jedno województwo może mieć wiele miast (ma listę miast), każde miasto należy do maks. jednego województwa.

Wracając do merytoryki, mało szczęśliwy przykład. Przydział miast do województw jest tak bardzo stabilną daną, trzyma się kilkadziesiąt lat (w porządnych krajach setki lat).

Z rzadka rozporządzeniem RM pojawi się nowe miasto, albo jakies będa łączone.
Aktualnie jest wojna (o pieniądze) w/s przesunięcia granicy gminy w okolicy Bełchatowa.

ZrobieDobrze napisał(a):

Każda forma np RPC, który wtedy znali, by bezproblemowo umożliwiła to zakodować.

Współczesnym RPC można określić Apache Thrift, Google gRPC

Inne uznawane protokoły, to szerszy (niż REST) w funkcjonalności GraphQL, choć odnoszę się do niego z zaciekawieniem, nie uważam się za specjalistę.

0

@aspirujące_dzieciak: Zawsze możesz sobie zrobić tak:

PUT /cities/Bialystok
{
  "name":"Bialystok"
  "voivodeship":"mazowieckie"
}

i pobierać:
GET /cities?voivodeship=mazowieckie

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.