Aufgabenstellung:
Beim Öffnen einer Firma in einer Business App CRM-Instanz sollen in einem Datenintegrationswidget Postleitzahlenbereiche in der Umgebung als zusätzliche Informationen angezeigt werden.
Das Widget selbst ist bereits mit allen Parametern und Spalten konfiguriert. Es liefert uns Informationen über die Postleitzahl, deren Umgebung gesucht werden soll und in welchem Radius, das bei dem externen Dienst notwendige Login und wie viele Ergebnisse maximal zurückgegeben werden sollen.
Für das Datenintegrationswidget werden neben einer eindeutigen Id (“ESID”) die Informationen “Postleitzahl”, “Stadt”, “Verwaltungsbezirk”, “Bundesland”, “Abstand”, “Longitude” und “Latitude” benötigt.
Vorgehen:
1. Authentifizierung
Der externe Dienst benötigt keine Authentifizierung, nur den Login-Namen, auf den die Zugriffe gezählt werden sollen.
2. Verarbeitung der Mehrfachwerte
Der externe Dienst liefert mehrere Werte, was für uns bedeutet, dass ein Mehrfachwert-Mapping notwendig ist, wenn wir alle gelieferten Werte verarbeiten wollen. Wir verwenden in diesem Kontext eine Mapping-Vorlage.
<MappingTemplate id="Custom.Example.geonames.PostalCodesNearby" sourceType="Newtonsoft.Json.Linq.JToken" targetType="System.Collections.Generic.Dictionary`2[[System.String],[System.Object]]">
<Mapping>
<From>$.postalCode</From>
<To>ESID</To>
</Mapping>
<Mapping>
<From>$.postalCode</From>
<To>Postleitzahl</To>
</Mapping>
<Mapping>
<From>$.placeName</From>
<To>Stadt</To>
</Mapping>
<Mapping>
<From>$.adminName2</From>
<To>Verwaltungsbezirk</To>
</Mapping>
<Mapping>
<From>$.adminName1</From>
<To>Bundesland</To>
</Mapping>
<Mapping>
<From>$.distance</From>
<To>Abstand</To>
</Mapping>
<Mapping>
<From>$.lng</From>
<To>Longitude</To>
</Mapping>
<Mapping>
<From>$.lat</From>
<To>Latitude</To>
</Mapping>
</MappingTemplate>
3. Webservice
Die XML-Definition verwendet den real existierenden Service “geonames.org” im Internet, um die Umgebung einer gegebenen Postleitzahl zu ermitteln. Bei der Verwendung eines Webservice für ein Datenintegrationswidget, sind die Model-Typen fest vorgegeben. Die eingehenden Mappings bzw. die Mapping-Vorlage sorgt für die Zuordnung der gelieferten Werte zu den geforderten Spalten des Widgets.
<WebService id="PostalCodeSearch" displayName="Umkreissuche" inboundModelType="BA.DataIntegration.WebServices.DiwEndpoints.Models.DiwInboundModel" outboundModelType="Newtonsoft.Json.Linq.JToken" >
<Method>GET</Method>
<Url>http://api.geonames.org/findNearbyPostalCodesJSON?postalcode&{PLZ}&country=DE&maxRows={Count}&username={Login}&radius={Radius}</Url>
<UrlMappings>
<Mapping>
<From>$.PLZ</From>
<To>PLZ</To>
</Mapping>
<Mapping>
<From>$.Login</From>
<To>Login</To>
</Mapping>
<Mapping>
<From>$.Count</From>
<To>Count</To>
</Mapping>
<Mapping>
<From>$.Radius</From>
<To>Radius</To>
</Mapping>
</UrlMappings>
<InboundMappings>
<MultiValueMapping>
<From>$.postalCodes</From>
<To>Rows</To>
<RowMappings targetRowType="System.Collections.Generic.Dictionary`2[[System.String],[System.Object]]">
<TemplateMapping ref="Custom.Example.geonames.PostalCodesNearby"/>
</RowMappings>
</MultiValueMapping>
</InboundMappings>
</WebService>