Pelajaran 18: Berinteraksi dengan layanan eksternal melalui webhooks
Webhook adalah fungsi callback berbasis HTTP yang dipanggil oleh layanan eksternal untuk memberi tahu suatu peristiwa, dengan menyertakan payload data bersamanya. Webhook memungkinkan berbagai webapp dan layanan untuk saling berkomunikasi.
Beberapa contoh layanan yang memanggil webhook meliputi:
- GitHub, saat sebuah repositori menerima push commit
- Dropbox, saat sebuah dokumen diperbarui
- WooCommerce, saat sebuah pesanan ditambahkan
- Microsoft Teams, untuk menerima pesan teks kaya dan memposting di saluran publik
- ConvertKit, saat seorang pelanggan diaktifkan
Dengan Gato GraphQL, kita dapat membuat Persisted Queries yang berfungsi sebagai webhook:
- Karena Persisted Query diekspos di bawah URL-nya sendiri, URL tersebut dapat digunakan sebagai target untuk webhook
- Setiap Persisted Query dapat menangani secara eksklusif suatu webhook tertentu
Dalam pelajaran tutorial ini, kita akan membuat Persisted Query untuk berinteraksi dengan ConvertKit.
Menelusuri dokumentasi webhook
Langkah pertama adalah membaca dokumentasi untuk situs web tersebut, dan memahami data apa yang dikirim melalui payload.
Dengan menganalisis webhooks di ConvertKit, peristiwa terkait pelanggan mengirimkan permintaan POST ke URL kita dengan payload JSON seperti ini:
{
"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"
}
}
}Mengekstrak data dari payload
Karena permintaan dikirim melalui POST, kita harus mengekstrak data dari body permintaan HTTP (yang didukung melalui ekstensi HTTP Request via Schema).
Jika permintaan HTTP dieksekusi melalui GET, maka Persisted Query dapat langsung mendapatkan item data dari parameter URL.
Query GraphQL ini mengambil body permintaan dan mengonversinya menjadi objek JSON. Kemudian mengekstrak item "subscriber.first_name" dan "subscriber.email_address" dari objek JSON tersebut, dan mengekspornya sebagai variabel dinamis:
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")
}Ekstensi HTTP Request via Schema memungkinkan kita mengambil semua data permintaan HTTP saat ini, melalui field-field berikut:
_httpRequestBody: Body dari permintaan HTTP_httpRequestClientHost: Host klien_httpRequestClientIP: Alamat IP klien (ataunulljika server tidak dikonfigurasi dengan benar)_httpRequestCookie: Nilai cookie permintaan_httpRequestCookies: Cookie-cookie permintaan_httpRequestDomain: Domain dari URL yang diminta_httpRequestFullURL: URL yang diminta (termasuk parameter query)_httpRequestHasCookie: Apakah permintaan mengandung cookie tertentu?_httpRequestHasHeader: Apakah permintaan mengandung header tertentu?_httpRequestHasParam: Apakah permintaan mengandung parameter tertentu?_httpRequestHeader: Nilai header permintaan_httpRequestHeaders: Header-header permintaan_httpRequestHost: Host dari URL yang diminta_httpRequestMethod: Metode permintaan_httpRequestStringParam: Nilai suatu parameter (dikirim melalui POST atau GET) bertipe?param=value_httpRequestStringListParam: Nilai suatu parameter (dikirim melalui POST atau GET) bertipe?param[]=value1¶m[]=value2_httpRequestParams: Parameter yang dikirim baik melalui POST maupun melalui URL query_httpRequestProtocol: Protokol permintaan_httpRequestQuery: String parameter query_httpRequestReferer: Referer permintaan_httpRequestRequestTime: Timestamp saat permintaan dimulai_httpRequestScheme: Skema dari URL yang diminta_httpRequestServerIP: Alamat IP server_httpRequestURL: URL yang diminta (tanpa parameter query)_httpRequestURLPath: Path absolut (dimulai dengan "/") dari URL yang diminta_httpRequestUserAgent: User agent
Menjalankan aksi dengan data
Setelah kita mengekstrak data dari payload, kita dapat menjalankan suatu aksi dengan data tersebut.
Query GraphQL ini menangani peristiwa subscriber.subscriber_unsubscribe, untuk mengirim email kepada orang yang berhenti berlangganan, meminta umpan balik.
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
}
}