Ders 18: Webhook ile harici servislerle etkileşim
Webhook, bir harici servisin belirli bir olayı bildirmek amacıyla çağırdığı, HTTP tabanlı bir geri çağrı (callback) işlevidir ve beraberinde bir veri yükü (payload) iletir. Webhook'lar, farklı web uygulamalarının ve servislerin birbirleriyle iletişim kurmasını sağlar.
Webhook çağıran servislere bazı örnekler:
- GitHub, bir repoya commit push edildiğinde
- Dropbox, bir belge güncellendiğinde
- WooCommerce, bir sipariş eklendiğinde
- Microsoft Teams, zengin metin mesajları almak ve genel kanallara gönderi yazmak için
- ConvertKit, bir abone etkinleştirildiğinde
Gato GraphQL ile webhook olarak görev yapan Persisted Queries oluşturabiliriz:
- Persisted Query kendi URL'si altında sunulduğu için webhook hedefi olarak kullanılabilir
- Her Persisted Query yalnızca belirli bir webhook ile ilgilenebilir
Bu eğitim dersinde, ConvertKit ile etkileşim kurmak için bir Persisted Query oluşturacağız.
Webhook belgelerine göz atmak
İlk adım, web sitesinin belgelerini okumak ve payload aracılığıyla hangi verilerin gönderildiğini anlamaktır.
ConvertKit'teki webhook'ları incelediğimizde, abone ile ilgili olayların URL'mize aşağıdaki gibi bir JSON payload içeren bir POST isteği gönderdiği görülmektedir:
{
"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"
}
}
}Payload'dan veri çıkarmak
İstek POST aracılığıyla gönderildiği için, HTTP isteğinin gövdesinden veri çıkarmamız gerekir (bu işlem HTTP Request via Schema eklentisi aracılığıyla desteklenmektedir).
HTTP isteği GET aracılığıyla gerçekleştiriliyorsa, Persisted Query URL parametrelerinden veri öğelerini doğrudan alabilir.
Bu GraphQL query, isteğin gövdesini alır ve onu bir JSON nesnesine dönüştürür. Ardından JSON nesnesinden "subscriber.first_name" ve "subscriber.email_address" öğelerini çıkarır ve bunları dinamik değişkenler olarak dışa aktarır:
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")
}HTTP Request via Schema eklentisi, aşağıdaki alanlar aracılığıyla mevcut HTTP isteğinin tüm verilerini almamıza olanak tanır:
_httpRequestBody: HTTP isteğinin gövdesi_httpRequestClientHost: İstemci ana bilgisayarı_httpRequestClientIP: İstemci IP adresi (sunucu doğru yapılandırılmamışsanull)_httpRequestCookie: İstek çerezi değeri_httpRequestCookies: İstek çerezleri_httpRequestDomain: İstenen URL'nin alan adı_httpRequestFullURL: İstenen URL (query parametreleri dahil)_httpRequestHasCookie: İstek belirli bir çerez içeriyor mu?_httpRequestHasHeader: İstek belirli bir başlık içeriyor mu?_httpRequestHasParam: İstek belirli bir parametre içeriyor mu?_httpRequestHeader: İstek başlığı değeri_httpRequestHeaders: İstek başlıkları_httpRequestHost: İstenen URL'nin ana bilgisayarı_httpRequestMethod: İstek yöntemi_httpRequestStringParam:?param=valuetüründe bir parametrenin değeri (POST veya GET ile iletilir)_httpRequestStringListParam:?param[]=value1¶m[]=value2türünde bir parametrenin değeri (POST veya GET ile iletilir)_httpRequestParams: POST veya URL query aracılığıyla iletilen parametreler_httpRequestProtocol: İstek protokolü_httpRequestQuery: Query parametre dizesi_httpRequestReferer: İstek yönlendiricisi (referer)_httpRequestRequestTime: İsteğin başlangıç zaman damgası_httpRequestScheme: İstenen URL'nin şeması_httpRequestServerIP: Sunucu IP adresi_httpRequestURL: İstenen URL (query parametreleri olmadan)_httpRequestURLPath: İstenen URL'nin mutlak yolu ("/" ile başlar)_httpRequestUserAgent: Kullanıcı ajanı
Verilerle bir eylem gerçekleştirmek
Payload'dan verileri çıkardıktan sonra, bu verilerle bir eylem gerçekleştirebiliriz.
Bu GraphQL query, abonelikten çıkan kişiye geri bildirim isteyen bir e-posta göndermek amacıyla subscriber.subscriber_unsubscribe olayını ele alır.
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
}
}