10 分でできる REST API モックサーバ構築(GAS編)
こんにちは!アルダグラムでエンジニアをしている安政です。
外部サービスとの API 連携開発をおこなっていると、
- 受け取り側のサービスにテスト環境を用意するのが難しい
- 開発中のサービスのため、API サーバが構築されていない
といった問題に遭遇することがあるかもしれません。
そのような場合、Google Apps Script を用いるとPOSTされたデータが保存されるモックサーバを簡単に構築できます。
もちろん、業務上重要なデータは送信しないようにしてくださいね。
今回は、「Google Apps Script」 でリクエストを受け取り、「Google Spread Sheets」 にデータが格納されることを試していきたいと思います。
GAS を用いて API サーバーを公開しよう
最初に、データを溜めていきたい Google Spread Sheet を用意してください。
シートに名前をつけましょう。
1 行目に受け取りたいカラム名を入れてください。
今回は「StackOfBooks」というシート名で、「Title」「Status」「URL」というカラムを用意してみました。
読みたい本が溜まっちゃうのは世の常ですね。
用意ができましたら、「ツールバー」の「拡張機能」の箇所から、「Apps Script」を選択してください。
選択をすると「Apps Script」のコード入力画面が出てきたかと思います。
この画面に実行用のスクリプトを記載することで、取得した後の動作等を記載することができます。
この記事では、全体の流れについて記述したいので、各メソッドについての解説はコード内のコメントとして記載しようと思います。
// API を受け取る関数
// 関数名は doPost にする必要がある
function doPost(e){
let contents = e.postData.getDataAsString();
// デバッガを用いてテストをする場合は、コメントを外す
// let contents = '{"Title": "LEADING QUALITY", "Status": "Reading", "URL": "https://www.amazon.co.jp/LEADING-QUALITY-Ronald-Cummings-John/dp/4048931121"}';
main(contents);
let outputContent = getOutputContent();
return outputContent;
}
function getOutputContent(){
let output = ContentService.createTextOutput();
output.setMimeType(ContentService.MimeType.JSON);
output.setContent(JSON.stringify({ message: "success" }));
return output;
}
// 受け取ったパラメータの処理を行う準備をする
function main(message){
// 格納したいシートを指定
let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('StackOfBooks');
// カラム名と列のマッピングを行う
let colMapping = createColIndex(sheet)
// メッセージのパース
let params = JSON.parse(message);
// データのインサートを行う
insertRow(sheet, params, colMapping);
}
//カラム名からカラムidの表を生成する (col_hash)
function createColIndex(sheet){
// ヘッダー行の指定
let headerRow = sheet.getDataRange().getValues()[0];
// 何列めまでカラムが設定されているかを指定する
let idColomnNum = getIdColomnNum(headerRow);
// マッピングをおこなっていく
let currentColomn = idColomnNum
let result = {}
let currentRange = sheet.getRange(1, currentColomn)
while(currentRange.getValue() !== ""){
result[currentRange.getValue()] = currentColomn
currentColomn+=1;
currentRange = sheet.getRange(1, currentColomn)
}
return result;
}
// データの左端カラムの位置を取得。
function getIdColomnNum(headerRow){
let i = 0
for (const header of headerRow){
if ( header === ""){
i++;
continue;
} else {
break;
}
}
return i + 1;
}
// データをインサートしていく
function insertRow(sheet, params, colMapping){
// 一番下の行を取得
let lastRowNum = sheet.getLastRow();
let insertRowNum = lastRowNum + 1;
for (const colName of Object.keys(params)){
let value = params[colName]
let colIndex = colMapping[colName]
sheet.getRange(insertRowNum, colIndex).setValue(value)
}
}
Apps Script のデバッグ機能等を用いて、必要な動作の確認を行なってください。
最後に、API の公開を行います。
画面右上に「デプロイ」と大きく表示されていると思うので、「新しいデプロイ」を選択してください。
種類は「ウェブアプリ」を選択しましょう。
「アクセスできるユーザー」は全員としてください。
デプロイが完了すると、ウェブアプリのリンクとIDが表示されるのでコピーしたおきましょう。
これで、誰でも実行可能な API が公開されました。
こちらの API にアクセスすると、Spread Sheet にデータが格納されます。
$ curl -L \
'https://script.google.com/macros/s/{作成されたIDを指定する}/exec' \
-d '{"Title": "LEADING QUALITY", "Status": "Reading", "URL": "https://www.amazon.co.jp/LEADING-QUALITY-Ronald-Cummings-John/dp/4048931121"}'
{"message":"success"}
最後に
Google Apps Script を利用すると、とても簡単にモックサーバーを作ることができました。
開発の生産性を上げる一つの選択肢になると嬉しいです。
誰でも簡単に使えるものを作れる Google はやはり素晴らしいと思います。
私たちも利便性と拡張性のバランスをとりながら、プロダクト開発をしていきたいですね。
もっとアルダグラムエンジニア組織を知りたい人、ぜひ下記の情報をチェックしてみてください
株式会社アルダグラムのTech Blogです。 世界中のノンデスクワーク業界における現場の生産性アップを実現する現場DXサービス「KANNA」を開発しています。 採用情報はこちら: herp.careers/v1/aldagram0508/
Discussion