Czytelnicy, którzy nie znają tego tematu, będą poruszeni niekończącą się dyskusją na temat tego, co powinieneś zrobić, oraz względnym brakiem lekcji z doświadczenia. Fakt, że REST jest „preferowany” w stosunku do SOAP, jest, jak sądzę, uczeniem się na wysokim poziomie z doświadczenia, ale dobroć musieliśmy stamtąd rozwijać? Jest rok 2016. Praca doktorska Roya miała miejsce w 2000 roku. Co opracowaliśmy? Fajnie było? Czy łatwo było się zintegrować? Wspierać? Czy poradzi sobie ze wzrostem liczby smartfonów i niestabilnych połączeń mobilnych?
Według ME rzeczywiste sieci są zawodne. Upłynął limit czasu żądania. Połączenia są resetowane. Sieci przestają działać na kilka godzin lub dni na raz. Pociągi jeżdżą do tuneli z użytkownikami mobilnymi na pokładzie. W przypadku każdej prośby (co czasami potwierdzane w całej tej dyskusji) prośba może wpaść do wody na swojej drodze lub odpowiedź może spaść do wody w drodze powrotnej. W tych warunkach wysyłanie żądań PUT, POST i DELETE bezpośrednio do zasobów materialnych zawsze wydawało mi się trochę brutalne i naiwne.
HTTP nie robi nic, aby zapewnić niezawodne zakończenie odpowiedzi na żądanie, i jest w porządku, ponieważ jest to właściwie zadanie aplikacji obsługujących sieć. Opracowując taką aplikację, możesz przeskakiwać przez obręcze, aby użyć PUT zamiast POST, a następnie więcej obręczy, aby dać pewien rodzaj błędu na serwerze, jeśli wykryjesz duplikaty żądań. Po powrocie do klienta musisz przeskoczyć przez obręcze, aby zinterpretować te błędy, ponownie pobrać, zweryfikować ponownie i opublikować ponownie.
Lub możesz to zrobić : rozważ swoje niebezpieczne żądania jako efemeryczne zasoby dla pojedynczego użytkownika (nazwijmy je akcjami). Klienci żądają nowej „akcji” w odniesieniu do zasobu merytorycznego z pustym testem POST do zasobu. POST będzie używany tylko do tego. Po bezpiecznym posiadaniu identyfikatora URI świeżo wybitej akcji klient umieszcza niebezpieczne żądanie do identyfikatora URI akcji, a nie zasobu docelowego . Rozwiązanie akcji i aktualizacja „prawdziwego” zasobu jest właściwie zadaniem twojego API i jest tutaj oddzielona od niewiarygodnej sieci.
Serwer zajmuje się biznesem, zwraca odpowiedź i przechowuje ją w stosunku do uzgodnionego URI akcji . Jeśli coś pójdzie nie tak, klient powtarza żądanie (naturalne zachowanie!), A jeśli serwer już to widział, powtarza zapisaną odpowiedź i nic więcej nie robi .
Szybko zauważysz podobieństwo dzięki obietnicom: tworzymy i zwracamy symbol zastępczy wyniku, zanim cokolwiek zrobisz. Podobnie jak obietnica, akcja może zakończyć się sukcesem lub porażką, ale jej wynik można wielokrotnie pobrać.
Co najlepsze, dajemy aplikacjom wysyłającym i odbierającym możliwość połączenia jednoznacznie zidentyfikowanej akcji z unikalnością w ich odpowiednich środowiskach. I możemy zacząć żądać i egzekwować !, odpowiedzialne zachowanie od klientów: powtarzaj swoje prośby tak, jak chcesz, ale nie generuj nowej akcji, dopóki nie uzyskasz ostatecznego wyniku z istniejącej.
Jako takie znikają liczne kolczaste problemy. Powtarzane żądania wstawiania nie utworzą duplikatów i nie tworzymy prawdziwego zasobu, dopóki nie będziemy w posiadaniu danych. (kolumny bazy danych mogą nie być zerowalne). Powtarzane żądania aktualizacji nie trafią w niezgodne stany i nie zastąpią kolejnych zmian. Klienci mogą (ponownie) pobierać i bezproblemowo przetwarzać oryginalne potwierdzenie z dowolnego powodu (klient się zawiesił, brakowało odpowiedzi itp.).
Kolejne żądania usunięcia mogą wyświetlać i przetwarzać oryginalne potwierdzenie, nie popełniając błędu 404. Jeśli zajmie to więcej czasu niż oczekiwano, możemy tymczasowo odpowiedzieć i mamy miejsce, w którym klient może sprawdzić ostateczny wynik. Najładniejszą częścią tego wzoru jest jego właściwość Kung-Fu (Panda). Bierzemy słabość, skłonność klientów do powtarzania zapytania za każdym razem, gdy nie rozumieją odpowiedzi, i przekształcania go w siłę :-)
Zanim powiesz mi, że to nie jest RESTful, proszę rozważyć liczne sposoby przestrzegania zasad REST. Klienci nie konstruują adresów URL. Interfejs API pozostaje wykrywalny, choć z niewielką zmianą semantyki. Czasowniki HTTP są używane odpowiednio. Jeśli uważasz, że jest to ogromna zmiana do wdrożenia, z doświadczenia mogę powiedzieć, że tak nie jest.
Jeśli uważasz, że będziesz mieć do przechowywania ogromne ilości danych, porozmawiajmy o objętościach: typowe potwierdzenie aktualizacji to ułamek kilobajta. HTTP daje obecnie minutę lub dwie na ostateczną odpowiedź. Nawet jeśli przechowujesz działania tylko przez tydzień, klienci mają dużą szansę na nadrobienie zaległości. Jeśli masz bardzo duże woluminy, możesz potrzebować dedykowanego magazynu wartości klucza zgodnego z kwasem lub rozwiązania w pamięci.