2012-04-13 13 views
6

obecnie projektujemy wewnętrzny interfejs aplikacji REST. mamy następujący przypadek użycia:Projektowanie interfejsu REST API - sprawdzanie danych poczty - jakie trucizny wybrać?

  1. użytkownika (109) chce, aby przeczytać wiadomość, że został wysłany do innego użytkownika (110)
  2. użytkownikowi odczytu (109) jest znany do aplikacji za pośrednictwem swojego tokena poświadczenia, że ​​otrzymała po uwierzytelnieniu (robiąc żądania GET)
  3. zakładamy w tym przykładzie użytkownik 109 był nadawca i 110 odbiornik

podsumowania z perspektywy użytkowników „dać mi wiadomość, że (109) wysłali do 110 "

następujące URI przyszedł do naszego umysłu, ale nie możemy się zdecydować, który z nich ma:

a) GET http://localhost:9099/api/mails/109?receiverUserId=110 
b) GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110 
c) GET http://localhost:9099/api/mails?receiverUserId=110 
d) GET http://localhost:9099/api/mails/me/to/110 (when logged in as 109 via token credentials we know that "me" is 109) 
f) GET http://localhost:9099/api/mails/109/to/110 (explicit request, e.g. for admins … has to be guarded against illegal access) 

wszystkie linki są „kontekstu”, który wysyła jeden z linków do odbiornika (110) będzie dają różne wyniki, wykonując żądanie GET.

Chciałbym poznać Twoją opinię na temat adresu URL.

każda pomoc wysoko ceniona.

okrzyki Marcel

+0

Po prostu obserwacja: (b) i (d) są identyczne. – ArjunShankar

+0

ah przepraszam, masz rację ;-) – Marcel

+1

Głosuję za. Nie widzę sensu w wskazywaniu użytkownika czytającego, ponieważ jest on znany. (z wyjątkiem buforowania) – njzk2

Odpowiedz

2

Różne reakcje na różnych klientów, dla samym URL jest w porządku.

Stack Exchange Network robi:

GET /me/comments/{toid} 

które udokumentowano here.

Twitter robi to zbyt:

GET /statuses/home_timeline 

która jest udokumentowana here.

Oba te adresy wywnioskują zalogowanego użytkownika na podstawie uwierzytelnienia. Tak, pokonuje buforowanie, jeśli użytkownicy współużytkują pamięć podręczną, ale IMO, to jest w porządku. To, czy złamie ograniczenie "identyfikacji zasobów" w REST, jest prawdopodobnie dyskusyjne. Odpowiedź na pytanie this i kolejny komentarz pokazują mi, dlaczego jest to dyskusyjne.

W rzeczywistości, wśród dostępnych opcji, to zrobić URL wspomnieć, które nie są „kontekstu”:

GET /api/mails?senderUserId=109&receiverUserId=110 

Ten będzie zawsze wrócić wiadomości od 109 do 110. Ale gdy jeden klient chciałby zobacz ten wynik podczas przeglądania "wysłanych" wiadomości, drugi chciałby zobaczyć ten wynik podczas przeglądania "otrzymanych" wiadomości. Coś dziwnego, co? Dodatkowo, na serwerze musisz sprawdzić, czy uwierzytelniony użytkownik ma 109 | 110, czy też wyrzucić 401 UNAUTHORIZED.

pójdę z czymś takim:

GET /mail/sent 

zwraca wszystkie wysłany mail.Oraz:

GET /mail/sent?to=110 (like applying a 'filter' to /mail/sent) 
OR 
GET /mail/sent/110 (clean URL) 

powraca mail wysłany do 110.

+0

dzięki za odpowiedź. Myślę, że wybierzemy jeden z podanych linków. – Marcel

1

"kontekstową" linki są złym pomysłem dla REST API (w szczególności ten utrudnia buforowanie). Jeśli chcesz po prostu użyć HTTP, to jest OK.

Sugerowałbym używanie adresów URL, które nie zależą od bieżącego użytkownika i ograniczają dostęp do nich zgodnie z regułami.

0

Moim zdaniem, trzeba 2 warstwy:

Jednym z nich jest warstwa wewnętrzna, która nie wymaga uwierzytelnienia użytkownika, jest dostępny tylko z komponentów wewnętrznych. Obejmuje API jak

GET http://localhost:9099/api/mails?senderUserId=109&receiverUserId=110

Zaletą tej warstwy jest testowalność, wielokrotnego użycia i cachability.

Druga warstwa to warstwa zewnętrzna, która wymaga uwierzytelnienia użytkownika i jest dostępna od klientów zewnętrznych. Obejmuje interfejsy API, takie jak:

GET http://localhost:9099/api/mails?receiverUserId=110.

Klienci muszą się zalogować, aby uzyskać dane uwierzytelniające tokena, następnie serwer może uzyskać informacje o użytkowniku z tego tokena i odwzorować zewnętrzne wywołanie API na wewnętrzne wywołanie API.

Możesz mieć różne rodzaje metod uwierzytelniania, ale warstwa wewnętrzna nie zostanie zmieniona, wystarczy mapować różne warstwy zewnętrzne do warstwy wewnętrznej.

Powiązane problemy