Şema eğitimi
Şema eğitimiDers 18: Webhook ile harici servislerle etkileşim

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ışsa null)
  • _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=value türünde bir parametrenin değeri (POST veya GET ile iletilir)
  • _httpRequestStringListParam: ?param[]=value1&param[]=value2 tü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
  }
}