「Webhookって何?POSTとGETの違いがよく分からない…」 そんな疑問をお持ちのあなたへ。
この記事では、Web開発でよく耳にする「Webhook(ウェブフック)」について、わかりやすく解説しています。
さらに、Webhookでよく使われるHTTPメソッドのPOSTとGETの違いについても、具体例を紹介しています。
この2つの違いを理解することで、Webアプリケーションの開発において、より柔軟な仕組みを構築することができます。
この記事を読めば、あなたもWebhookの概念を理解し、Web開発の幅を広げられるはずです。
Webhookとは何か?
Webhook(ウェブフック)とは、あるアプリケーションやサービスから別のアプリケーションやサービスに対して、リアルタイムに情報を自動的に送信するための仕組みです。
通常、特定の「イベント」が発生した際に、そのイベントに関するデータを指定されたURLにPOSTリクエストとして送信する形で利用されます。
Webhookのメリット
Webhookを使うことで必要なときに情報を取得することができます。
情報を取得する方法には、5分おきや10分おきなど、定期的にプログラムを走らせて情報がないかを確認するプログラム(ポーリング)もありますが、この方法では、情報がたまっていないときでも情報を取りに行く必要があるため、無駄な処理が発生しサーバーに負荷がかかります。
この点、Webhookの場合は何かのイベントが発生したときのみ処理を実行するので、効率的です。
POSTとGETの違い
POSTもGETも両方ともURL経由で情報を送信する方法です。
それぞれで、送信の方法や送信できる情報量(文字数)、セキュリティの高さなどに違いがあります。
POST
POSTはGETよりも大量のデータ送信する場合や、機密性の高いデータを送信するときに使用する方法です。フォームの送信やデータのアップロードなどに使用されます。
データはリクエストボディに格納され、URLには表示されません。
後述するGETのようにURLの後ろにつけたパラメータ(?以下)の部分も、渡されたデータの中に入っています。
GET
GETは、URLの後ろパラメータ(?)としてデータを送信する方法です。クエリ文字列として送信されます。
(例:https://example.com/search?q=apple
)。
POSTのデータ送受信方法
POSTを使ってデータを送受信するときは、JSON形式でデータのやり取りをすることが一般的です。
POSTのデータ送信方法(APIからデータを取得するなど)
POSTのデータ送信は、APIからデータを取得する場合などに使用します。Webhookを使ったときに、データを供給するアプリケーション側で使われます。
例えば、GASを使って特定のURLに対してPOSTでデータを送信するときは以下のようになります。
URLに対して、optionでPOSTであることや、データなどを付与してAPIのURLを叩きます。データはJSON.stringify(data)
とすることでオブジェクトをJSONに変換しています。
function sendPostRequest() {
// 送信するデータ
const data = {
name: "John Doe",
email: "john.doe@example.com"
};
// リクエストの設定
const options = {
method: "post", // メソッドをPOSTに設定
contentType: "application/json", // データ形式をJSONに指定
payload: JSON.stringify(data), // オブジェクトをJSON文字列に変換して送信
muteHttpExceptions: true // エラーレスポンスも取得できるように設定
};
// POSTリクエストを送信
const url = "https://example.com/api/user";
const response = UrlFetchApp.fetch(url, options);
// レスポンスの処理
if (response.getResponseCode() === 200) {
const responseData = JSON.parse(response.getContentText());
Logger.log("サーバーからのレスポンス: " + responseData);
} else {
Logger.log("エラーが発生しました: " + response.getContentText());
}
}
- method:
"post"
とすることで、POSTリクエストを送信します。 - contentType:
application/json
とすることで、JSON形式のデータを送信することを指定します。 - payload:
JSON.stringify(data)
でデータをJSON文字列に変換し、送信内容として設定します。 - muteHttpExceptions:
true
にすることで、リクエストがエラーだった場合もレスポンスを受け取れます。 UrlFetchApp.fetch
の戻り値であるresponse
から、getResponseCode()
でHTTPステータスコードを取得し、200の場合は正常なレスポンスとして処理します。
POSTのデータ受信方法
POSTでデータを受信するには、専用のURLを発行します。
アプリケーション側でこのURLを叩くときにPOSTでデータを付与します。POSTで送信されたデータはJSON形式になっているので、パースしてオブジェクト形式のデータに変換する必要があります。
例えば、GASの場合はウェブアプリケーションとしてデプロイすることで、プログラムを実行するURLを発行することができます。
このURLがPOSTで叩かれると、doPostというプログラムが自動で走ります。送信されたデータは引数で受け取ります(下記では「e」に格納)
JSON形式のデータをオブジェクト形式に変換する処理はJSON.parse()
で行っています。
// POSTリクエストを受信する関数
function doPost(e) {
// 受け取ったデータをパース
const requestData = JSON.parse(e.postData.contents);
// データをログに表示(確認用)
Logger.log("受信したデータ:", requestData);
// 受信データの確認(name と emailを取り出す例)
const name = requestData.name;
const email = requestData.email;
// レスポンス用のオブジェクトを作成
const response = {
message: "データを受信しました",
receivedName: name,
receivedEmail: email
};
// JSON形式でレスポンスを返す
return ContentService.createTextOutput(JSON.stringify(response))
.setMimeType(ContentService.MimeType.JSON);
}
- doPost(e):GASの関数で、POSTリクエストが送信されると
doPost
が自動的に呼ばれます。引数e
にはリクエストの内容が含まれます。 - e.postData.contents:リクエストで送信されたデータが文字列として格納されています。
JSON.parse
を使ってJavaScriptオブジェクトに変換します。 - レスポンスの作成:
ContentService.createTextOutput
でJSON形式のレスポンスを作成し、setMimeType
でレスポンスのContent-TypeをJSONに設定します。
Webhookを提供している主なアプリケーション
世の中の様々なアプリケーションがWebhookの機能を提供しています。
- AWS
- GCP(Google Cloud Platform)
- Azure
- Github
- Zapier
- LINE
- Stripe
- Freee
- Square
など
Webhookを使ったプログラムの具体例
例えば、LINEもWebhookを提供しています。これを使うと、メッセージの送信や友だち追加、ブロックなどの何らかのイベントが発生したときに、その情報を取得して、自動でスプレッドシートに転記するといった処理をすることができます。
具体例については下記をご参考ください。