Mam pytanie związane z projektowaniem adresu URL REST. Znalazłem kilka odpowiednich postów tutaj: Różne reprezentacje RESTful tego samego zasobu i tutaj: URL RESTful do zasobu GET według różnych pól, ale odpowiedzi nie są do końca jasne, jakie są najlepsze praktyki i dlaczego. Oto przykład.
Mam adresy URL REST do reprezentowania zasobów „użytkowników”. Mogę OTRZYMAĆ użytkownika z identyfikatorem lub adresem e-mail, ale reprezentacja adresu URL pozostaje taka sama dla obu. Przeglądając wiele blogów i książek, widzę, że ludzie robili to na wiele różnych sposobów. Na przykład
przeczytaj tę praktykę w książce i gdzieś na stackoverflow (nie mogę znaleźć linku ponownie)
GET /users/id={id}
GET /users/email={email}
przeczytaj tę praktykę na wielu blogach
GET /users/{id}
GET /users/email/{email}
Parametry zapytania są zwykle używane do filtrowania wyników zasobów reprezentowanych przez adres URL, ale widziałem również tę praktykę
GET /users?id={id}
GET /users?email={email}
Moje pytanie brzmi: która spośród wszystkich tych praktyk byłaby najbardziej sensowna dla programistów korzystających z interfejsu API i dlaczego? Uważam, że nie ma żadnych zasad ustalonych w kamieniu, jeśli chodzi o projekty adresów URL REST i konwencje nazewnictwa, ale chciałem tylko wiedzieć, jaką drogę powinienem obrać, aby pomóc programistom lepiej zrozumieć API.
Cała pomoc doceniona!
źródło
Odpowiedzi:
Z mojego doświadczenia
GET /users/{id} GET /users/email/{email}
wynika, że jest to najczęstsze podejście. Spodziewałbym się również, że metody zwrócą błąd 404 Not Found, jeśli użytkownik nie istnieje z podanymid
lubemail
. Nie zdziwiłbym sięGET /users/id/{id}
również (choć moim zdaniem jest to zbędne).Komentarze na temat innych podejść
GET /users/id={id} GET /users/email={email}
GET /users?id={id} GET /users?email={email}
id
iemail
(np.GET /users?id={id}&email={email}
)? Jeśli nie, nie użyłbym takiej metody z jednym zasobem.id
,email
że wśród parametrów będzie znajdować się jakikolwiek unikalny identyfikator. Na przykład:GET /users?status=BANNED
może zwrócić listę zablokowanych użytkowników.Sprawdź tę odpowiedź z pokrewnego pytania.
źródło
/users/id/{id}
, pozwala to na rozszerzoną funkcjonalność, po prostu pozwala na dostęp do jednego zasobu za pomocą kilku identyfikatorów (id, guid, name). również odpowiedział tutajGET /user/1234
a nieGET /users/123
Patrząc na to pragmatycznie, masz zbiór użytkowników:
/users # this returns many
Każdy użytkownik ma dedykowaną lokalizację zasobów:
/users/{id} # this returns one
Masz również kilka sposobów wyszukiwania użytkowników:
/users?email={email} /users?name=*bob*
Ponieważ są to wszystkie parametry zapytania do / users, wszystkie powinny zwracać listy ... nawet jeśli jest to lista 1.
Napisałem tutaj wpis na blogu o pragmatycznym projekcie RESTful API, który mówi o tym między innymi tutaj: http://www.vinaysahni.com/best-practices-for-a-pragmatic-restful-api
źródło
O zasobach użytkowników
na ścieżce
/users
zawsze otrzymasz zbiór zwróconych zasobów użytkownika.na ścieżce
/users/[user_id]
możesz spodziewać się kilku rzeczy:Każdy singleton jest jednoznacznie identyfikowany przez swoją ścieżkę i identyfikator, których używasz do znajdowania zasobu. Nie jest możliwe użycie kilku ścieżek dla singletona.
Możesz zapytać o ścieżkę za
/users
pomocą parametrów zapytania (GET
Parametry). Spowoduje to zwrócenie kolekcji z użytkownikami spełniającymi żądane kryteria. Zwracana kolekcja powinna zawierać zasoby użytkownika, wszystkie wraz z ich identyfikującą ścieżką zasobów w odpowiedzi.Parametrami może być dowolne pole obecne w zasobach kolekcji;
firstName
,lastName
,id
O e-mailu
Wiadomość e-mail może być zasobem lub właściwością / polem zasobu użytkownika.
- E-mail jako własność użytkownika:
Jeśli pole jest własnością użytkownika, odpowiedź użytkownika wyglądałaby mniej więcej tak:
{ id: 1, firstName: 'John' lastName: 'Doe' email: '[email protected]' ... }
Oznacza to, że nie ma specjalnego punktu końcowego na e-maile, ale można teraz znaleźć użytkownika przez jego elektroniczną wysyłając następującą prośbę:
/[email protected]
. Który (zakładając, że e-maile są unikalne dla użytkowników) zwróciłby kolekcję z jednym elementem użytkownika, który pasuje do e-maila.- E-mail jako zasób:
Ale jeśli e-maile od użytkowników są również zasobami. Następnie możesz stworzyć API, które
/users/[user_id]/emails
zwraca kolekcję adresów e-mail dla użytkownika o identyfikatorzeuser_id
./users/[user_id]/emails/[email_id]
zwraca e-mail użytkownika z user_id i ['email_id']. To, czego użyjesz jako identyfikatora, zależy od Ciebie, ale trzymałbym się liczby całkowitej. Możesz usunąć wiadomość e-mail od użytkownika, wysyłającDELETE
żądanie na ścieżkę identyfikującą wiadomość e-mail, którą chcesz usunąć. Na przykład,DELETE
on/users/[user_id]/emails/[email_id]
usunie e-mail z email_id, którego właścicielem jest użytkownik z user_id. Najprawdopodobniej tylko ten użytkownik może wykonać tę operację usuwania. Inni użytkownicy otrzymają odpowiedź 401.Jeśli użytkownik może mieć tylko jeden adres e-mail, możesz go trzymać.
/users/[user_id]/email
Spowoduje to zwrócenie pojedynczego zasobu. Użytkownik może zaktualizować swój adresPUT
e-mail, wprowadzając adres e-mail pod tym adresem URL.źródło