บทช่วยสอน Schema
บทช่วยสอน Schemaบทเรียนที่ 27: การ ping ไปยังบริการภายนอก

บทเรียนที่ 27: การ ping ไปยังบริการภายนอก

เราสามารถ ping ไปยังบริการภายนอกเกี่ยวกับทรัพยากรใหม่ที่เพิ่มเข้ามาในเว็บไซต์ของเรา พร้อมส่งต่อข้อมูลทั้งที่จัดเก็บไว้ในเว็บไซต์และ/หรือที่ให้มาผ่านพารามิเตอร์หรือ header

ในคิวรีนี้ เราดึง ID ของคอมเมนต์ที่เพิ่มเข้ามาในช่วง 24 ชั่วโมงที่ผ่านมา และสำหรับแต่ละรายการ เราส่ง ping ไปยังบริการภายนอก โดยส่ง ID ของคอมเมนต์เป็นพารามิเตอร์ใน URL และส่งต่อ header บางส่วนจาก HTTP request ปัจจุบัน:

{
  timeNow: _time  
  time24HsAgo: _intSubtract(subtract: 86400, from: $__timeNow)
  date24HsAgo: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__time24HsAgo)
 
  comments(filter: { dateQuery: { after: $__date24HsAgo } } ) {
    commentID: id
    url: _urlAddParams(
      url: "https://somewebsite.com/ping-new-comment",
      params: {
        commentID: $__commentID
      }
    )
    headers: _httpRequestHeaders
      @remove
    requiredHeaders: _objectKeepProperties(
      object: $__headers,
      keys: ["user-agent", "origin"]
    )
      @remove
    headerNameValueEntryList: _objectConvertToNameValueEntryList(
      object: $__requiredHeaders
    )
    _sendHTTPRequest(input: {
      url: $__url
      method: GET
      options: {
        headers: $__headerNameValueEntryList
      }
    }) {
      statusCode
      contentType
      body
    }
  }
}

หากบริการภายนอกสามารถรับข้อมูลของทรัพยากรหลายรายการได้ เราสามารถรวบรวมข้อมูลทั้งหมด แล้วส่ง ping เพียงครั้งเดียว:

query ExportData {
  timeNow: _time  
  time24HsAgo: _intSubtract(subtract: 86400, from: $__timeNow)
  date24HsAgo: _date(format: "Y-m-d\\TH:i:sO", timestamp: $__time24HsAgo)
 
  comments(filter: { dateQuery: { after: $__date24HsAgo } } )
    @export(as: "commentIDs")
  {
    id
  }
 
  hasComments: _notEmpty(value: $__comments)
    @export(as: "hasComments")
    @remove
}
 
query SendPing
  @depends(on: "ExportData")
  @include(if: $hasComments)
{
  url: _urlAddParams(
    url: "https://somewebsite.com/ping-new-comments",
    params: {
      commentIDs: $commentIDs
    }
  )
  headers: _httpRequestHeaders
    @remove
  requiredHeaders: _objectKeepProperties(
    object: $__headers,
    keys: ["user-agent", "origin"]
  )
    @remove
  headerNameValueEntryList: _objectConvertToNameValueEntryList(
    object: $__requiredHeaders
  )
  _sendHTTPRequest(input: {
    url: $__url
    method: GET
    options: {
      headers: $__headerNameValueEntryList
    }
  }) {
    statusCode
    contentType
    body
  }
}