😊
自分がWebhook開発する前に知りたかった知見を共有
はじめに
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