Przetwarzanie API Groupon – Zakończenie
Rzadkie, nietypowe sytuacje mogą zakłócić działanie aplikacji do mapowania danych, które nie są ściśle powiązane. Jest to szczególnie ważne, gdy korzystamy z dużych zbiorów danych dostępnych w Internecie i mamy niewielki lub żaden wpływ na dane źródłowe. W tym artykule opisujemy technikę debugowania, która pozwala programistom pracującym nad projektami mapowania i transformacji danych szybko identyfikować i uwzględniać nieoczekiwane dane w strumieniu pochodzącym z zewnętrznego źródła.
Problem Zeszłego lata napisaliśmy serię wpisów na blogu, w których opisaliśmy, jak pracować z API Groupona, aby pobierać podzbiór ofert we wszystkich miastach, w których działa Groupon, i formatować listę do wyświetlenia w przeglądarce internetowej lub na urządzeniu mobilnym.
![]()
Podsumowując, używamy wiersza poleceń do uruchomienia procesu mapowania danych w MapForce, który wywołuje API Groupon ponad 150 razy – raz dla każdego miasta, w którym działa Groupon. Następnie dane są filtrowane, aby wyodrębnić oferty dostępne online, a nie w fizycznych punktach sprzedaży, a wyniki są formatowane w formacie HTML za pomocą narzędzia StyleVision. Codziennie rano uruchamiamy ten wiersz poleceń w pliku wsadowym, który zapisuje wynik w formacie HTML na lokalnym serwerze, aby nasi współpracownicy mogli go przeglądać za pomocą dowolnej przeglądarki internetowej i znaleźć interesujące oferty z całego kraju. Proces mapowania działał bez problemów przez ponad dwa miesiące, aż pewnego dnia wystąpił błąd z następującym komunikatem: „Wartość źródłowa „” typu dateTime nie mogła zostać przekonwertowana na typ docelowy dateTime.” Konkretne wyjaśnienie polega na tym, że w pewnym miejscu procesu mapowania, gdzie oczekiwaliśmy wartości typu dateTime, otrzymaliśmy wartość pustą. Na bardziej abstrakcyjnym poziomie, błąd sugeruje potencjalną wadę w logice naszej strategii mapowania. Za każdym razem, gdy wywołujemy API Groupon, otrzymujemy poprawny strumień danych XML, otoczony elementem
![]()
Wiersze oznaczone jako "Powiązane lokalizacje" zawierają odnośniki prowadzące do elementów na mapie, w których wystąpił błąd. Kliknięcie na komunikat o błędzie przenosi nas do funkcji formatowania daty i czasu.
![]()
Możemy albo kliknąć komunikat o "błędzie", albo prześledzić połączenie wartości, aby zidentyfikować element wejściowy funkcji format-dateTime. W każdym przypadku, lokalizujemy element, który spowodował błąd.
![]()
Problem leży w komponencie wejściowym, który zbiera wszystkie dane zwracane przez nasze zapytania do API Groupon, zanim zostaną one przefiltrowane lub przekształcone. Podczas projektowania mapowania, element "endAt" w naszych danych testowych zawsze wskazywał datę i godzinę zakończenia dla każdej oferty Groupon, ale z jakiegoś powodu otrzymywaliśmy w tym polu wartość pustą. Gdyby błąd wystąpił podczas przetwarzania lokalnego pliku wejściowego, moglibyśmy po prostu sprawdzić zawartość pliku, ale w tym przypadku dane pochodziły z wielu adresów URL i są przechowywane tylko tymczasowo, aż zostaną przekształcone i przekazane do komponentu wyjściowego. Na szczęście, możemy zastosować prosty sposób, aby łatwo zmodyfikować mapowanie i zachować wszystkie dane otrzymane z API Groupon. Po prostu kopiujemy komponent wejściowy i wklejamy jego kopię do mapowania. Możemy połączyć element "response" z oryginalnego komponentu z jego kopią, co jednocześnie mapuje wszystkie elementy potomne między tymi komponentami.
![]()
Nasz oryginalny komponent wejściowy jest teraz połączony z dwoma komponentami wyjściowymi. Możemy wybrać, który z komponentów wyjściowych zostanie wygenerowany przez wbudowany silnik wykonawczy MapForce, klikając ikonę oka w prawym górnym rogu każdego komponentu wyjściowego. Nowy komponent wyjściowy po prostu zapisuje kopię wszystkich danych z komponentu wejściowego. Kiedy analizujemy surowe dane za pomocą XMLSpy, rzeczywiście znajdujemy pusty element w miejscu, gdzie spodziewaliśmy się daty i godziny:
![]()
Rozwiązanie
Teraz, gdy wiemy, że oferta może nie mieć określonego terminu zakończenia, możemy uwzględnić tę możliwość w procesie mapowania. W zmodyfikowanym sposobie obsługi elementu "endAt", przed zastosowaniem oryginalnej funkcji formatowania daty i czasu, przeprowadzamy test warunkowy i dostarczamy alternatywny wynik, gdy element "endAt" jest pusty.
![]()
Musieliśmy działać szybko, ponieważ wszystkie dane Groupon są aktualizowane w czasie rzeczywistym. Ten konkretny przypadek w końcu by się zakończył i zniknął z przepływu danych. To doświadczenie pokazało nam, jak ważne jest posiadanie wydajnych narzędzi do debugowania i wykorzystywanie ich w kreatywny sposób, nawet wtedy, gdy wydaje się, że projekt mapowania danych działa pomyślnie! Altova MapForce to Dostępne w wersji próbnej – rozwiązanie kolejnego nietypowego problemu może okazać się kluczowe dla rozwiązania problemu, z którym sami się zmierzymy.
Uwaga redakcji: Nasza oryginalna seria artykułów na temat mapowania danych z API Groupon składała się z trzech części, do których można sięgnąć, klikając poniższe linki: Część 1, zatytułowana "Przetwarzanie API Groupon za pomocą Altova MapForce", opisuje, jak tworzyć dynamiczne źródła danych, pobierając informacje z wielu adresów URL. Przetwarzanie API Groupon za pomocą MapForce – Część 2 wyjaśnia, jak filtrowaliśmy dane z API i definiowaliśmy wynik, aby wydobyć tylko najbardziej interesujące szczegóły. Przetwarzanie API Groupon – Część 3 opisuje formatowanie wyniku jako pojedynczego dokumentu HTML, zoptymalizowanego dla urządzeń stacjonarnych i mobilnych, oraz omawia sposoby automatyzacji powtarzalnego wykonywania.