Mam pytanie dotyczące sposobu projektowania URI zasobu z kluczami złożonymi.REST - jak zaprojektować URI z kluczami kompozytowymi?
Mam zasób o nazwie fracht, który ma 4 klucze/identyfikatory: identyfikator partnera, początkowy kod pocztowy, końcowy kod pocztowy i wagę.
Właściwie mój zasób został zaprojektowany, aby mieć przyrostową identyfikator generowany przez bazę danych, ale takie podejście nie jest tak dobry dla konsumentów API, na przykład jeżeli konsument/partnerem musi zaktualizować informacje towarowego mają robić:
?GET towarowy initialZipcode = {value} & finalZipcode = {value} & waga = {value}
odpowiedź operacji powyżej byłby ID ładunki, więc w końcu można je zaktualizować informacje:
PUT ładunek/{ID}
Identyfikator partnera jest niejawny w mechanizmie uwierzytelniania.
Wydaje mi się dziwne, że partnerzy muszą uzyskać identyfikator ładunku przed zaktualizowaniem informacji.
Moje pytanie brzmi: jak zaprojektować ten identyfikator URI?
PUT towarowy/initialZipcode/{value}/finalZipCode/{value}/waga/{value}
Czy ja rozważyć zaprojektowanie powyżej?
Kolejne pytanie: czy dobrą praktyką jest umieszczanie identyfikatora partnera w mechanizmie uwierzytelniania? Znam plusy (łatwe dla konsumentów) i minusy (pamięć podręczna, niemożność udostępnienia URI itp.), Ale nie wiem, czy ogólnie jest to dobra czy zła praktyka.
Dzięki!
Witaj Darrel, dziękuję za odpowiedź. Dla mnie Twoje (pierwsze) podejście wydaje się dziwne, ponieważ zawsze używam pojęcia ID, którego używam nie jako parametru zapytania, tak jak pokazałeś. Dla mnie parametry zapytania określają dodatkowe opcje w konkretnym zasobie, takie jak: filtrowanie, wyszukiwanie, sortowanie, paginacja itp. Mam inne przypadki w moim API, aby zaktualizować zasób i we wszystkich tych przypadkach użyłem ID w URI (parametr ścieżki), więc jeśli mam inny przypadek, w którym aktualizacja ma parametry, mam wrażenie, że ranię koncepcję zunifikowanego interfejsu. Myliłem się? – Krock
@Krock RFC 3986 stwierdza, że parametry zapytania są częścią identyfikacji zasobu. Nie są to dodatkowe metadane. Było to wyjaśnienie z poprzedniej wersji specyfikacji URI. http://tools.ietf.org/html/rfc3986#section-3.4 Klient powinien traktować cały identyfikator URI jako nieprzejrzysty identyfikator. –
Przekonałeś mnie :) Ale w przypadku tworzenia nowego ładunku? Jak mogę zwrócić odpowiedź? W przypadku identyfikatora odpowiedzią będzie "Lokalizacja" dla frachtu, który został utworzony (np. Fracht/identyfikator), ale jeśli nie mam identyfikatora, jaka jest odpowiedź? Lokalizacja do ładunku? InitialZipcode = {VALUE} & finalZipcode = {VALUE} i waga = {WARTOŚĆ}? – Krock