Het verwerken van de Groupon API met MapForce – Deel 2
In Deel 1 van deze serie beschreven we hoe u Altova MapForce kunt verbinden met de Groupon API. We hebben de API bevracht voor een lijst met Groupon-divisies en vervolgens deze lijst gebruikt om API-verzoeken te genereren voor alle actuele aanbiedingen van elke divisie. In dit deel zullen we de /deals-verzoeken uitvoeren en de resultaten filteren om de meest interessante gegevens te selecteren. De lijst met /deals-verzoeken die we eerder hebben samengesteld, ziet er als volgt uit:
![]()
Om alle vragen te verwerken, kunnen we de lijst als een dynamisch invoerbestand koppelen aan een nieuwe mappingcomponent. De vorige keer dat we een nieuwe component nodig hadden, hebben we een API-/divisies-vraag in de mapping geplaatst en MapForce automatisch een XML-schema laten genereren. We kunnen hetzelfde hier doen door een API-/aanbiedingen-vraag als een XML-invoerbestand toe te voegen. Er is echter wel een klein probleem: hoewel de online documentatie van de Groupon API duidelijk beschrijft welke vragen we kunnen stellen, is het vaag over de informatie die wordt teruggegeven. Voordat we tientallen vragen naar de API sturen voor alle huidige aanbiedingen, willen we waarschijnlijk iets meer weten over de gegevens die we terugkrijgen.
Laten we een deal sluiten
Zoals Yogi Berra zei, kun je veel leren door gewoon te kijken. Laten we beginnen met het uitvoeren van een "/deals"-query in XMLSpy. Dat stelt ons in staat om de reactie op een query voor één divisie te bekijken, voordat we een mogelijk grote hoeveelheid data ophalen. Het menu Bestand / Openen in XMLSpy bevat dezelfde optie "Schakel over naar URL" die we eerder in MapForce hebben gebruikt. Als we de "/deals"-API-query voor een divisie invoeren die een groot stedelijk gebied bestrijkt – bijvoorbeeld Dallas – dan krijgen we waarschijnlijk voldoende "deals"-instanties om de kenmerken van de gehele dataset te kunnen bepalen. XMLSpy opent de reactie op de "/deals"-API-query in de tekstweergave, net alsof we een lokaal bestand openen:
![]()
Zoals verwacht, hebben we een aanzienlijke hoeveelheid data ontvangen toen we alle transacties voor één specifieke afdeling opvragen. Een snelle manier om de structuur van deze data te analyseren is om de optie "XMLSpy DTD / Schema" te gebruiken om een .xsd-bestand te genereren op basis van de XML-data. Hieronder is een verkorte weergave van het volledige gegenereerde .xsd-bestand, gebaseerd op de reactie op de query "/deals" voor Dallas:
![]()
We kunnen nog dieper graven, zoals Yogi zei, alsof we dit al eerder hebben gezien. Door alle elementen te bekijken die bij het XML-schema horen, komen we enkele opmerkelijke anomalieën tegen. Zo zijn er bijvoorbeeld twee elementen met de naam "redemptionLocation" die verschillende definities hebben. Het eerste element bevat een reeks onderliggende elementen:
![]()
En de tweede wordt gedefinieerd als een eenvoudige tekstreeks:
![]()
Bij het opnieuw bekijken van de XML-gegevens voor Dallas en het zoeken naar "redemptionLocation" worden de volgende voorbeelden weergegeven:
![]()
En:
![]()
En:
![]()
Dit is erg interessant, omdat redemptionLocation = "online" aanbiedingen identificeert die overal kunnen worden ingeleerd, in plaats van door een bezoek aan een fysieke locatie binnen de divisie waar ze worden aangeboden. Wat als we de /deals API-query voor alle divisies uitvoeren en een lijst van alle online aanbiedingen extraheren? Dat zou een extreme Groupon-ervaring opleveren!
Vraag alleen wat je nodig hebt
De Groupon /deals API-query ondersteunt een optionele parameter, &show=, waarmee gebruikers de hoeveelheid geretourneerde data kunnen beperken. Door deze parameter toe te passen, kan bandbreedte worden bespaard en de verwerkingstijd voor de dataomzetting worden verkort, doordat ongewenste data uit de API-reactie worden verwijderd. We kunnen ons uiteindelijke resultaat ook vereenvoudigen door alleen de meest interessante informatie op te nemen, inclusief de link naar de Groupon-webpagina voor elke aanbieding. Nadat we ongewenste elementen hebben verwijderd uit het gegenereerde Dallas-schema, ziet de definitieve versie voor de samenvatting van online aanbiedingen er als volgt uit:
![]()
Wanneer we de parameter "&show=" toevoegen aan onze MapForce-mapping om alleen de elementen op te vragen die zijn opgenomen in het vereenvoudigde XML-schema, zien de queries er als volgt uit:
![]()
Nu kunnen we het bijgewerkte .xsd-bestand in de mapping plaatsen en de lijst met API-/deal-vragen als dynamische invoer koppelen. We hoeven het tekstbestand dat we gebruikten om de lijst met vragen te verzamelen niet te verwijderen; dat kan in de toekomst nog nuttig zijn voor het opsporen van fouten.
![]()
Deze wijzigingen voltooien de invoerzijde van de datamapping.
Het definiëren van de uitvoer van de datatransformatie
In XMLSpy kunnen we nog een paar aanpassingen maken aan het invoer-XML-schema om een nieuwe versie voor de uitvoer te ontwerpen:
![]()
We hebben het respons-element verwijderd, omdat het geen toegevoegde waarde heeft, en het element "redemptionLocation" verwijderd, omdat we dit niet in de uitvoer willen opnemen. We hebben ook een datumveld toegevoegd voor een tijdstempel, omdat ons uitvoerbestand een momentopname van gegevens zal zijn die voortdurend veranderen.
Nadat we deze versie van het .xsd-bestand in XMLSpy hebben opgeslagen, kunnen we het in de MapForce-mapping plaatsen. Hieronder is de uitvoerkant van de mapping te zien, met een gedeeltelijk verbonden uitvoercomponent. Het filter bovenaan leest het element "redemptionLocation" om alleen online aanbiedingen te selecteren, en de functie "nu" voegt de huidige datum toe:
![]()
De laatste wijziging die we hebben aangebracht in het XML-schema voor de uitvoer, was het omzetten van verschillende elementtypes van "dateTime", "Boolean" en "integer" naar het string-datetype, om zo meer beschrijvende tekst mogelijk te maken. Hieronder volgt de volledige definitie van de mapping, met de definitieve koppelingen naar het uitvoercomponent:
![]()
En nu het resultaat
Wanneer we op de knop "Uitvoer" klikken, verwerkt MapForce de volledige transformatie van begin tot eind met behulp van de ingebouwde uitvoeringsengine van MapForce. Hieronder volgt een overzicht van de stappen:
- Voer de query "/divisions" uit om de actuele lijst van divisies op te vragen
- Combine de tekstreeksen om de lijst met zoekopdrachten voor "/deals" voor alle divisies samen te stellen
- Voer de query's onder
/dealsuit om dynamische gegevens te genereren voor het invoerveld - Filter de online aanbiedingen om het uitvoercomponent te genereren, voer de overige mappingfuncties uit en voeg de tijdstempel toe nadat alle aanbiedingen zijn verwerkt
MapForce voert al die stappen in slechts enkele seconden uit en genereert een uitvoerbestand met een reeks transacties die er ongeveer zo uitzien:
![]()
In het derde deel van deze serie ontwerpen we een stylesheet die de XML-uitvoer van onze mapping automatisch omzet naar HTML, zodat deze aantrekkelijk wordt weergegeven in een webbrowser en op mobiele apparaten. Tot ziens bij het honkbalveld, Yogi!
XMLSpy en MapForce zijn samen verkrijgbaar in de Altova MissionKit, die tegen een speciale prijs wordt aangeboden. Ontdek zelf hoe eenvoudig het is om de MissionKit te gebruiken om gegevens van een web-API om te zetten – download een gratis proefversie van 30 dagen!
Redactienota: Onze oorspronkelijke serie over het verwerken van data van de Groupon API bestond uit drie delen. U kunt deze bekijken door op de links hieronder te klikken: Deel 1, "Het verwerken van de Groupon API met Altova MapForce", beschrijft hoe u dynamische invoer kunt creëren door data te verzamelen van meerdere URL's. Deel 2, "Het verwerken van de Groupon API met MapForce – Deel 2", beschrijft hoe we data uit de API hebben gefilterd en de uitvoer hebben gedefinieerd om alleen de meest interessante details te extraheren. Deel 3, "Het verwerken van de Groupon API – Deel 3", beschrijft hoe we de uitvoer hebben opgemaakt als een enkel HTML-document, geoptimaliseerd voor desktop- en mobiele apparaten, en bespreekt manieren om de herhaalde uitvoering te automatiseren.