Tutorial dello schema
Tutorial dello schemaLezione 18: Interagire con servizi esterni tramite webhook

Lezione 18: Interagire con servizi esterni tramite webhook

Un webhook è una funzione di callback basata su HTTP che un servizio esterno chiama per notificare un evento, trasmettendo insieme ad esso un payload di dati. I webhook consentono a diverse applicazioni web e servizi di comunicare tra loro.

Alcuni esempi di servizi che invocano webhook includono:

  • GitHub, quando viene eseguito il push di un commit in un repository
  • Dropbox, quando un documento viene aggiornato
  • WooCommerce, quando viene aggiunto un ordine
  • Microsoft Teams, per ricevere messaggi in testo formattato e pubblicarli nei canali pubblici
  • ConvertKit, quando un iscritto viene attivato

Con Gato GraphQL, possiamo creare Persisted Queries che fungono da webhook:

  • Poiché la Persisted Query è esposta sotto il proprio URL, può essere utilizzata come destinazione del webhook
  • Ogni Persisted Query può occuparsi esclusivamente di uno specifico webhook

In questa lezione del tutorial, creeremo una Persisted Query per interagire con ConvertKit.

Consultare la documentazione del webhook

Il primo passo consiste nel leggere la documentazione del sito web e nel capire quali dati vengono inviati tramite il payload.

Analizzando i webhook in ConvertKit, gli eventi relativi agli iscritti inviano una richiesta POST al nostro URL con un payload JSON come questo:

{
  "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"
    }
  }
}

Estrarre i dati dal payload

Poiché la richiesta viene inviata tramite POST, dobbiamo estrarre i dati dal corpo della richiesta HTTP (operazione supportata tramite l'estensione HTTP Request via Schema).

Se la richiesta HTTP viene eseguita tramite GET, la Persisted Query può direttamente ottenere gli elementi di dati dai parametri URL.

Questa query GraphQL recupera il corpo della richiesta e lo converte in un oggetto JSON. Poi estrae gli elementi "subscriber.first_name" e "subscriber.email_address" dall'oggetto JSON, e li esporta come variabili dinamiche:

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")
}

L'estensione HTTP Request via Schema ci consente di recuperare tutti i dati della richiesta HTTP corrente, tramite i seguenti campi:

  • _httpRequestBody: Corpo della richiesta HTTP
  • _httpRequestClientHost: Host del client
  • _httpRequestClientIP: Indirizzo IP del client (o null se il server non è configurato correttamente)
  • _httpRequestCookie: Valore del cookie della richiesta
  • _httpRequestCookies: Cookie della richiesta
  • _httpRequestDomain: Dominio dell'URL richiesto
  • _httpRequestFullURL: URL richiesto (inclusi i parametri di query)
  • _httpRequestHasCookie: La richiesta contiene un determinato cookie?
  • _httpRequestHasHeader: La richiesta contiene un determinato header?
  • _httpRequestHasParam: La richiesta contiene un determinato parametro?
  • _httpRequestHeader: Valore dell'header della richiesta
  • _httpRequestHeaders: Header della richiesta
  • _httpRequestHost: Host dell'URL richiesto
  • _httpRequestMethod: Metodo della richiesta
  • _httpRequestStringParam: Valore di un parametro (passato tramite POST o GET) del tipo ?param=value
  • _httpRequestStringListParam: Valore di un parametro (passato tramite POST o GET) del tipo ?param[]=value1&param[]=value2
  • _httpRequestParams: Parametri passati tramite POST o tramite la query URL
  • _httpRequestProtocol: Protocollo della richiesta
  • _httpRequestQuery: Stringa dei parametri di query
  • _httpRequestReferer: Referrer della richiesta
  • _httpRequestRequestTime: Timestamp dell'inizio della richiesta
  • _httpRequestScheme: Schema dell'URL richiesto
  • _httpRequestServerIP: Indirizzo IP del server
  • _httpRequestURL: URL richiesto (senza i parametri di query)
  • _httpRequestURLPath: Percorso assoluto (che inizia con "/") dell'URL richiesto
  • _httpRequestUserAgent: User agent

Eseguire un'azione con i dati

Una volta estratti i dati dal payload, possiamo eseguire un'azione con essi.

Questa query GraphQL gestisce l'evento subscriber.subscriber_unsubscribe, per inviare un'email alla persona che si è disiscritto, chiedendole un 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
  }
}