Lektion 18: Interaktion mit externen Diensten über Webhooks
Ein Webhook ist eine HTTP-basierte Callback-Funktion, die ein externer Dienst aufruft, um über ein Ereignis zu benachrichtigen, und dabei eine Nutzlast mit Daten überträgt. Webhooks ermöglichen es verschiedenen Web-Apps und Diensten, miteinander zu kommunizieren.
Einige Beispiele für Dienste, die Webhooks aufrufen:
- GitHub, wenn ein Commit in ein Repository gepusht wird
- Dropbox, wenn ein Dokument aktualisiert wird
- WooCommerce, wenn eine Bestellung hinzugefügt wird
- Microsoft Teams, um formatierten Text zu empfangen und in öffentlichen Kanälen zu veröffentlichen
- ConvertKit, wenn ein Abonnent aktiviert wird
Mit Gato GraphQL können wir Persisted Queries erstellen, die als Webhooks fungieren:
- Da die Persisted Query unter ihrer eigenen URL verfügbar ist, kann sie als Ziel für den Webhook verwendet werden
- Jede Persisted Query kann sich ausschließlich um einen bestimmten Webhook kümmern
In dieser Tutorial-Lektion erstellen wir eine Persisted Query zur Interaktion mit ConvertKit.
Die Webhook-Dokumentation durchsehen
Der erste Schritt besteht darin, die Dokumentation der Website zu lesen und zu verstehen, welche Daten über die Nutzlast gesendet werden.
Bei der Analyse der Webhooks in ConvertKit senden abonnentenrelevante Ereignisse eine POST-Anfrage an unsere URL mit einer JSON-Nutzlast wie dieser:
{
"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"
}
}
}Die Daten aus der Nutzlast extrahieren
Da die Anfrage über POST gesendet wird, müssen wir die Daten aus dem Body der HTTP-Anfrage extrahieren (was über die Erweiterung HTTP Request via Schema unterstützt wird).
Wenn die HTTP-Anfrage über GET ausgeführt wird, kann die Persisted Query die Datenelemente direkt aus den URL-Parametern abrufen.
Diese GraphQL-query ruft den Body der Anfrage ab und wandelt ihn in ein JSON-Objekt um. Dann extrahiert sie die Elemente "subscriber.first_name" und "subscriber.email_address" aus dem JSON-Objekt und exportiert sie als dynamische Variablen:
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")
}Die Erweiterung HTTP Request via Schema ermöglicht es uns, alle Daten der aktuellen HTTP-Anfrage über folgende Felder abzurufen:
_httpRequestBody: Body der HTTP-Anfrage_httpRequestClientHost: Client-Host_httpRequestClientIP: IP-Adresse des Clients (odernull, wenn der Server nicht richtig konfiguriert ist)_httpRequestCookie: Cookie-Wert der Anfrage_httpRequestCookies: Cookies der Anfrage_httpRequestDomain: Domain der angeforderten URL_httpRequestFullURL: Angeforderte URL (einschließlich der Query-Parameter)_httpRequestHasCookie: Enthält die Anfrage ein bestimmtes Cookie?_httpRequestHasHeader: Enthält die Anfrage einen bestimmten Header?_httpRequestHasParam: Enthält die Anfrage einen bestimmten Parameter?_httpRequestHeader: Header-Wert der Anfrage_httpRequestHeaders: Header der Anfrage_httpRequestHost: Host der angeforderten URL_httpRequestMethod: Anfragemethode_httpRequestStringParam: Wert eines Parameters (über POST oder GET übergeben) vom Typ?param=value_httpRequestStringListParam: Wert eines Parameters (über POST oder GET übergeben) vom Typ?param[]=value1¶m[]=value2_httpRequestParams: Parameter, die über POST oder die URL-Query übergeben werden_httpRequestProtocol: Protokoll der Anfrage_httpRequestQuery: Query-Parameter-String_httpRequestReferer: Referer der Anfrage_httpRequestRequestTime: Zeitstempel des Anfragestarts_httpRequestScheme: Schema der angeforderten URL_httpRequestServerIP: IP-Adresse des Servers_httpRequestURL: Angeforderte URL (ohne Query-Parameter)_httpRequestURLPath: Absoluter Pfad (beginnend mit "/") der angeforderten URL_httpRequestUserAgent: User-Agent
Eine Aktion mit den Daten ausführen
Sobald wir die Daten aus der Nutzlast extrahiert haben, können wir eine Aktion damit ausführen.
Diese GraphQL-query verarbeitet das Ereignis subscriber.subscriber_unsubscribe, um eine E-Mail an die Person zu senden, die sich abgemeldet hat, und um Feedback zu bitten.
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
}
}