Mam stronę internetową w formacie kreatora. Przycisk przesłania do interfejsu API będzie w 4 kroku kreatora. Jednak chcę, aby wprowadzone dane były przechowywane w bazie danych przed przejściem do następnego kroku w kreatorze. Chcę również, aby interfejs API REST działał dla stron posiadających jedną kartę.
Dlatego zaprojektowałem interfejs API, aby podejmował parametr zapytania action = szkic lub przesłanie. Jeśli działanie jest robocze, tylko niektóre pola są obowiązkowe. W przypadku przesłania akcji wszystkie pola są obowiązkowe. Sprawdzanie poprawności w warstwie usług interfejsu API REST zostanie wykonane na podstawie parametru zapytania. Wygląda na to, że muszę wyraźnie określić klauzule if / else w dokumentacji. Czy jest to akceptowalna forma projektu RESTful? Jaki byłby najlepszy projekt z tymi wymaganiami?
Odpowiedzi:
Ponieważ chcesz zachować rzeczy na serwerze między krokami kreatora, wydaje się całkowicie akceptowalne uznanie każdego kroku za osobny zasób. Coś w tym stylu:
Uwzględniając w odpowiedzi linki hipermedialne, możesz poinformować klienta, co może zrobić po tym kroku - przejdź do przodu lub do tyłu, aby przejść do kroków pośrednich, a nic do ostatniego kroku. Przykład tego można zobaczyć na rycinie 5 tutaj .
źródło
in_progress
lubdraft
.Jakiś czas temu musiałem zrobić coś podobnego, a poniżej opisano, z czym skończymy.
Mamy dwie tabele, Item i UnfinishedItem. Gdy użytkownik wypełni dane za pomocą kreatora, dane są zapisywane w tabeli UnfinishedItem. Na każdym kroku kreatora serwer sprawdza poprawność danych wprowadzonych podczas tego kroku. Gdy użytkownik zakończy pracę z kreatorem, kreator wyświetla ukryty / dostępny tylko do odczytu formularz na stronie z potwierdzeniem, który pokazuje wszystkie dane, które należy przesłać. Użytkownik może przejrzeć tę stronę i wrócić do odpowiedniego kroku, aby naprawić błędy. Gdy użytkownik będzie zadowolony ze swoich wpisów, kliknie przycisk Prześlij, a następnie kreator prześle wszystkie dane w polach formularza ukrytego / tylko do odczytu do serwera API. Gdy serwer API przetwarza to żądanie, ponownie uruchamia wszystkie weryfikacje wykonane na każdym etapie kreatora i wykonuje dodatkowe weryfikacje, które nie pasują do poszczególnych kroków (np. Globalne weryfikacje, kosztowne weryfikacje).
Zalety dwóch tabel:
w bazie danych możesz mieć ściślejsze ograniczenia w tabeli przedmiotów niż w tabeli UnfinishedItem; nie musisz mieć opcjonalnych kolumn, które będą wymagane po zakończeniu pracy kreatora.
Zagregowane zapytania dotyczące gotowych elementów do raportowania są łatwiejsze, ponieważ nie trzeba pamiętać o wykluczeniu elementów niedokończonych. W naszym przypadku nigdy nie musieliśmy wykonywać zapytań zbiorczych między Przedmiotem a Niedokończonym Elementem, więc nie stanowi to problemu.
Wada:
Inne możliwości, które rozważałem i dlaczego nie poszliśmy z nimi:
źródło
if
wyciągów sprawdzających status wersji roboczej w trakcie sprawdzania poprawności, co byłoby po prostu niedobre. Chociaż niektóre bardzo wyrafinowane frameworki, takie jak Ruby on Rails, mogą znacznie uprościć ten problem, jeśli zostaną poprawnie zaimplementowane.Zaimplementowałem to w sposób podobny do mieszanki rozwiązań @ guillauma31 i @Lie Ryan.
Oto kluczowe pojęcia:
/users/:id_user/profile/step_1
,.../step_2
itp).../profile/confirm
. Ten zasób nie musi ponownie odbierać wszystkich danych. Zaznacza tylko dane jako poprawne i kompletne.Front-faceci muszą zająć się tokenami, aby uruchomić przepływ czarodzieja w tę iz powrotem.
Interfejs API jest bezstanowy i atomowy.
Aby „kreator działający w jednym kroku” działał z tą konfiguracją, musiałbyś zmienić niektóre rzeczy, takie jak usunięcie przepływu tokena lub utworzenie zasobu, który zwróci tokeny na podstawie typu kreatora, lub nawet utworzenie nowego zasobu tylko w celu wypełnienia tego konkretnego singla kreator kroków (jak
PUT /users/:id_user/profile/
).źródło