2012-04-17 13 views
5

Czy istnieje metoda RESTULT, aby określić, czy test POST (lub inny niepatentny czasownik) zakończy się pomyślnie? Wydaje się, że jest to przydatne w przypadkach, gdy zasadniczo potrzebujesz wykonać wiele żądań idempotentnych wobec różnych usług, z których każda może zawieść. Byłoby miło, gdyby te wnioski można było wykonać w "transakcji" (tj. Z obsługą wycofywania), ale ponieważ jest to niemożliwe, alternatywą jest sprawdzenie, czy każde z żądań zakończy się sukcesem, zanim faktycznie wykona je.Czy istnieje metoda REST, aby ustalić, czy test POST zakończy się pomyślnie?

Załóżmy na przykład, że buduję system e-commerce, który umożliwia kupowanie koszulek z własnym tekstem, a ten system wymaga integracji z dwiema różnymi usługami: usługą drukowania koszulek i usługą płatności . Każdy z nich ma RESTful API i może się nie udać. (np. drukarnia może odmówić wydrukowania niektórych słów na koszulce, powiedzmy, a bank może złożyć skargę, jeśli karta kredytowa wygasła.) Czy istnieje sposób na spekulatywne wykonanie tych dwóch żądań, więc mój system będzie kontynuował jeś li oba wnioski wydają się ważne?

Jeśli nie, czy ten problem można rozwiązać w inny sposób? Tworzenie zasobu za pomocą POST z i zmienianie tego na status = complete, jeśli wszystkie żądania zakończą się pomyślnie? (DELETE jest bardziej skomplikowany ...)

+0

Inne podejście: 'POST' z' persist = false' lub 'efemeryczna = true'. (Wydaje się nieco odurzający, ale nie wymaga kolejnej zmiany statusu - gdy naprawdę chcesz, aby 'POST' się wydarzył, wydaj to ponownie.) – mjs

Odpowiedz

2

HTTP definiuje kod 202 statusu dokładnie scenariusza:

202 Akceptowane

Żądanie zostało przyjęte do realizacji, ale ich przetwarzanie nie zostało zakończone. Żądanie może, ale nie musi, zostać wykorzystane, ponieważ może być zabronione, gdy przetwarzanie faktycznie ma miejsce. Nie ma możliwości ponownego wysłania kodu statusu z operacji asynchronicznej, takiej jak ta.

Odpowiedź 202 jest celowo niezobowiązująca. Jego celem jest umożliwienie serwerowi zaakceptowania żądania dla innego procesu (być może procesu zorientowanego na partie, który jest uruchamiany tylko raz dziennie) bez konieczności utrzymywania połączenia klienta użytkownika z serwerem do czasu zakończenia procesu. Jednostka zwrócona z tą odpowiedzią POWINNA zawierać wskazanie bieżącego statusu żądania i wskaźnik do monitora statusu lub szacunkową ocenę, kiedy użytkownik może oczekiwać, że żądanie zostanie spełnione.

Źródło: HTTP 1.1 Status Code Definition

ta jest podobna do 201 utworzone, oprócz tego, że jesteś wskazując, że wniosek nie został zakończony, a jednostka nie została jeszcze utworzona. Twoja odpowiedź zawiera URL do zasobu reprezentującego "żądanie zamówienia", dzięki czemu klienci mogą sprawdzić stan zamówienia za pomocą tego adresu URL.


Aby odpowiedzieć na to pytanie bardziej bezpośrednio: Nie ma sposobu na „test”, czy wniosek uda przed wprowadzeniem go, ponieważ prosisz dla jasnowidzenia.

Nie można przewidzieć zakresu problemów technicznych, które mogą wystąpić podczas próby złożenia wniosku w przyszłości. Sieć może być niedostępna, serwer może nie mieć dostępu do swojej bazy danych lub systemów zewnętrznych, od których zależy funkcjonowanie, może nastąpić odcięcie zasilania i serwer jest w trybie offline, bezpańskie neutrino może wejść w twoją pamięć i uderzyć w 0 do 1 powodującego katastrofalny błąd jądra.

Aby skorzystać z usługi zdalnej, należy uwzględnić ewentualne awarie jakichkolwiek żądań w oderwaniu od innych procesów.

Dla twojego konkretnego problemu, jeśli usługi nie mają żadnego bezpieczeństwa transakcyjnego, nie możesz tam upiec i musisz sobie z tym poradzić w bardziej realistyczny sposób. Kilka opcji off górze mojej głowie:

  1. Znajdź firmę T-Shirt daje „test” mechanizm, dzięki czemu można zobaczyć, czy będą przetwarzać bez żadnej określonej kolejności faktycznie umieszczenie go. Może się zdarzyć, że złożenie zamówienia u nich jest operacją dwufazową, w której zlecenie budowane jest w pierwszej fazie (w którym to momencie zatwierdzają jego utworzenie), a następnie następnie zleca przetworzenie zamówienia (po dokonaniu płatności z powodzeniem).

  2. Najpierw zapłać kartą kredytową i przenieś zamówienie do stanu "płatny". Następnie spróbuj zrealizować zamówienie z usługą T-Shirt jako proces asynchroniczny. Jeśli spełnienie się nie powiedzie i możesz zidentyfikować, że klient próbował uzyskać wydruk, którego firma nie jest przygotowana do produkcji, będziesz musiał skontaktować się z nim w celu zmiany zamówienia lub zwrotu pieniędzy.

Większość organizacji przyjmie drugie podejście ze względu na swoją prostotę techniczną i mniejsze ryzyko dla firmy. Ma także tę zaletę, że jest w stanie poradzić sobie z niedostępnością usługi T-Shirt; proces asynchroniczny czeka po prostu, aż usługa będzie dostępna i zakończy zamówienie w tym czasie.

+0

+1. Interesujące, że kod 202 ... –

+0

Uh, przepraszam, miałem na myśli "non-idempotent" (pytanie zaktualizowane, choć zastanawiając się nad tym teraz, pytanie dotyczy również "PUT", które jest idempotent ...). W każdym razie jestem prawie pewien, że 202 nie pasuje do moich celów - jest wydawane przez * serwer *, niezależnie od tego, czego chce klient. (Być może klient nie może w ogóle kupić koszulki, ponieważ nie ma ważnej karty kredytowej). – mjs

+0

Zrozumiano. Usunięto moje słowa o idempotencji. –

1

Dokładnie. Można to zrobić tak, jak sugerujesz w swoim ostatnim zdaniu. Ideą byłoby zdekompilowanie zasobów (które zawsze będą działały, chyba że awarie sieci), które reprezentują "bieżącą prośbę" o "przyjęcie zamówienia", o czym można później zdecydować. Gdy POST zwraca nagłówek "Lokalizacja", możesz w dowolnym momencie pobrać "status" swojego żądania.

W pewnym momencie może zostać zaakceptowany lub odrzucony. Może to być natychmiastowe lub może to zająć trochę czasu, więc musisz zaprojektować swoją usługę z tymi ograniczeniami (tj. Umożliwić klientowi sprawdzenie, czy jego/jej zamówienie jest akceptowane, lub przeprowadzanie jakiejś godzinowej/codziennej usługi, która zbiera akceptowane wnioski) .

Powiązane problemy