Jak utworzyć REST API używając Rails 3.0?
Nie mogę znaleźć zbyt wielu informacji na temat różnych podejść do budowania REST API w Rails; więc mam dwa pytania:
- Czy ktoś może wskazać mi jakieś artykuły, które pokazują plusy / minusy różnych podejść?
- czy mógłbyś podzielić się swoimi przemyśleniami na temat zalet / wad następujących podejść?
Proponowane Podejścia
-
Użyj standardowych kontrolerów aby zwrócić XML, gdy użytkownik dodaje
.xml
do końca of the URLplusy:
- jest to wbudowane w Rails i bardzo łatwe w użyciu
- stosuje to samo podejście oparte na zasobach, które ma Rails, więc będzie to łatwe dla
istniejących użytkowników, aby zrozumieć/zapamiętać
wady:
-
Użyj trasowania w przestrzeni nazw, aby utworzyć osobne Kontrolery API, które obsługują tylko API funkcje, ale nadal mają dostęp do tych samych modeli, z których korzysta strona internetowa
plusy:
- API jest w większości oddzielone
- nadal używa kontrolerów resource-full
wady:
- adresy URL mają postać site.com/api/resource.xml które mogą spraw, by ludzie zakładali wszystkie zasoby są dostępne [5]}API jest nadal częścią kodu/projektu strony internetowej; w związku z tym trudniejsze do utrzymania
-
Użyj przekierowania trasy i ograniczeń, aby przesłać wszystkie wywołania API do Szafy Rack zastosowanie
plusy:
- API jest w pełni oddzielone
- nie jest wymagane używanie stylu Resource-full jeśli nie chcemy
- adresy URL wyraźnie pokazują, że jest to API i powinieneś sprawdzić dokumenty, aby zobaczyć co jest dostępne (przynajmniej mój umysł działa w ten sposób; zakładam, że umysły innych dev też tak robią)
wady:
- trudniejsze w użyciu modele z kodu strony
- łatwiej utrzymać jako oddzielny projekt, ale to oznacza trudniejsze do integracji z existing site
- musi synchronizować bazy kodowe, ponieważ modele mogą się zmienić dla funkcji witryny / poprawek błędów
2 answers
Proponuję, aby API znajdujące się w tym samym projekcie co Twoja strona internetowa nie było złe, dopóki kod jest suchy*. Jak zauważyłeś, posiadanie osobnych baz kodowych jest wyzwaniem, ponieważ musisz je synchronizować z każdą funkcją / poprawką błędów. Łatwiej jest je utrzymać, jeśli znajdują się w tym samym miejscu. Tak długo, jak utrzymujesz swój kod suchy, ta metoda jest wyraźnym zwycięzcą.
Oferowałbym XML i JSON ze sterowników z subdomeną obsługiwaną przez silnik routingu Rails. Kiedy ktoś wychwycił wzorzec api.site.com/resource.xml i próbuje uzyskać dostęp do zasobu, którego nie ma, to naprawdę nic wielkiego. Tak długo, jak Twój API jest wyraźnie udokumentowane i nie / błąd wdzięcznie, gdy próbują uzyskać dostęp do zasobu nie w API, powinno być dobrze. Chciałbym spróbować zwrócić wiadomość, że zasób nie jest dostępny i adres url do dokumentacji api. Nie powinno to być problemem dla użytkowników API, ponieważ powinno to być częścią odkrywania twojego API.
Tylko moje $0.02.
*suchy = nie powtarzaj się. Suchy kod oznacza, że nie kopiujesz-wklejasz ani nie przepisujesz tego samego dla swojej witryny i api; wyodrębniasz i dzwonisz z wielu miejsc.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-31 13:58:46
Myślę, że najlepszym rozwiązaniem dla Ciebie jest połączenie dwóch pierwszych punktów.
Sugeruję użycie JSON zamiast XML: jedynym punktem na korzyść XML jest XPath, który jest bezużyteczny w zwracanych danych. JSON prowadzi do lepszego czasu reakcji (i bardziej czytelne dane dla lepszego debugowania ! : p). Ponadto większość języków potrafi czytać JSON. Na przykład, PHP może natywnie parsować JSON do tablicy / obiektu za pomocą json_decode
, więc jest to miły punkt. ;)
Dla kontrolerów, możesz go nazwać, ale nie jest to obowiązek, może lepiej jest w niektórych przypadkach unikać tłustych działań z tonami warunków. Z routerem Rails 3, rozdzielenie wywołań API w subdomenie (api.webapp.com) jest trywialne).
Dla modelu, na pewno należy użyć tego samego, co używane w całej aplikacji.
Nowa składnia routera rails to sugar, będziesz zadowolony. Powodzenia i miłej zabawy! :)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 20:32:43