Overzicht
Platform Replicate (eerder Platform Sync) laat je een data source-connector instellen voor elke externe database op elk extern systeem waarvoor we geen live connector hebben.
Hoewel het wat technischer is om in te stellen, stelt het je in staat bepaalde platformbeperkingen te omzeilen, zoals onze limiet van 50.000 rijen op systeemgegevensbronnen, aangezien Platform Replicate-gegevensbronnen elk aantal rijen kunnen hebben.
Dit artikel behandelt wanneer je het moet gebruiken, de voor- en nadelen ervan, en hoe je het instelt. Let op dat we ervan uitgaan dat je gegevensbronnen, databasesystemen en API-eindpunten begrijpt, aangezien we deze termen gebruiken.
Overzicht
Enkele belangrijke voordelen van het gebruik van Platform Replicate-gegevensbronnen in jouw projecten.
Gegevenssouvereniteit
Jouw gegevens hoeven niet naar ons platform te worden gepusht, dus deze connector lost eventuele gegevenssouvereiniteitsproblemen op die je mogelijk hebt, aangezien geen gegevens naar onze platformservers worden gekopieerd, zoals met andere data source-connectors.
Real-Time Gegevens
In tegenstelling tot andere data source-connectors die op een ingesteld tijdinterval worden uitgevoerd (bijvoorbeeld om de 15 minuten), worden bij Platform Replicate-gegevensbronnen rijen opgehaald elke keer dat de app met het platform synchroniseert, waardoor je je gegevens kunt opvragen als nodig. Dit kan ten koste gaan van groot gegevensgebruik of trage app-reactietijden voor grote gegevensbronnen, dus experimenteren en testen worden geadviseerd bij het proberen van een Platform Replicate-implementatie.
Omzeilen van de limiet van 50k rijen
Gegevensbronnen die van Platform Replicate-connectors afkomstig zijn, zijn niet onderhevig aan de standaard limiet van 50.000 rijen, aangezien de rijen rechtstreeks naar het apparaat van de gebruiker worden geleverd.
Rijen filteren
Het belangrijkste voordeel van de Platform Replicate-connector is dat je de gegevensrijen die aan de app worden blootgesteld, kunt controleren, waardoor je rijen naar wens kunt filteren tot het niveau van individuele app-gebruikers. Dit is belangrijk voor ERP-, CRM- en andere bedrijfssystemen, aangezien de beveiliging/machtigingen rond “wie mag wat zien” kritiek zijn.
Wanneer de rijen groot worden, heeft de app nog steeds prestatiebeperkingen — deze variëren tussen Android en iOS en zijn sterk afhankelijk van apparaatspecificaties.
Als algemene regel geldt dat de prestaties meer worden beïnvloed door de totale bestandsgrootte van de gegevensbron dan door het aantal rijen.
Bijvoorbeeld: 5.000 rijen met elk 100 kb tekst kunnen naar verwachting langzamer draaien dan 50.000 rijen met in totaal 1 kb per rij.
Bovendien zal het gebruik van “zware” gegevensbronnen over veel schermen die de gebruiker achtereenvolgens kan navigeren, de prestaties verslechteren, aangezien die grote gegevensbronnen progressief kunnen ophopen in het apparaatgeheugen.
Met Platform Replicate moet je de app testen om het beste rijenaantal en schermcombinatie voor jouw specifieke gegevensset en gebruiksvereisten te vinden.
Vanwege de technische complexiteit en vereisten voor het implementeren van een Platform Replicate-gegevensbron, wordt aangenomen dat je softwareontwikkelingsmiddelen hebt om de webservice te creëren die de Platform Replicate-connector nodig heeft.
Hoe het allemaal werkt
Wanneer de app ontdekt dat een gegevensbron een Platform Replicate-connector heeft, voert het een HTTP GET-aanvraag uit tegen de doelwebservice-URL.
De GET-aanvraag bevat de externe ID van de aangevraagde gegevensbron en ander identificerend informatie.
Je MOET je webservice-eindpunt als SSL-beveiligd HTTPS blootstellen om app-aanvragen te beschermen.
De aanvraag bevat standaard query-stringparameters: het Privétoken van jouw account (nuttig voor het verifiëren van de aanvraag) en het e-mailadres van de gebruiker (handig voor het filteren van rijen op basis van de toegang van de gebruiker).
De app geeft GET-aanvragen sequentieel uit (één aanvraag per gegevensbron) naar jouw service wanneer het een gegevenssynchronisatie probeert uit te voeren.
Hoewel de exacte manier waarop je jouw Platform Replicate-eindpunt configureert volledig aan jou is overgelaten—bijvoorbeeld je kunt PHP, Python, Node.js of elk ander aantal programmeertalen gebruiken om jouw gewenste resultaat te bereiken—een C# voorbeeld dat de aanvraag- en antwoordstructuren als eenvoudige klassen schetst, is te vinden aan het einde van het artikel.
Zelfs als je geen C# gebruikt, kan het controleren van de eigenschappen en structuur in codevorm erg nuttig zijn om aan de slag te gaan met jouw eigen Platform Replicate-service.
Een Platform Replicate-gegevensbron-connector instellen
Voor testdoeleinden raden we je aan een REST API-ontwikkelingservice te gebruiken zoals – https://www.mockable.io
- Maak een nieuwe gegevensbron aan of selecteer een bestaande.
- Op de Rows-pagina van jouw gegevensbron definieer en organiseer je handmatig de kolommen van jouw gegevensbron zodat ze overeenkomen met de uitvoer van jouw webservice.
Opdat verwijzingen naar kolommen werken, moet de volgorde van de kolommen overeenkomen met wat jouw webservice teruggeeft.
Als je op enig moment de kolomvolgorde in jouw webservice-antwoord wijzigt, moet je de kolommen op de pagina Rows bijwerken zodat ze overeenkomen.
- Op de Settings-pagina van jouw gegevensbron zorg je ervoor dat het veld Externe ID op een waarde is ingesteld die deze gegevensbron identificeert.
Onthoud deze Externe ID-waarde. Je hebt deze later in dit document nodig wanneer je door de GET-webservice-details gaat.
- Voeg vervolgens een Platform Replicate-connector toe op de instellingenpagina via de knop “Connector toevoegen“.
Een Externe ID is vereist, en het adres van jouw webservice-eindpunt in de Target GET URL.
- Je kunt ook een globale Data Source Replicate URL voor jouw organisatie instellen (gedefinieerd in Organization Setup > Global Data Source URL) en opgeven dat de connector deze gebruikt. Dit maakt het mogelijk dezelfde service-eindpunt over meerdere gegevensbronnen opnieuw te gebruiken.
GET-aanvraag essentialia
Het Organization Setup-scherm bevat de meeste instellingen voor integratie met jouw Platform Replicate API, inclusief de Integration Key (Privétoken) en Provider ID (Company ID).
Jouw webservice MOET een antwoord in de volgende structuur teruggeven. Als je niet aan dit formaat voldoet, kan jouw app geen rijen downloaden.
Jouw antwoord MOET in JSON-formaat zijn.
We ondersteunen ook gzip- en deflate-compressie op antwoorden. Dit wordt aanbevolen voor grote gegevenssets, aangezien tekstgegevens zeer goed comprimeren, mobiele gegevens besparen en de downloadtijd massaal verkorten.
Onze compressieondersteuning wordt geïdentificeerd door de “Accept-Encoding“-header die door de
Dit is meestal een automatisch gedrag op het niveau van de webserver, maar je moet controleren of je serverconfiguratie JSON-compressie heeft ingeschakeld.
Dit valt buiten onze ondersteuningsomvang met betrekking tot hoe je response encoding toepast – je moet dit bevestigen met je softwareontwikkelaars.
Als je Microsoft IIS als webserver gebruikt, kan dit artikel je helpen om je compressie-instellingen te controleren.
Deze service kan je ook helpen om te bepalen of je serverresponse inderdaad wordt gecomprimeerd.
GET Request Syntax
De app stuurt GET requests naar jouw service, waarbij de onderstaande waarden als query string parameters worden doorgegeven.
Dit is het formaat van een typisch verzoek dat de app naar jouw Platform Replicate endpoint stuurt, met user@somewhere.com als ingelogde gebruiker.
GET https://yourdomain.com/xx/rowsearch?email=user@somewhere.com&integrationkey=xxxxxxxxxxxx&providerid=1&id=JOBS&lastupdated=2024-02-12T14:24:09
De parameters die in het verzoek worden doorgegeven, zijn hieronder gedetailleerd:
| Parameter | Type | Beschrijving |
|---|---|---|
|
ids required |
String | Kommagescheiden lijst van External IDs voor elke gegevensbron die de app wil synchroniseren.
Je stelt de External ID in voor je gegevensbronnen via de pagina App Builder>Data Sources>Settings van ons platform. De onderstaande afbeelding toont waar de externe ID voor de gegevensbron wordt ingesteld. |
| providerId
required |
Integer | Je persoonlijke token staat op je pagina Organisation Setup.
Gebruik dit samen met de IntegrationKey en Email om het verzoek te authenticeren. Provider ID is hetzelfde als Company ID. |
|
integrationkey required |
String | Je persoonlijke token staat op je pagina Organisation Setup. Gebruik dit samen met de Provider en Email om het verzoek te authenticeren. |
|
required |
String |
Het e-mailadres van de ingelogde app-gebruiker die het verzoek indient. Gebruik dit om de gebruiker in je systeem te identificeren en filters specifiek voor gebruikers toe te passen op de geretourneerde gegevensbronrijen. |
| lastupdated
required |
DateTime (YYYY-MM-DDTHH:MI:SS) |
De laatste keer dat de app op updates voor gegevensbronnen heeft gecontroleerd. Gebruik dit om incrementele rijupdates te implementeren door de nieuwe/bijgewerkte en verwijderde rijen sinds de vorige controle door de app terug te geven. Dit wordt aanbevolen voor grote gegevensbronnen om serverresources te sparen en voorkomen dat mobiele data-allocaties worden uitgeput. Je kunt ook deze waarde gebruiken om te bepalen of iets moet worden bijgewerkt sinds de app voor het laatst je service heeft aangesproken. De eerste keer dat de app op rijen controleert, is de LastUpdated-waarde minstens 1 jaar oud. |
| lastupdateds | String | Kommagescheiden lijst van DateTime-waarden in het formaat “YYYY-MM-DDTHH:MI:SS” die de vorige keer vertegenwoordigen dat de app een update voor de bijbehorende gegevensbron heeft aangevraagd. De waarden staan in dezelfde volgorde als de externe ID’s in de parameter IDs. Elke datum in de lijst vertegenwoordigt de vorige keer dat de app op updates voor de specifieke gegevensbron heeft gecontroleerd. Gebruik dit om incrementele rijupdates te implementeren door de nieuwe/bijgewerkte en verwijderde rijen sinds de vorige controle door de app terug te geven. Dit wordt aanbevolen voor grote gegevensbronnen om serverresources te sparen en voorkomen dat mobiele data-allocaties worden uitgeput. Je kunt ook deze waarden gebruiken om te bepalen of iets moet worden bijgewerkt sinds de app voor het laatst je service heeft aangesproken. Als niets is gewijzigd voor de gerelateerde gegevensbronnen, kun je een response retourneren zonder de DataSources-eigenschap. De eerste keer dat de app op rijen voor een specifieke gegevensbron controleert, wordt de gerelateerde laatst bijgewerkte waarde leeg gelaten op haar positie in de kommagescheiden lijst. In dit geval stellen we voor dat je de volledige dataset in de Rows-eigenschap van je response retourneert. |
Aangezien deze connector REST-gebaseerd is, kun je je webservice rechtstreeks testen via je webbrowser met behulp van een REST plugin zoals de Postman plugin voor Google Chrome.
In dit voorbeeld gaan we ervan uit dat je de “Target GET URL” op je Platform Replicate Connector hebt ingesteld op https://yourdomain.com/xx/rowsearch.
We gaan ook ervan uit dat de gegevensbron een externe ID van “JOBS” heeft.
GET Response Syntax
Je endpoint MOET de gegevens in het onderstaande JSON-formaat retourneren:
{
"DataSources": [
{
"Id": "JOBS",
"Rows": [
[
"10011",
"10011 - Test Generic Project",
"TEST",
"12345AA",
"19 Nov 2013",
"12 Somewhere Road"
],
[
"ZDS654",
"ZDS654 - Maintenance Costs to Excavator",
"TEST",
"",
"27 Nov 2013",
"24 Somewhere Else Road"
],
[
"ZDF662",
"ZDF662 - Maintenancedoor jouw API-eindpunt moet zijn geformatteerd.
Invoer Type Beschrijving DataSources Verzameling van DataSource Verzameling met de Gegevensbronnen die zijn aangevraagd.
Als er niets is veranderd sinds de LastUpdated ontvangen van de app-aanvraag.
Dan kun je een reactie retourneren zonder de eigenschap DataSources gedefinieerd. Of, als je meerdere gegevensbronnen retourneert.
Dan zijn geen Rows, NewRows en
DeletedRows eigenschappen ingesteld
op degenen die je niet wilt bijwerken. LastUpdated
verplichtDateTime
(JJJJ-MM-DDTHH:MI:SS) Het moment waarop de rijen voor deze Gegevensbronnen het laatst zijn bijgewerkt.
Over het algemeen raden we aan de huidige datum en tijd van jouw hostserver te gebruiken bij het verwerken van de aanvraag.
De app slaat deze waarde op en verzendt deze exact zoals ontvangen in de LastUpdated en LastUpdateds velden van de volgende GET-aanvraag.
Dit biedt een centraal moment voor incrementele updates, vooral omdat de app met de tijd van jouw server synchroniseert in plaats van te vertrouwen op de onbetrouwbare apparaattijd.
De "T" in de vereiste indeling is een scheidingsteken.
De array "Rows" in de GET-reactie van jouw eindpunt (gedetailleerd in de tabel hieronder) is een verzameling van waarden (Val), elk vertegenwoordigt de afzonderlijke kolomwaarde voor die Rij.
Elke Rij moet minstens twee waarden (Val) bevatten. De eerste Val moet de unieke identifier of sleutel zijn die gebruikt wordt om deze specifieke rij waarden geretourneerd door jouw eindpunt te identificeren.
De eerste waarde (Val) is ook essentieel als sleutel voor het uitvoeren van incrementele verwijderingen via het DeletedRows veld hierboven vermeld.
De tweede waarde (Val) moet de standaard weergaveable labeltekst van de rij zijn. Je kunt dit standaard overschrijven door het veld Display Options in te stellen op de Data Source "Settings" pagina.
Invoer Type Beschrijving Id
verplichtString De Externe ID van de DataSource waarvoor de gekoppelde Rij-gegevens gelden.
Moet overeenkomen met de Externe ID geconfigureerd op de Data Source -> Settings pagina op het platform.
Rows
Verzameling van Rij
Een verzameling Rijen die alle huidige Data Source rijen op de app volledig zullen vervangen.
Als je Rows opgeeft, worden alle waarden in NewRows en DeletedRows genegeerd.
NewRows
Verzameling van Rij
Een verzameling rijen die moeten worden toegevoegd/bijgewerkt naar de bestaande data source rijen op de app.
Gebruik dit veld om incrementele invoegingen/updates voor jouw Data Source uit te voeren. DeletedRows Verzameling van Rij Een verzameling Rij Items die moeten worden verwijderd uit de bestaande Data Source rijen op de app.
Gebruik dit veld om incrementele verwijderingen van jouw Data Source uit te voeren.
Elke Rij moet één Val element bevatten die jouw unieke identifier voor de Rij is om te verwijderen.
Elke waarde in de "Rows" array komt overeen met een kolom in de dataset die jouw eindpunt retourneert. Hieronder staat een samenvatting van hoe elke geretourneerde waarde moet worden geformatteerd.
Invoer Type Beschrijving Val
verplichtString Een kolomwaarde voor deze rij kan elke string waarde bevatten.Als je wilt dat deze kolom een pictogram/afbeelding in de mobiele app weergeeft.
Geef de HTTP URL van de afbeelding op.
De gekoppelde afbeelding moet in PNG of JPG/JPEG indeling zijn.
Jouw webservice moet een HTTP-status op 400-niveau retourneren als de GET mislukt.
Voorbeeldcode
C# voorbeeld dat de aanvraag- en responsstructuren als eenvoudige klassen schematiseert.
Ook als je C# niet gebruikt, kan het bekijken van de eigenschappen en structuur in codevorm erg nuttig zijn om aan de slag te gaan met jouw eigen Platform Replicate service.
Platform Replicate – Aanvraag- en Responsstructuur.cs
using System;
using System.Collections.Generic;
namespace Example.HostedGET
{
// Data Transfer Object (DTO) klassen voor webservices gekoppeld aan Hosted GET connectors op Gegevensbronnen.
// Een Hosted GET service stelt de rijen voor een Gegevensbron van een extern systeem/database bloot.
// De service moet de request payload accepteren die in de DRows klasse hieronder wordt beschreven,
// en moet reageren met de payload beschreven in de DRowsResponse klasse.
/// <summary>
/// Request DTO klasse voor oproepen gedaan door de app naar Hosted GET webservices.
/// </summary>
public class DRowsRequest
{
/// <summary>
/// Kommagescheiden lijst van Externe IDs voor elke Gegevensbron die de app wil synchroniseren.
/// Je stelt de Externe ID in op de Gegevensbron via de App Builder -> Data Sources -> Settings pagina in het platform.
/// </summary>
public string Ids { get; set; }
/// <summary>
/// Kommagescheiden lijst van laatst bijgewerkte waarden voor elke externe id in Ids die de app wil synchroniseren.
/// Waarden worden in dezelfde volgorde als Ids vermeld en bevatten een lege waarde als de gerelateerde gegevensbron niet eerder is aangevraagd.
/// Gebruik dit om incrementele app-updates te implementeren, waarbij je alleen de nieuwe/bijgewerkte en verwijderde rijen terugstuurt sinds de app voor het laatst is ingecheckt.
/// Dit wordt aanbevolen voor grote Gegevensbronnen om serverbronnen te besparen en voorkomen dat mobiele gegevenstoewijzingen uitgeput raken.
/// </summary>
public string LastUpdateds { get; set; }
/// <summary>
/// Jouw unieke Bedrijfs-Id, te vinden op de Organisatie Setup pagina in het platform
/// </summary>
public int ProviderId { get; set; }
/// <summary>
/// Jouw unieke Integratiemodule, te vinden op de Organisatie Setup pagina in het platform
/// </summary>
public string IntegrationKey { get; set; }
/// <summary>
/// E-mailadres van de ingelogde app-gebruiker die de aanvraag doet
/// </summary>
public string Email { get; set; }
}
/// <summary>
/// Response DTO klasse voor oproepen gedaan door de app naar Hosted GET webservices.
/// </summary>
public class DRowsResponse
{
/// <summary>
/// Verzameling met de Gegevensbronnen die zijn aangevraagd.
/// </summary>
public DSources DataSources { get; set; }
/// <summary>
/// Het moment waarop de rijen voor deze Gegevensbron het laatst zijn bijgewerkt.
/// We raden aan dat dit de huidige datum en tijd op jouw hostserver is op het moment van verwerking van de aanvraag.
/// Deze waarde wordt opgeslagen door de app en verzonden in het LastUpdateds veld van de volgende Rij Search aanvraag gedaan door de app.
/// Dit geeft een centraal moment voor incrementele updates in het bijzonder, omdat de app jouw servertijden echo zal gebruiken in plaats van jouw eigen onbetrouwbare apparaattijd.
/// </summary>
public DateTime LastUpdated { get; set; }
}
public class DSource
{
/// <summary>
/// De Externe Id van de Dataummary>
/// Een verzameling van Rows die moeten worden toegevoegd/bijgewerkt aan de bestaande Data Source rijen in de app.
/// Gebruik dit veld om incrementele inserts/updates van je Data Source uit te voeren.
/// </summary>
public Rows NewRows { get; set; }
/// <summary>
/// Een verzameling van Row Items die moeten worden verwijderd uit de bestaande Data Source rijen in de app.
/// Gebruik dit veld om incrementele deletes van je Data Source uit te voeren.
/// Elke Row moet een enkel Val element bevatten dat je unieke identifier voor de Row is om te verwijderen.
/// </summary>
public Rows DeletedRows { get; set; }
}
public class DSources : List<DSource> { }
public class Rows : List<Row> { }
public class Row : List<string> { }
}
Problemen oplossen / Testen
Zodra je een Platform Replicate connector op je Data Source hebt ingesteld, zal de Rows pagina voor die Data Source automatisch proberen rijen op te halen van de gegeven GET URL.
De Rows pagina maakt hetzelfde verzoek als de app, inclusief je huidige ingelogde gebruiker.
Dit is een snelle en eenvoudige manier om te zien of je Platform Replicate webservice het GET verzoek begrijpt en rijen in het juiste formaat retourneert.
Wat doe ik wanneer Platform Replicate werkt op mijn iOS app maar niet op Android?
Dit komt bijna zeker door hoe Android SSL-certificaten behandelt – Android is in feite strenger met SSL-certificaatketens dan iOS.
SSL-certificaatketens bestaan uit het primaire SSL-certificaat voor je webservice endpoint domein en eventuele tussentijdse certificaten uitgegeven door je Certificate Authority.
Als je probeert verbinding te maken met een webadres met een onvolledige SSL-keten, zal Android de verbinding weigeren.
Als je Android apparaten niet kunnen synchroniseren, kun je testen of het probleem gerelateerd is aan een onvolledige SSL-keten door je Platform Replicate service URL in je standaard Android webbrowser te bezoeken.
Je krijgt waarschijnlijk een verbindingsfout met tekst zoals "de certificaatautoriteit is ongeldig".
Je kunt je SSL-configuratie verder verifiëren met een testservice zoals SSL Labs:
https://www.ssllabs.com/ssltest
Als je SSL-installatie problemen heeft, zie je waarschuwingen zoals "keten onvolledig" in de SSL Labs testresultaten.
Om het probleem op te lossen, zorg ervoor dat de Platform Replicate webservice server de tussentijdse certificaten van je Certificate Authority heeft geïnstalleerd.
Als je bijvoorbeeld GoDaddy gebruikt, zou het beste startpunt hier zijn:
https://support.godaddy.com/help/article/868/what-is-an-intermediate-certificate?countrysite=au
Zodra je de juiste certificaatketen hebt, zullen de Platform Replicate data sources naar je Android apparaten synchroniseren omdat zij nu verbinding kunnen maken met je webservice.
Je kunt de certificaatketen controleren door de Platform Replicate URL in je Android webbrowser te controleren. Wanneer opgelost, zou het geen certificaatfouten meer moeten tonen.
Antwoord niet gevonden?
Staat jouw vraag er niet bij? Neem dan direct contact met ons op.
Contact opnemen