Configuration de la spécification source pour les sources en libre-service (SDK par lots)
Les spécifications de source contiennent des informations spécifiques à une source, notamment des attributs relatifs à la catégorie d’une source, au statut bêta et à l’icône de catalogue. Elles contiennent également des informations utiles telles que les paramètres d’URL, le contenu, l’en-tête et le planning. Les spécifications de source décrivent également le schéma des paramètres requis pour créer une connexion source à partir d’une connexion de base. Le schéma est nécessaire pour créer une connexion source.
Voir annexe pour un exemple de spécification de source entièrement rempli.
"sourceSpec": {
"attributes": {
"uiAttributes": {
"isSource": true,
"isPreview": true,
"isBeta": true,
"category": {
"key": "protocols"
},
"icon": {
"key": "genericRestIcon"
},
"description": {
"key": "genericRestDescription"
},
"label": {
"key": "genericRestLabel"
}
},
"spec": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"description": "Defines static and user input parameters to fetch resource values.",
"properties": {
"urlParams": {
"type": "object",
"properties": {
"host": {
"type": "string",
"description": "Enter resource url host path.",
"example": "https://{domain}.api.mailchimp.com"
},
"path": {
"type": "string",
"description": "Enter resource path",
"example": "/3.0/reports/campaignId/email-activity"
},
"method": {
"type": "string",
"description": "HTTP method type.",
"enum": [
"GET",
"POST"
]
},
"queryParams": {
"type": "object",
"description": "The query parameters in json format",
}
},
"required": [
"host",
"path",
"method"
]
},
"headerParams": {
"type": "object",
"description": "The header parameters in json format",
},
"contentPath": {
"type": "object",
"description": "The parameters required for main collection content.",
"properties": {
"path": {
"description": "The path to the main content.",
"type": "string",
"example": "$.emails"
},
"skipAttributes": {
"type": "array",
"description": "The list of attributes that needs to be skipped while fattening the array.",
"example": "[total_items]",
"items": {
"type": "string"
}
},
"keepAttributes": {
"type": "array",
"description": "The list of attributes that needs to be kept while fattening the array.",
"example": "[total_items]",
"items": {
"type": "string"
}
},
"overrideWrapperAttribute": {
"type": "string",
"description": "The new name to be used for the root content path node.",
"example": "email"
}
},
"required": [
"path"
]
},
"explodeEntityPath": {
"type": "object",
"description": "The parameters required for the sub-array content.",
"properties": {
"path": {
"description": "The path to the sub-array content.",
"type": "string",
"example": "$.email.activity"
},
"skipAttributes": {
"type": "array",
"description": "The list of attributes that needs to be skipped while fattening sub-array.",
"example": "[total_items]",
"items": {
"type": "string"
}
},
"keepAttributes": {
"type": "array",
"description": "The list of attributes that needs to be kept while fattening the sub-array.",
"example": "[total_items]",
"items": {
"type": "string"
}
},
"overrideWrapperAttribute": {
"type": "string",
"description": "The new name to be used for the root content path node.",
"example": "activity"
}
},
"required": [
"path"
]
},
"paginationParams": {
"type": "object",
"description": "The parameters required to fetch data using pagination.",
"properties": {
"type": {
"description": "The pagination fetch type.",
"type": "string",
"enum": [
"OFFSET",
"POINTER"
]
},
"limitName": {
"type": "string",
"description": "The limit property name",
"example": "limit or count"
},
"limitValue": {
"type": "integer",
"description": "The number of records to fetch per page.",
"example": "limit=10 or count=10"
},
"offsetName": {
"type": "string",
"description": "The offset property name",
"example": "offset"
},
"pointerPath": {
"type": "string",
"description": "The path to pointer property",
"example": "$.paging.next"
}
},
"required": [
"type",
"limitName",
"limitValue"
]
},
"scheduleParams": {
"type": "object",
"description": "The parameters required to fetch data for batch schedule.",
"properties": {
"scheduleStartParamName": {
"type": "string",
"description": "The order property name to get the order by date."
},
"scheduleEndParamName": {
"type": "string",
"description": "The order property name to get the order by date."
},
"scheduleStartParamFormat": {
"type": "string",
"description": "The order property name to get the order by date.",
"example": "yyyy-MM-ddTHH:mm:ssZ"
},
"scheduleEndParamFormat": {
"type": "string",
"description": "The order property name to get the order by date.",
"example": "yyyy-MM-ddTHH:mm:ssZ"
}
},
"required": [
"scheduleStartParamName",
"scheduleEndParamName"
]
}
},
"required": [
"urlParams",
"contentPath",
"paginationParams",
"scheduleParams"
]
}
},
}
sourceSpec.attributes
sourceSpec.attributes.uiAttributes
sourceSpec.attributes.uiAttributes.isBeta
true
false
sourceSpec.attributes.uiAttributes.category
advertising
crm
customer success
database
ecommerce
marketing automation
payments
protocols
sourceSpec.attributes.uiAttributes.icon
mailchimp-icon.svg
sourceSpec.attributes.uiAttributes.description
sourceSpec.attributes.uiAttributes.label
sourceSpec.attributes.spec.properties.urlParams
sourceSpec.attributes.spec.properties.urlParams.properties.path
/3.0/reports/${campaignId}/email-activity
sourceSpec.attributes.spec.properties.urlParams.properties.method
GET
, POST
sourceSpec.attributes.spec.properties.urlParams.properties.queryParams
${USER_PARAMETER}
."queryParams" : {"key" : "value", "key1" : "value1"}
sera ajouté à l’URL source en tant que : /?key=value&key1=value1
.sourceSpec.attributes.spec.properties.spec.properties.headerParams
"headerParams" : {"Content-Type" : "application/json", "x-api-key" : "key"}
sourceSpec.attributes.spec.properties.bodyParams
sourceSpec.attributes.spec.properties.contentPath
sourceSpec.attributes.spec.properties.contentPath.path
$.emails
sourceSpec.attributes.spec.properties.contentPath.skipAttributes
[total_items]
sourceSpec.attributes.spec.properties.contentPath.keepAttributes
[total_items]
sourceSpec.attributes.spec.properties.contentPath.overrideWrapperAttribute
contentPath
.email
sourceSpec.attributes.spec.properties.explodeEntityPath
sourceSpec.attributes.spec.properties.explodeEntityPath.path
$.email.activity
sourceSpec.attributes.spec.properties.explodeEntityPath.skipAttributes
[total_items]
sourceSpec.attributes.spec.properties.explodeEntityPath.keepAttributes
[total_items]
sourceSpec.attributes.spec.properties.explodeEntityPath.overrideWrapperAttribute
explodeEntityPath
.activity
sourceSpec.attributes.spec.properties.paginationParams
sourceSpec.attributes.spec.properties.paginationParams.type
OFFSET
: ce type de pagination vous permet d’analyser les résultats en spécifiant un index à partir duquel démarrer le tableau associé, ainsi qu’une limite du nombre de résultats renvoyés.POINTER
: ce type de pagination permet d’utiliser une variablepointer
pour pointer vers un élément particulier qui doit être envoyé avec une requête. La pagination du type de pointeur nécessite un chemin d’accès dans la payload qui pointe vers la page suivante…CONTINUATION_TOKEN
: ce type de pagination vous permet d’ajouter vos paramètres de requête ou d’en-tête avec un jeton de continuation pour récupérer les données renvoyées restantes de votre source, qui n’ont pas été renvoyées initialement en raison d’un maximum prédéterminé.PAGE
: ce type de pagination vous permet d’ajouter votre paramètre de requête avec un paramètre de pagination à parcourir par les données renvoyées par pages, à partir de la page zéro.NONE
: ce type de pagination peut être utilisé pour les sources qui ne prennent en charge aucun des types de pagination disponibles. Type de paginationNONE
renvoie l’intégralité des données de réponse après une requête.
sourceSpec.attributes.spec.properties.paginationParams.limitName
limit
ou count
.sourceSpec.attributes.spec.properties.paginationParams.limitValue
limit=10
ou count=10
.sourceSpec.attributes.spec.properties.paginationParams.offSetName
offset
.offset
sourceSpec.attributes.spec.properties.paginationParams.pointerPath
pointer
.pointer
sourceSpec.attributes.spec.properties.scheduleParams
startTime
et endTime
, qui vous permettent de définir des intervalles de temps spécifiques pour des exécutions par lots, ce qui garantit que les enregistrements récupérés lors d’une exécution par lots précédente ne soient pas récupérés à nouveau.sourceSpec.attributes.spec.properties.scheduleParams.scheduleStartParamName
since_last_changed
sourceSpec.attributes.spec.properties.scheduleParams.scheduleEndParamName
before_last_changed
sourceSpec.attributes.spec.properties.scheduleParams.scheduleStartParamFormat
scheduleStartParamName
.yyyy-MM-ddTHH:mm:ssZ
sourceSpec.attributes.spec.properties.scheduleParams.scheduleEndParamFormat
scheduleEndParamName
.yyyy-MM-ddTHH:mm:ssZ
sourceSpec.spec.properties
spec.properties
.Ressources supplémentaires appendix
Les sections suivantes apportent des informations sur les configurations supplémentaires que vous pouvez effectuer dans votre sourceSpec
, notamment la planification avancée et les schémas personnalisés.
Exemple de chemin de contenu content-path
Voici un exemple de contenu de la propriété contentPath
dans une spécification de connexion MailChimp Members.
"contentPath": {
"path": "$.members",
"skipAttributes": [
"_links",
"total_items",
"list_id"
],
"overrideWrapperAttribute": "member"
}
Exemple d’entrée utilisateur spec.properties
user-input
Voici un exemple de variable spec.properties
fournie par l’utilisateur à l’aide d’une spécification de connexion MailChimp Members.
Dans cet exemple, listId
est fourni comme faisant partie de urlParams.path
. Si vous devez récupérer le listId
d’un client, vous devez également le définir comme faisant partie de spec.properties
.
"urlParams": {
"path": "/3.0/lists/${listId}/members",
"method": "GET"
}
"spec": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"description": "Define user input parameters to fetch resource values.",
"properties": {
"listId": {
"type": "string",
"description": "listId for which members need to fetch."
}
}
}
Exemple de spécification de source source-spec
Voici une spécification de source complétée à l’aide de MailChimp Members :
"sourceSpec": {
"attributes": {
"uiAttributes": {
"isSource": true,
"isPreview": true,
"isBeta": true,
"category": {
"key": "marketingAutomation"
},
"icon": {
"key": "mailchimpMembersIcon"
},
"description": {
"key": "mailchimpMembersDescription"
},
"label": {
"key": "mailchimpMembersLabel"
}
},
"urlParams": {
"host": "https://{domain}.api.mailchimp.com",
"path": "/3.0/lists/${listId}/members",
"method": "GET"
},
"contentPath": {
"path": "$.members",
"skipAttributes": [
"_links",
"total_items",
"list_id"
],
"overrideWrapperAttribute": "member"
},
"paginationParams": {
"type": "OFFSET",
"limitName": "count",
"limitValue": "100",
"offSetName": "offset"
},
"scheduleParams": {
"scheduleStartParamName": "since_last_changed",
"scheduleEndParamName": "before_last_changed",
"scheduleStartParamFormat": "yyyy-MM-ddTHH:mm:ss:fffffffK",
"scheduleEndParamFormat": "yyyy-MM-ddTHH:mm:ss:fffffffK"
}
},
"spec": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"description": "Define user input parameters to fetch resource values.",
"properties": {
"listId": {
"type": "string",
"description": "listId for which members need to fetch."
}
}
}
}
Configuration de différents types de pagination pour votre source pagination
Vous trouverez ci-dessous des exemples d’autres types de pagination pris en charge par les sources en libre-service (SDK par lots) :
Ce type de pagination vous permet d’analyser les résultats en spécifiant un index à partir duquel démarrer le tableau résultant, ainsi qu’une limite sur le nombre de résultats renvoyés. Par exemple :
code language-json |
---|
|
table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 6-row-2 | |
---|---|
Propriété | Description |
type |
Type de pagination utilisé pour renvoyer des données. |
limitName |
Nom de la limite avec laquelle l’API peut spécifier le nombre d’enregistrements à récupérer dans une page. |
limitValue |
Nombre d’enregistrements à récupérer dans une page. |
offSetName |
Nom de l’attribut offset. Obligatoire si le type de pagination est défini sur offset . |
endConditionName |
Une valeur définie par l’utilisateur qui indique la condition qui mettra fin à la boucle de pagination dans la requête HTTP suivante. Vous devez indiquer le nom de l’attribut sur lequel vous souhaitez mettre la condition de fin. |
endConditionValue |
La valeur d’attribut sur laquelle vous souhaitez mettre la condition de fin. |
Ce type de pagination permet d’utiliser une pointer
pour pointer vers un élément particulier qui doit être envoyé avec une requête. La pagination du type de pointeur nécessite un chemin dans la payload qui pointe vers la page suivante. Par exemple :
code language-json |
---|
|
table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 | |
---|---|
Propriété | Description |
type |
Type de pagination utilisé pour renvoyer des données. |
limitName |
Nom de la limite avec laquelle l’API peut spécifier le nombre d’enregistrements à récupérer dans une page. |
limitValue |
Nombre d’enregistrements à récupérer dans une page. |
pointerPath |
Nom de l’attribut du pointeur. Exige un chemin d’accès json vers l’attribut qui pointe vers la page suivante. |
Un type de pagination de jeton de continuation renvoie un jeton de chaîne qui signifie qu’il existe d’autres éléments qui n’ont pas pu être renvoyés, en raison d’un nombre maximal d’éléments prédéterminé qui peuvent être renvoyés dans une seule réponse.
Une source qui prend en charge le type de pagination des jetons de continuation peut avoir un paramètre de pagination similaire à :
code language-json |
---|
|
table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 | |
---|---|
Propriété | Description |
type |
Type de pagination utilisé pour renvoyer des données. |
continuationTokenPath |
La valeur qui doit être ajoutée aux paramètres de requête afin de passer à la page suivante des résultats renvoyés. |
parameterType |
La variable parameterType définit l’emplacement où parameterName doit être ajouté. La variable QUERYPARAM vous permet d’ajouter votre requête à l’aide de la propriété parameterName . La variable HEADERPARAM vous permet d’ajouter parameterName à votre requête d’en-tête. |
parameterName |
Nom du paramètre utilisé pour incorporer le jeton de continuation. Le format est le suivant : {PARAMETER_NAME}={CONTINUATION_TOKEN} . |
delayRequestMillis |
La variable delayRequestMillis dans la pagination, vous permet de contrôler le taux de requêtes envoyées à votre source. Certaines sources peuvent avoir une limite au nombre de requêtes que vous pouvez effectuer par minute. Par exemple : Zendesk est limitée à 100 requêtes par minute et définit delayRequestMillis to 850 vous permet de configurer la source pour effectuer des appels à environ 80 demandes par minute, bien en dessous du seuil de 100 demandes par minute. |
Voici un exemple de réponse renvoyée à l’aide du type de pagination du jeton de continuation :
code language-json |
---|
|
La variable PAGE
type de pagination permet de parcourir les données renvoyées par nombre de pages commençant par zéro. Lorsque vous utilisez PAGE
type pagination, vous devez indiquer le nombre d'enregistrements sur une seule page.
code language-json |
---|
|
table 0-row-2 1-row-2 2-row-2 3-row-2 4-row-2 5-row-2 6-row-2 7-row-2 layout-auto | |
---|---|
Propriété | Description |
type |
Type de pagination utilisé pour renvoyer des données. |
limitName |
Nom de la limite avec laquelle l’API peut spécifier le nombre d’enregistrements à récupérer dans une page. |
limitValue |
Nombre d’enregistrements à récupérer dans une page. |
initialPageIndex |
(Facultatif) L’index de page initial définit le numéro de page à partir duquel la pagination commencera. Ce champ peut être utilisé pour les sources où la pagination ne commence pas par 0. Si elle n’est pas fournie, l’index de page initial est défini par défaut sur 0. Ce champ exige un entier. |
endPageIndex |
(Facultatif) L’index de page de fin vous permet d’établir une condition de fin et d’arrêter la pagination. Ce champ peut être utilisé lorsque les conditions de fin par défaut pour arrêter la pagination ne sont pas disponibles. Ce champ peut également être utilisé si le nombre de pages à ingérer ou le numéro de la dernière page est fourni par le biais de l’en-tête de réponse, ce qui est courant lors de l’utilisation de PAGE pagination de type . La valeur de l’index de page de fin peut être le dernier numéro de page ou une valeur d’expression de type chaîne de l’en-tête de réponse. Par exemple, vous pouvez utiliser headers.x-pagecount pour affecter l’index de page de fin à la variable x-pagecount de l’en-tête de la réponse. Remarque: x-pagecount est un en-tête de réponse obligatoire pour certaines sources et contient la valeur nombre de pages à ingérer. |
pageParamName |
Nom du paramètre que vous devez ajouter aux paramètres de requête pour parcourir les différentes pages des données renvoyées. Par exemple : https://abc.com?pageIndex=1 renvoie la deuxième page de la charge utile renvoyée par une API. |
maximumRequest |
Nombre maximal de requêtes qu’une source peut effectuer pour une exécution incrémentielle donnée. La limite par défaut actuelle est de 10 000. |
La variable NONE
Le type de pagination peut être utilisé pour les sources qui ne prennent en charge aucun des types de pagination disponibles. Sources qui utilisent le type de pagination de NONE
renvoyez simplement tous les enregistrements récupérables lorsqu’une demande de GET est effectuée.
code language-json |
---|
|
Planification avancée pour les sources en libre-service (SDK par lots)
Configurez le planning incrémentiel et de renvoi de votre source à l’aide d’une planification avancée. La variable incremental
vous permet de configurer un planning dans lequel votre source n’ingèrera que des enregistrements nouveaux ou modifiés, tandis que la propriété backfill
vous permet de créer un planning pour l’ingestion de données historiques.
Avec la planification avancée, vous pouvez utiliser des expressions et des fonctions spécifiques à votre source pour configurer les plannings incrémentiels et de renvoi. Dans l’exemple ci-dessous, la variable Zendesk La source nécessite que le planning incrémentiel soit formaté comme type:user updated > {START_TIME} updated < {END_TIME}
et renvoyer comme type:user updated < {END_TIME}
.
"scheduleParams": {
"type": "ADVANCE",
"paramFormat": "yyyy-MM-ddTHH:mm:ssK",
"incremental": "type:user updated > {START_TIME} updated < {END_TIME}",
"backfill": "type:user updated < {END_TIME}"
}
scheduleParams.type
ADVANCE
pour utiliser le type de planification avancé.scheduleParams.paramFormat
scheduleStartParamFormat
et scheduleEndParamFormat
valeurs.scheduleParams.incremental
scheduleParams.backfill
Une fois que vous avez configuré la planification avancée, vous devez alors vous référer à la section scheduleParams
dans la section des paramètres d’URL, de corps ou d’en-tête, selon ce que votre source particulière prend en charge. Dans l’exemple ci-dessous, {SCHEDULE_QUERY}
est un espace réservé utilisé pour spécifier où les expressions de planification incrémentielle et de renvoi seront utilisées. Dans le cas d’un Zendesk source, query
est utilisé dans la variable queryParams
pour spécifier une planification avancée.
"urlParams": {
"path": "/api/v2/search/export@{if(empty(coalesce(pipeline()?.parameters?.ingestionStart,'')),'?query=type:user&filter[type]=user&','')}",
"method": "GET",
"queryParams": {
"query": "{SCHEDULE_QUERY}",
"filter[type]": "user"
}
}
Ajout d’un schéma personnalisé pour définir les attributs dynamiques de la source
Vous pouvez inclure un schéma personnalisé à votre sourceSpec
pour définir tous les attributs requis pour votre source, y compris les attributs dynamiques dont vous pourriez avoir besoin. Vous pouvez mettre à jour la spécification de connexion correspondante de votre source en adressant une requête de PUT à la fonction /connectionSpecs
point d’entrée du Flow Service lors de la fourniture de votre schéma personnalisé dans la variable sourceSpec
de votre spécification de connexion.
Voici un exemple de schéma personnalisé que vous pouvez ajouter à la spécification de connexion de votre source :
"schema": {
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"organization_id": {
"type": "integer",
"minimum": -9007199254740992,
"maximum": 9007199254740991
}
"active": {
"type": "boolean"
},
"created_at": {
"type": "string"
},
"email": {
"type": "string"
},
"iana_time_zone": {
"type": "string"
},
"id": {
"type": "integer"
},
"locale": {
"type": "string"
},
"locale_id": {
"type": "integer"
},
"moderator": {
"type": "boolean"
},
"name": {
"type": "string"
},
"only_private_comments": {
"type": "boolean"
},
"report_csv": {
"type": "boolean"
},
"restricted_agent": {
"type": "boolean"
},
"result_type": {
"type": "string"
},
"role": {
"type": "integer"
},
"shared": {
"type": "boolean"
},
"shared_agent": {
"type": "boolean"
},
"suspended": {
"type": "boolean"
},
"ticket_restriction": {
"type": "string"
},
"time_zone": {
"type": "string"
},
"two_factor_auth_enabled": {
"type": "boolean"
},
"updated_at": {
"type": "string"
},
"url": {
"type": "string"
},
"verified": {
"type": "boolean"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
Étapes suivantes
Une fois vos spécifications de source renseignées, vous pouvez procéder à la configuration des spécifications d’exploration pour la source que vous souhaitez intégrer à Platform. Consultez le document sur configuration des spécifications d’exploration pour plus d’informations.