Les 18: Interactie met externe diensten via webhooks
Een webhook is een op HTTP gebaseerde callback-functie die een externe dienst aanroept om een gebeurtenis te melden, waarbij een payload met gegevens wordt meegestuurd. Webhooks maken communicatie mogelijk tussen verschillende webapps en diensten.
Enkele voorbeelden van diensten die webhooks aanroepen:
- GitHub, wanneer een commit naar een repository wordt gepusht
- Dropbox, wanneer een document wordt bijgewerkt
- WooCommerce, wanneer een bestelling wordt geplaatst
- Microsoft Teams, om opgemaakte tekstberichten te ontvangen en in publieke kanalen te plaatsen
- ConvertKit, wanneer een abonnee wordt geactiveerd
Met Gato GraphQL kun je Persisted Queries maken die als webhooks fungeren:
- Omdat de Persisted Query beschikbaar is onder een eigen URL, kan deze worden gebruikt als doel voor de webhook
- Elke Persisted Query kan exclusief omgaan met een specifieke webhook
In deze tutorialles maken we een Persisted Query om te communiceren met ConvertKit.
De webhookdocumentatie doorbladeren
De eerste stap is het lezen van de documentatie van de website en begrijpen welke gegevens via de payload worden verzonden.
Bij analyse van webhooks in ConvertKit sturen abonnee-gerelateerde gebeurtenissen een POST-verzoek naar onze URL met een JSON-payload zoals deze:
{
"subscriber": {
"id": 1,
"first_name": "John",
"email_address": "John@example.com",
"state": "active",
"created_at": "2018-02-15T19:40:24.913Z",
"fields": {
"My Custom Field": "Value"
}
}
}Gegevens uit de payload extraheren
Omdat het verzoek via POST wordt verzonden, moeten we de gegevens uit de body van het HTTP-verzoek halen (wat wordt ondersteund via de HTTP Request via Schema extensie).
Als het HTTP-verzoek via GET wordt uitgevoerd, kan de Persisted Query rechtstreeks gegevens ophalen uit de URL-parameters.
Deze GraphQL-query haalt de body van het verzoek op en converteert deze naar een JSON-object. Vervolgens extraheert het de items "subscriber.first_name" en "subscriber.email_address" uit het JSON-object en exporteert ze als dynamische variabelen:
query ExtractPayloadData {
body: _httpRequestBody
bodyJSONObject: _strDecodeJSONObject(string: $__body)
subscriberFirstName: _objectProperty(
object: $__bodyJSONObject,
by: { path: "subscriber.first_name" }
)
@export(as: "subscriberFirstName")
subscriberEmail: _objectProperty(
object: $__bodyJSONObject,
by: { path: "subscriber.email_address" }
)
@export(as: "subscriberEmail")
}De HTTP Request via Schema extensie stelt ons in staat alle gegevens van het huidige HTTP-verzoek op te halen via de volgende velden:
_httpRequestBody: Body van het HTTP-verzoek_httpRequestClientHost: Host van de client_httpRequestClientIP: IP-adres van de client (ofnullals de server niet correct is geconfigureerd)_httpRequestCookie: Waarde van een request-cookie_httpRequestCookies: Request-cookies_httpRequestDomain: Domein van de gevraagde URL_httpRequestFullURL: Gevraagde URL (inclusief queryparameters)_httpRequestHasCookie: Bevat het verzoek een bepaalde cookie?_httpRequestHasHeader: Bevat het verzoek een bepaalde header?_httpRequestHasParam: Bevat het verzoek een bepaalde parameter?_httpRequestHeader: Waarde van een request-header_httpRequestHeaders: Request-headers_httpRequestHost: Host van de gevraagde URL_httpRequestMethod: Verzoekmethode_httpRequestStringParam: Waarde van een parameter (doorgegeven via POST of GET) van het type?param=value_httpRequestStringListParam: Waarde van een parameter (doorgegeven via POST of GET) van het type?param[]=value1¶m[]=value2_httpRequestParams: Parameters doorgegeven via POST of via de URL-query_httpRequestProtocol: Verzoekprotocol_httpRequestQuery: Queryparameter-string_httpRequestReferer: Referer van het verzoek_httpRequestRequestTime: Tijdstempel van het begin van het verzoek_httpRequestScheme: Schema van de gevraagde URL_httpRequestServerIP: IP-adres van de server_httpRequestURL: Gevraagde URL (zonder queryparameters)_httpRequestURLPath: Absoluut pad (beginnend met "/") van de gevraagde URL_httpRequestUserAgent: User agent
Een actie uitvoeren met de gegevens
Zodra we de gegevens uit de payload hebben geëxtraheerd, kunnen we er een actie mee uitvoeren.
Deze GraphQL-query behandelt de gebeurtenis subscriber.subscriber_unsubscribe om een e-mail te sturen naar de persoon die zich heeft afgemeld, met het verzoek om feedback.
query CreateEmailMessage
@depends(on: "ExtractPayloadData")
{
emailMessageTemplate: _strConvertMarkdownToHTML(
text: """
Hey {$subscriberFirstName}, it's sad to let you go!
Please be welcome to complete [this form](https://forms.gle/FpXNromWAsZYC1zB8) and let us know if there is anything we can do better.
Thanks. Hope to see you back!
"""
)
emailMessage: _strReplaceMultiple(
search: ["{$subscriberFirstName}"],
replaceWith: [$subscriberFirstName],
in: $__emailMessageTemplate
)
@export(as: "emailMessage")
}
mutation SendEmail @depends(on: "CreateEmailMessage") {
_sendEmail(
input: {
to: $subscriberEmail
subject: "Would you like to give us feedback on how we can improve?"
messageAs: {
html: $emailMessage
}
}
) {
status
}
}