このレッスンのロックを解除するには、まず「レッスン4:ロジック、条件分岐、エラーハンドリングの追加」を完了してください。前のレッスンに戻る

はじめに

n8nでは、ほとんどのワークフローをネイティブノードで構築できます。各ノードは特定のサービスのラッパーです。しかし、実際のビジネス自動化が綺麗に収まることは稀です。必要なサービス専用のノードがない、そのノードに必要なエンドポイントがない、組み込みノードでは扱いにくい方法でデータを変換する必要がある、というケースに必ず遭遇します。そうした場面で、HTTP RequestノードとCodeノードが活躍します。このレッスンでは、この2つのツールに焦点を当てます。任意の外部APIを呼び出す方法、そしてn8nのビジュアルノードだけでは足りないときにカスタムJavaScriptやPythonを使う方法です。

HTTP Requestで外部APIを呼び出す

HTTP Requestノードは万能コネクタです。標準でRESTに対応し、HTTPエンドポイントを公開しているあらゆるサービスと動作します。n8nノードが全く存在しないサービスでも問題ありません。

公開APIへの典型的なGETリクエストは、n8nのノード設定では次のように記述します。

bash
curl -X GET "https://api.example.com/v1/customers/42" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/json"

HTTP RequestノードのUIで、MethodをGETに設定し、URLを貼り付け、Headersの下にその2つのヘッダーを追加します。ノードはレスポンスボディをJSONオブジェクトとして返し、下流のノードはn8n式の`$json.fieldName`のように参照できます。

データを送信するPOSTリクエストの場合は、Methodを切り替え、Send BodyをJSONに設定してボディを指定します。例えば、外部CRMにレコードを作成する場合。

json
{
"name": "Acme Corp",
"email": "contact@acme.com",
"source": "n8n-workflow"
}
トリガーノードからHTTP Requestノードを通り、外部APIへ到達し、再びn8nの下流ノードへ戻るデータフローを示す図

認証オプションは重要です。多くのビジネスAPIでは、Bearerトークン、OAuth2、クエリパラメータとして渡されるAPIキーが使われます。n8nはこれらすべてを認証情報タイプとしてサポートしているため、ノード内にシークレットをハードコードする必要はなく、Credentialsドロップダウンから参照します。カスタム認証スキームを使うサービスでは、AuthenticationをGeneric Credential Typeに設定し、保存された認証情報を参照するヘッダー名と値を指定します。

Codeノードを使うべき場面

組み込みノードは一般的な80%をカバーします。SplitInBatchesによるループ、Setノードによるデータマッピング、IFノードによる条件分岐です。残り20%はCodeノードが本領を発揮する領域です。複雑な文字列解析、統計計算、ヘルパーライブラリの呼び出し、n8nのDateノードでは扱いにくい日付計算、あるいは5個のビジュアルノードをチェーンするより10行のコードの方が速く構築でき読みやすいケース。

Codeノードには2つのモードがあります。JavaScriptモードはn8nのNode.jsランタイム上でネイティブに動作し、すでにインストール済みのnpmパッケージにフルアクセスできます。Pythonモードは、n8nの環境に応じてPyodideかホスト型Pythonワーカーを使用します。

よくあるユースケース:webhookから届く乱雑なデータを保存前に整形する。フォームから国名が大文字小文字混在で末尾にスペース付きで送られてくるため、外部検索用にISO国コードが必要だとします。

javascript
const items = $input.all();
const countryMap = {
"united states": "US",
"united kingdom": "GB",
"vietnam": "VN",
"germany": "DE"
};
return items.map(item => {
const raw = (item.json.country || "").toLowerCase().trim();
const code = countryMap[raw] || "UNKNOWN";
return {
json: {
...item.json,
country_code: code
}
};
});

Pythonモードでも、辞書アクセスやリスト内包記法の構文に置き換わるだけで、ほぼ同じ見た目になります。同じノードが両方の言語に対応しているため、チームが読みやすい方を選んでください。

ネイティブノードを使うか、HTTP Requestノードを使うか、Codeノードを使うかを示す判断フローチャート

1つのワークフローでHTTP RequestとCodeを組み合わせる

両者を組み合わせたときに真価が発揮されます。一般的なパターンとして、Codeノードで受信データを変換し、HTTP Requestノードで外部サービスを呼び出してデータを拡充し、2つ目のCodeノードでレスポンスを後処理し、最終的な出力先へ結果を流す、という流れです。

例:請求書のデータ拡充フロー

javascript
// Code node 1: normalize vendor names
const items = $input.all();
const cleaned = items.map(i => ({
json: {
invoice_id: i.json.id,
vendor: i.json.vendor_name.toLowerCase().replace(/[^a-z0-9]/g, "-")
}
}));
return cleaned;

次にHTTP Requestノードが、`GET /vendors/{vendor}`で会計APIを呼び出し、支払条件を取得します。最後にCodeノードが結果をマージします。

javascript
const items = $input.all();
return items.map(i => ({
json: {
invoice_id: i.json.invoice_id,
vendor: i.json.vendor,
payment_terms: i.json.payment_terms || "NET30",
flagged: !i.json.payment_terms
}
}));

その3つ目のノードは、支払条件が空で返ってきた請求書にフラグを付けます。これはビジュアルでやろうとすると追加のIFノードが必要になる、ちょっとしたビジネスロジックです。

よくある間違い

構築に入る前に注意点を確認しておきましょう。まず第一に、認証情報をノードのボディやURL内に直接記述しないでください。必ずn8nの認証情報システムを使用しないと、シークレットがワークフローエクスポートやバージョン管理に含まれてしまいます。第二に、HTTP Requestノードのデフォルトは「JSONレスポンス」です。APIがXMLやプレーンテキストを返す場合は、Response Formatを切り替えないとパースエラーが発生します。第三に、Codeノードはアイテムを1バッチずつ処理します。実行間で状態(カウンターやキャッシュ)を持たせる必要がある場合は、Codeノードではなく、データベースやn8nの静的データを使うべきです。第四に、CodeノードのJavaScript内で`await`を使う際は注意が必要です。`await`はサポートされていますが、async関数でラップする必要があり、初めて使うユーザーがつまずきやすいポイントです。

まとめ

HTTP Requestノードにより、n8nはあらゆるHTTP APIとやり取りできる万能手段を得ます。Codeノードは、ビジュアルロジックでは扱いにくいか不可能な部分のギャップを埋めます。上記のパターン(外部API呼び出し、データ変換、そして両者の組み合わせ)は、本番で構築するカスタム統合の約9割をカバーします。この2つのノードタイプをマスターすれば、サービス固有のノードが何をサポートしているかに縛られなくなります。

レッスンの練習

レッスンのチェックポイント

学んだ内容を復習し、回答へのフィードバックを受けましょう。

0/1
回答済み · 0/1