Skip to content
気ままに、ちまちま。テックと日常。

【HubSpot】はじめてのHubSpotサーバーレス関数(中編):公開APIと連携してみよう🧪

【HubSpot】はじめてのHubSpotサーバーレス関数(中編):公開APIと連携してみよう🧪
9:05
目次

✅ はじめに

前編では、HubSpotのサーバーレス関数を使って「Hello World」を返す関数をつくってみました。
関数をフォルダで管理したり、serverless.json でエンドポイントを指定したり、
HubSpotでちょっとしたサーバー処理ができることを体験できたと思います🧪

{% module_block module "widget_6fb2e3b6-21b6-4671-aab2-6451721b981d" %}{% module_attribute "child_css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "label" is_json="true" %}null{% end_module_attribute %}{% module_attribute "module_id" is_json="true" %}187384186941{% end_module_attribute %}{% module_attribute "page_url" is_json="true" %}{"content_id":null,"href":"https://blog.ryamagami.com/hubspot-serverless-func-01","type":"EXTERNAL"}{% end_module_attribute %}{% module_attribute "schema_version" is_json="true" %}2{% end_module_attribute %}{% module_attribute "tag" is_json="true" %}"module"{% end_module_attribute %}{% end_module_block %}

 

中編ではいよいよ、外部の公開API(The Cat API)を fetch してデータを取得することにチャレンジします!

サーバーレス関数の本領発揮は、やっぱり「どこかのAPIと連携してデータを使う」とき✨

今回は
🐱 かわいい猫の画像を外部APIから取得して
🎨 その画像をHubSpotのページに表示する
というところまでをゴールに進めていきます!

「サーバーとやり取りできるってこういうことか〜!」と実感できる、やさしくて実用的なステップなので、
ぜひ一緒に楽しみながらやってみましょう🐾💻🌸

ChatGPT Image 2025年3月26日 22_43_42

🐱 Cat API を使うよ

今回使うのは、The Cat APIという公開APIです。
アクセスするたびに、いろんな猫ちゃんの画像を返してくれるという、癒しのAPI🐾
公式でも “Cats as a service” というキャッチコピーを使っていて、遊び心も満点です!

{% module_block module "widget_d7b68e76-d930-4d6d-851e-4c3073fe8739" %}{% module_attribute "child_css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "label" is_json="true" %}null{% end_module_attribute %}{% module_attribute "module_id" is_json="true" %}187384186941{% end_module_attribute %}{% module_attribute "page_url" is_json="true" %}{"content_id":null,"href":"https://thecatapi.com/","type":"EXTERNAL"}{% end_module_attribute %}{% module_attribute "schema_version" is_json="true" %}2{% end_module_attribute %}{% module_attribute "tag" is_json="true" %}"module"{% end_module_attribute %}{% end_module_block %}

 

🌐 こんなAPIもあるよ(気軽に使える公開APIの例)

  • JSONPlaceholder:ダミーの投稿・ユーザー情報など(テスト用途にぴったり)

  • Dog API:犬画像が返ってくるAPI 🐶

  • Bored API:退屈な時にやることを提案してくれるAPI🎲

  • OpenWeatherMap:天気API(APIキー必須だけど無料プランあり)

 

🧪 今回使うエンドポイント

https://api.thecatapi.com/v1/images/search

このURLに GET リクエストを送ると、ランダムな猫画像が1件返ってきます。

 

🔍 返ってくるデータの例

[
  {
    "id": "abc123",
    "url": "https://cdn2.thecatapi.com/images/abc123.jpg",
    "width": 1200,
    "height": 800
  }
]
画像のURLは url に入っています。これを使えば、画像としてページに表示することもできます🐱
 
 

🔑 認証は…今回はなしでOK!

The Cat API には無料のAPIキーがありますが、
公式ドキュメントの Quick start にもあるように、
APIキーなしでも動作すると明記されています。

🐾 今回は、ドキュメントにも載っている Quick start(APIキーなし) の方法で進めてみます!

 

📝 関数を作ってみよう!

ではさっそく、Cat API を呼び出すサーバーレス関数を作ってみましょう!

📁 フォルダ構成を用意する

まずは、以下のようなフォルダを用意します👇(基本的な流れは前編と同じ!)

fetch-cat/
└── fetch-cat.functions/
    ├── fetch-cat.js
    └── serverless.json

それぞれのファイルを、以下のように作っていきます。

🐾 fetch-cat.js(関数の本体)

{% module_block module "widget_2b35673b-3472-45d9-9665-55ada79cfa7d" %}{% module_attribute "child_css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "code_snippet" is_json="true" %}"// fetch-cat.js\nexports.main = async (context = {}, sendResponse) => {\n try {\n const response = await fetch('https://api.thecatapi.com/v1/images/search');\n const data = await response.json();\n\n sendResponse({\n statusCode: 200,\n body: JSON.stringify(data),\n });\n } catch (error) {\n sendResponse({\n statusCode: 500,\n body: JSON.stringify({ error: 'Cat API fetch failed' }),\n });\n }\n};"{% end_module_attribute %}{% module_attribute "css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "label" is_json="true" %}null{% end_module_attribute %}{% module_attribute "language" is_json="true" %}"js"{% end_module_attribute %}{% module_attribute "module_id" is_json="true" %}186956009289{% end_module_attribute %}{% module_attribute "schema_version" is_json="true" %}2{% end_module_attribute %}{% module_attribute "showLangTab" is_json="true" %}true{% end_module_attribute %}{% module_attribute "tag" is_json="true" %}"module"{% end_module_attribute %}{% module_attribute "useLineNumbers" is_json="true" %}true{% end_module_attribute %}{% end_module_block %}

 

💡 解説

  • fetch() でCat APIにアクセス

  • await response.json() でレスポンスの中身を取り出す

  • そのまま sendResponse() で返すことで、ページからアクセスできるようにします

🐌 さらに解説!

await ってなに?

const response = await fetch('https://api.thecatapi.com/v1/images/search');

await は「この処理が終わるまで待つ」という意味!
👉 APIにリクエストして、返事が返ってくるまで待つ って意味

response.json() ってなに?

const data = await response.json();

APIの返してきたレスポンス本文を、JSONとして取り出すという意味
👉 The Cat API は JSON 形式でデータを返してくれるから、それをちゃんと使える形にするために .json() を使ってる🐱

sendResponse({ statusCode: 200, body: ... }) は?

  • statusCode: 200 は「成功したよ!」っていうHTTPの合図
  • body に返すデータ(この場合は猫画像の情報)を文字列で渡してる

👉 JSON データを返すには、JSON.stringify(...) で文字列に変換する

catch (error) { ... } の中身は?

} catch (error) {
  sendResponse({
    statusCode: 500,
    body: JSON.stringify({ error: 'Cat API fetch failed' }),
  });
}

  1. try { ... } で fetch の処理をして
  2. もしエラー(通信失敗、APIの返答が不正など)が起きたら
  3. catch に入り、500(サーバーエラー)とエラーメッセージを返す

👉 問題があった時にユーザー側で「うまくいかなかった」ってわかるようになってる 🐾

処理 意味
await 結果が返ってくるまで待つ
fetch() 外部APIにアクセスする
response.json() 返ってきたレスポンスをJSONとして読む
sendResponse({ statusCode: 200, body: ... }) 正常にデータを返す
catch (error) エラーが起きたときに備える保険のような処理

 

📄 serverless.json(関数の設定ファイル)

{
  "runtime": "nodejs18.x",
  "version": "1.0",
  "endpoints": {
    "fetch-cat": {
      "method": "GET",
      "file": "fetch-cat.js"
    }
  }
}

これで /fetch-cat.functions/ の中にある fetch-cat.js
/_hcms/api/fetch-cat というURLで呼び出せるようになります!

 

🌎 関数を呼び出して確認しよう!

関数と設定ファイルの準備ができたら、さっそくHubSpotにアップロードして、実際に動かしてみましょう🧪✨

🚀 アップロードしよう

hs upload コマンドを使って、デザインマネージャー上にアップロードしましょう

serverless-func11

🌐 URLでアクセスしてみよう!

アップロードが完了したら、以下のURLにアクセスします👇

https://[あなたのドメイン(HubSpot に接続しているドメイン)]/_hcms/api/fetch-cat

成功していれば、こんな👇JSONが表示されるはずです🎉

serverless-func12

✅ 実際の画像URLをブラウザで開くと…かわいい猫ちゃんに会えます🐱💕

serverless-func13

❓うまくいかない時は…

  • 関数名や serverless.json"file" が間違ってないか確認

  • 関数がアップロードされた先のパスと、URLのパス(fetch-cat)が一致してるか確認

  • 開発者ツールのconsole にエラーが出ていれば、catch の部分で返されたメッセージを参考にする

 

🎨 取得した画像をページに表示してみよう!

せっかく猫ちゃんの画像URLが取れたので、それをページに表示してみましょう!
ここでは、HubSpotのページ内に JavaScript を使って猫画像を埋め込む方法を紹介します💡

✅ どんな仕組み?

  • HTMLに表示エリア(div)を用意しておいて

  • JavaScriptの fetch()/fetch-cat 関数を呼び出して

  • 取得した画像URLを <img> タグに反映する
    という流れです🐾

✨ 表示の方法

今回はテスト用のページテンプレートを作ってそこに表示させるコードを入れてこうと思います🐾(もちろん既存のページテンプレートやカスタムモジュールで応用してもOK!)

  1. デザインマネージャーを開く
  2. 新しいテンプレートを作成
    📄 名前:fetch-cat.html とか!
  3. テンプレートに以下を貼り付けて保存&プレビュー✨

🧪 テンプレート例 

👇はボイラープレート テンプレートを使用した場合

{% module_block module "widget_19d4042b-1885-43ee-98b6-d602c13009de" %}{% module_attribute "child_css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "code_snippet" is_json="true" %}"{% extends \"./layouts/base.html\" %}\n\n{% block body %}\n
\n

🐱 Cat API テストページ

\n
\n

Loading a cute cat...

\n
\n\n \n
\n{% endblock %}"{% end_module_attribute %}{% module_attribute "css" is_json="true" %}null{% end_module_attribute %}{% module_attribute "label" is_json="true" %}null{% end_module_attribute %}{% module_attribute "module_id" is_json="true" %}186956009289{% end_module_attribute %}{% module_attribute "schema_version" is_json="true" %}2{% end_module_attribute %}{% module_attribute "showLangTab" is_json="true" %}true{% end_module_attribute %}{% module_attribute "tag" is_json="true" %}"module"{% end_module_attribute %}{% end_module_block %}

 

🔍 解説

意味
fetch('/_hcms/api/fetch-cat') 作成したサーバーレス関数を呼び出す
data[0].url Cat APIのJSONから画像URLを取り出す
document.createElement('img') 新しく <img> タグを作る
container.innerHTML = '' 「Loading...」のテキストを消して表示を切り替える
container.appendChild(img) div の中に画像を追加する
.catch() 失敗した場合のフォールバック処理(テキスト表示+consoleにエラー)
 

※ 新しいテンプレートファイルを作成した場合は、<dody> 内にある {% dnd_area "dnd_area" ... を削除した上で(ドラッグアンドドロップエリアは不要なので)、<div ...> </div> の間のコードを使ってね

serverless-func14

テンプレートが書けたら変更を公開して、プレビュー!

👇のように かわいい猫画像がロードされたら大成功です!🎉👏

fetch-cat-2

🐱 おわりに

今回は、前編で作ったサーバーレス関数をベースに、
外部の公開API(The Cat API)をfetchしてデータを取得するという体験をしてみました🐾

ただデータを取得するだけでなく、取得した画像をページに表示するところまでやってみると、
「HubSpot CMSでも、動的な表示ができるんだ!」という実感が持てたのではないでしょうか?🖼️✨


💡 今回のポイントをふりかえると…

  • fetchの使い方(await / response.json())を体験できた

  • サーバーレス関数の返り値を、JavaScriptでページに反映する方法を知れた

  • エラーハンドリングや初期表示(Loading)など、実用のヒントもちょこっと登場◎


次回の後編では、いよいよHubSpot APIと連携して、
より実践的な使い方にステップアップしようと思います~

すこしずつ、「できる」が増えていく感覚を大事にしながら、
ぜひ引き続きチャレンジしてみてくださいね🧪🐱🌸

ChatGPT Image 2025年3月26日 22_41_52

 

Reina

Written by Reina

HubSpot CMS (現 Content Hub) をメインに 気になったことをまとめます。猫が好きです