Schema-tutorial
Schema-tutorialLes 18: Interactie met externe diensten via webhooks

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 (of null als 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&param[]=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
  }
}