😊

自分がWebhook開発する前に知りたかった知見を共有

2020/10/25に公開

はじめに

TimeCrowdという時間共有サービスを提供している pandeiro245 です。
私はコード書くのは好きなのですが役割としてはビジネスサイド寄りであり、プロダクションコードは書かないのと決めています。ただし、自社サービスや他社様のAPIを使って繋ぎこむことで顧客ニーズを満たせそうな場合にコードを書くことがあります。
そんなときによく使うのがWebhook。

先に結論

webhookを受け取ったら最速でDBに保存し、その後に実行するのがいいと思います。

何も考えない実装

例えば何かしらのwebhookを受け取ったらSlackに投稿するような場合、こんな感じにしていました。(コードはRubyです)

class WebookController
  def create
    Slack.new.post(params[:body])
  end
end

これだとSlackに投稿されないみたいな不具合が発生した時、検証のたびにwebhookを手動で再発生しなくてはならず大変です。(大変でした)

安心な実装

class WebookController
  def create
    webhook = Webhook.new(raw: params.to_json)
    webhook.save!(validate: false)
    webhook.exec
  end
end

class Webhook
  def exec
    Slack.new.post(data['body'])
  end

  def data
    JSON.parse(raw)
  end
end

これであれば失敗しているのを発見しても

Webhook.last.exec

みたいなのをコンソールから叩けば何回でも検証できます。
saveするときにvalidate:falseとしていますがとにかく最速かつ確実にDBに保存することが大切。
上記以外にもexec メソッドの実行が成功したのか失敗したのかを保存したり色々するとどんどんWebhook開発が楽になりました。

おわりに

「SlackのWebhookの使い方」みたいな記事はあってももっと抽象度の高い考え方についての記事が見当たらなかったので書いてみました。
もっと良さそうな方法や別のWebhookに関する知見がありましたらお知らせ頂けると幸いです…!

Discussion