mcpField
B
b2c-webservices

b2c-webservices

github.com/salesforcecommercecloud開発5787 回インストール今日更新
リポジトリ

b2c-webservices について

Salesforce B2C Commerceの開発者向けに、Service Frameworkを使った外部サービス連携を案内するスキルです。サービス設定、コールバック、エラー処理、ログのフィルタリング、モックテストを扱います。

主な機能

  1. 01HTTP、SOAP、ファイル転送サービスの設定
  2. 02LocalServiceRegistryによるサービス作成
  3. 03リクエストとレスポンスのコールバック実装
  4. 04レート制限とサーキットブレーカーの処理
  5. 05機密ログの除外と呼び出しのモック

活用シーン

  1. 01外部REST APIやSOAPサービスへの接続
  2. 02FTPまたはSFTPによるファイル転送
  3. 03サービス呼び出しのタイムアウトとレート制限設定
  4. 04外部システムを呼び出さずに連携をテスト

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/salesforcecommercecloud/b2c-developer-tooling --skill b2c-webservices

インストール後、Claude Code で/b2c-webservicesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
trigger-evals.json
references/
FTP-SERVICES.md
HTTP-SERVICES.md
SERVICES-XML.md
SOAP-SERVICES.md

詳細

Web Services スキル

このスキルでは、Service Framework を使用して B2C Commerce に Web サービス連携を実装する方法を説明します。

概要

Service Framework を使用すると、次の機能を備えた構造化された方法で外部サービスを呼び出せます。

機能説明
設定Business Manager で管理するサービス設定
レート制限外部システムを保護する自動スロットリング
サーキットブレーカー連鎖的な障害を防ぐ自動障害処理
ログ記録機密データのフィルタリングを備えた通信ログ
モック外部呼び出しを行わずにサービスをテスト

サービスの種類

種類ユースケースプロトコル
HTTPREST API、WebhookHTTP/HTTPS
HTTPFormフォーム送信フォームエンコーディングを使用する HTTP/HTTPS
FTPファイル転送(非推奨)FTP
SFTPセキュアなファイル転送SFTP
SOAPSOAP Web サービスSOAP を使用する HTTP/HTTPS
GENERICカスタムプロトコル任意

Service Framework のコンポーネント

Business Manager の設定

サービスは Administration > Operations > Services で設定します。

  1. Service Configuration - 一般設定(有効化、ログ記録、コールバック)
  2. Service Profile - レート制限とサーキットブレーカーの設定
  3. Service Credential - URL と認証情報
スクリプトコンポーネント
コンポーネント目的
LocalServiceRegistryサービスインスタンスを作成
ServiceCallbackリクエスト/レスポンス処理を定義
Service共通メソッドを備えたベースサービス
Resultステータスとデータを含むレスポンスオブジェクト

基本パターン

'use strict';

var LocalServiceRegistry = require('dw/svc/LocalServiceRegistry');

var myService = LocalServiceRegistry.createService('my.service.id', {
    /**
     * Configure the request before it is sent
     * @param {dw.svc.HTTPService} svc - The service instance
     * @param {Object} params - Parameters passed to service.call()
     * @returns {string} Request body
     */
    createRequest: function (svc, params) {
        svc.setRequestMethod('POST');
        svc.addHeader('Content-Type', 'application/json');
        return JSON.stringify(params);
    },

    /**
     * Parse the response after a successful call
     * @param {dw.svc.HTTPService} svc - The service instance
     * @param {dw.net.HTTPClient} client - The HTTP client with response
     * @returns {Object} Parsed response
     */
    parseResponse: function (svc, client) {
        return JSON.parse(client.text);
    },

    /**
     * Filter sensitive data from logs (required for production)
     * @param {string} msg - The message to filter
     * @returns {string} Filtered message
     */
    filterLogMessage: function (msg) {
        return msg.replace(/("api_key"\s*:\s*")[^"]+"/g, '$1***"');
    }
});

// Call the service
var result = myService.call({ key: 'value' });

if (result.ok) {
    var data = result.object;
} else {
    var error = result.errorMessage;
}

サービスコールバック

コールバック必須説明
createRequestはい*リクエストを設定し、本文を返します
parseResponseはい*レスポンスを解析し、結果オブジェクトを返します
executeいいえカスタム実行ロジック(デフォルトの処理を置き換えます)
initServiceClientいいえ基盤となるクライアントを作成/設定します
mockCallいいえモックレスポンスを返します(実行フェーズのみ)
mockFullいいえモックレスポンスを返します(呼び出し全体)
filterLogMessage推奨ログから機密データをフィルタリングします
getRequestLogMessageいいえカスタムリクエストログメッセージ
getResponseLogMessageいいえカスタムレスポンスログメッセージ

*execute を実装する場合を除き必須です

Result オブジェクト

call() メソッドは dw.svc.Result を返します。

プロパティ型説明
okBoolean成功した場合は True
statusString「OK」、「ERROR」、または「SERVICE_UNAVAILABLE」
objectObjectparseResponse からのレスポンス
errorNumberエラーコード(HTTP ステータスなど)
errorMessageStringエラーの説明
unavailableReasonStringサービスが利用できない理由
mockResultBooleanモックコールバックからの結果の場合は True
利用不可の理由
理由説明
TIMEOUT呼び出しがタイムアウトしました
RATE_LIMITEDレート制限を超過しました
CIRCUIT_BROKENサーキットブレーカーが開いています
DISABLEDサービスが無効です
CONFIG_PROBLEM設定エラー

エラー処理

var result = myService.call(params);

if (result.ok) {
    return result.object;
}

// Handle different error types
switch (result.status) {
    case 'SERVICE_UNAVAILABLE':
        switch (result.unavailableReason) {
            case 'RATE_LIMITED':
                // Retry later
                break;
            case 'CIRCUIT_BROKEN':
                // Service is down, use fallback
                break;
            case 'TIMEOUT':
                // Request timed out
                break;
        }
        break;
    case 'ERROR':
        // Check HTTP status code
        if (result.error === 401) {
            // Authentication error
        } else if (result.error === 404) {
            // Resource not found
        }
        break;
}

throw new Error('Service error: ' + result.errorMessage);

ログのフィルタリング

本番環境では、機密データの露出を防ぐためにログのフィルタリングが必要です。

var myService = LocalServiceRegistry.createService('my.service', {
    createRequest: function (svc, params) {
        // ... configure request
    },

    parseResponse: function (svc, client) {
        return JSON.parse(client.text);
    },

    /**
     * Filter sensitive data from all log messages
     */
    filterLogMessage: function (msg) {
        // Filter API keys
        msg = msg.replace(/api_key=[^&]+/g, 'api_key=***');
        // Filter authorization headers
        msg = msg.replace(/Authorization:\s*[^\r\n]+/gi, 'Authorization: ***');
        // Filter passwords in JSON
        msg = msg.replace(/("password"\s*:\s*")[^"]+"/g, '$1***"');
        return msg;
    },

    /**
     * Custom request log message (optional)
     */
    getRequestLogMessage: function (request) {
        // Return custom message or null for default
        return 'Request: ' + request.substring(0, 100) + '...';
    },

    /**
     * Custom response log message (optional)
     */
    getResponseLogMessage: function (response) {
        // Return custom message or null for default
        return 'Response received';
    }
});

サービスのモック

外部呼び出しを行わずにテストするには、モックコールバックを使用します。

var myService = LocalServiceRegistry.createService('my.service', {
    createRequest: function (svc, params) {
        svc.setRequestMethod('GET');
        svc.addParam('id', params.id);
        return null;
    },

    parseResponse: function (svc, client) {
        return JSON.parse(client.text);
    },

    /**
     * Mock the execute phase only (createRequest and parseResponse still run)
     */
    mockCall: function (svc, request) {
        return {
            statusCode: 200,
            text: JSON.stringify({ id: 1, name: 'Mock Data' })
        };
    },

    /**
     * Or mock the entire call (replaces all phases)
     */
    mockFull: function (svc, params) {
        return { id: params.id, name: 'Full Mock Data' };
    }
});

// Force mock mode
myService.setMock();
var result = myService.call({ id: 123 });

Business Manager でのサービス設定

サービスの作成
  1. Administration > Operations > Services に移動します
  2. Service Configurations の下にある New をクリックします
  3. 次の項目を入力します。
    • Service ID:一意の識別子(例:my.api.service)
    • Service Type:HTTP、FTP、SOAP など
    • Enabled:有効にする場合はチェックします
    • Profile:プロファイルを選択または作成します
    • Credential:認証情報を選択または作成します
    • Communication Log:デバッグ用に有効にします
サービスプロファイル設定
設定説明
タイムアウト最大待機時間(ミリ秒)
レート制限時間単位あたりの最大呼び出し回数
サーキットブレーカーを有効化障害処理を自動的に有効化します
サーキットブレーカーの最大呼び出し回数サーキットブレーカーが開くまでの呼び出し回数
サーキットブレーカーの間隔障害を追跡する時間枠
サービス認証情報設定
設定説明
ID認証情報の識別子
URLサービスのベース URL
ユーザー認証に使用するユーザー名
パスワード認証に使用するパスワード

詳細リファレンス

スクリプト API クラス

クラス説明
dw.svc.LocalServiceRegistryサービスインスタンスの作成
dw.svc.Serviceサービスの基底クラス
dw.svc.HTTPServiceHTTP サービスのメソッド
dw.svc.FTPServiceFTP/SFTP サービスのメソッド
dw.svc.SOAPServiceSOAP サービスのメソッド
dw.svc.Resultサービス呼び出しの結果
dw.svc.ServiceConfigサービス設定
dw.svc.ServiceProfileレート制限/サーキットブレーカーの設定
dw.svc.ServiceCredential認証情報
dw.net.HTTPClient基盤となる HTTP クライアント
dw.net.FTPClient基盤となる FTP クライアント
dw.net.SFTPClient基盤となる SFTP クライアント

コメント