Pracuję nad zaprojektowaniem interfejsu API RESTful. Wiemy, że chcemy zwrócić JSON i XML dla dowolnego zasobu. Myślałem, że zrobimy coś takiego:
GET /api/something?param1=value1
Accept: application/xml (or application/json)
Jednak ktoś rzucił do tego celu rozszerzenia, na przykład:
GET /api/something.xml?parm1=value1 (or /api/something.json?param1=value1)
Jakie są kompromisy z tymi podejściami? Czy najlepiej jest polegać na nagłówku akceptującym, gdy rozszerzenie nie jest określone, ale czy rozszerzyć rozszerzenia, jeśli są określone? Czy to podejście ma wadę?
architecture
web-services
rest
http
Brandon Linton
źródło
źródło
Odpowiedzi:
To „Jednak filozoficznie - pierwsze podejście jest jedynym podejściem”, a to „Właściwe oficjalne podejście RESTful polega na użyciu nagłówka Accept:”. są powszechnie postrzegane jako przypadek, ale są również absolutnie niepoprawne .
Oto krótki fragment Roy'a Fieldinga (który zdefiniował REST) ...
„sekcja 6.2.1 nie mówi, że należy zawsze korzystać z negocjacji treści.” cytować
Ta szczególna rozmowa jest w kontekście nagłówka „Accept-Language:”, ale to samo dotyczy nagłówka „Accept:”, jak wyjaśniono później w jego odpowiedzi ...
„Nie mam pojęcia, dlaczego ludzie nie widzą drugiego i trzeciego linku na górnej stronie
http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm
wskazują na dwie wersje PDF ”.
Ma na myśli to, że nie ma problemu z używaniem różnych punktów końcowych dla różnych reprezentacji tych samych danych źródłowych. (W tym przypadku jeden punkt końcowy .html i dwa różne punkty końcowe .pdf.)
Również w podobnej dyskusji, tym razem dotyczącej zalet używania parametrów zapytania w porównaniu do używania rozszerzeń plików dla różnych typów mediów ...
„Dlatego zawsze wolę rozszerzenia. Żaden wybór nie ma nic wspólnego z REST.” cytować
Ponownie, to nieco różni się od Akceptuj kontra rozszerzenia plików, ale postawa Fieldinga jest nadal jasna.
Odpowiedź - to naprawdę nie ma znaczenia. Kompromisy między nimi nie są bardzo znaczące i oba są akceptowalnymi stylami.
źródło
Prawidłowym oficjalnym podejściem RESTful jest użycie
Accept:
nagłówka.Należy jednak uważać, aby nie zepsuć pamięci podręcznej, co jest jednym z wymagań REST. Musisz mieć
Vary: Accept
nagłówek i pamięć podręczną, które to rozumieją. W idealnym świecie miałbyś to, ale w prawdziwym życiu twój wygląd może się różnić. Drugie rozwiązanie nie jest tak czyste, ale może być bardziej praktyczne.Zauważ też, że niektóre bardzo stare przeglądarki ignorowały nagłówki, zamiast tego polegając na rozszerzeniu.
źródło
Technicznie nie ma to większego znaczenia - Twój serwer internetowy będzie mógł poprawnie przetworzyć go tak, jak wygląda. (Zakładam, że to, ale nie wygląda jak showstopper).
Jednak filozoficznie - pierwsze podejście jest jedynym podejściem. W usłudze REST adres URL faktycznie wskazuje tylko identyfikator URI - który jest tylko zasobem. Pomyśl przez chwilę o tym zasobie, który jest taki sam jak obiekt w programowaniu obiektowym. Ty mów do tego zasobu przez zaledwie 4 metod (aka GET / POST / PUT / DELETE -lub jeśli w ogóle, że transport umożliwia), ale ta metoda nie stać opis obiektu. W ten sam sposób aspektami zwracana wartość nie jest identyfikatorem URI. Obiekt jest nadal czymś, a nie czymś. Xml lub czymś.json
Załóżmy, że jeśli nie chcesz używać nagłówka Accept, ale jeśli nadal chcesz filozoficznie naprawdę RESTOWAĆ, nie mam nic przeciwko:
w przeciwieństwie do
Ale jak powiedziałem, ta różnica jest tylko filozoficzna.
źródło
@vartec: Myślę, że się mylisz
Właściwa oficjalna zasada RESTful mówi, że nic nie powinno być ukryte w nagłówkach HTTP, ponieważ jest to URI, który jest ujawniony lub do którego się odwołuje, wszelkie szczegóły dotyczące żądania / odpowiedzi powinny być dostarczone jako część URI
Dlatego zdecydowanie zalecam unikanie używania nagłówka w celu uzyskania szczegółowych informacji na temat żądania i odpowiedzi i trzymaj się tego
Nie jestem w stanie szybko znaleźć referencji, ale odeślemy je z powrotem (faktycznie możesz odnieść się do książki wydawniczej O'reilly „RESTful web services” ( http://shop.oreilly.com/product/9780596529260.do ) co potwierdza to samo
źródło