Claude-skill-registry b2c-webservices
Implement web service integrations in B2C Commerce using LocalServiceRegistry. Use when calling external APIs, configuring service credentials in services.xml, handling HTTP requests/responses, or implementing circuit breakers. Covers HTTP, SOAP, FTP, and SFTP services.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/b2c-webservices" ~/.claude/skills/majiayu000-claude-skill-registry-b2c-webservices && rm -rf "$T"
manifest:
skills/data/b2c-webservices/SKILL.mdsource content
Web Services Skill
This skill guides you through implementing web service integrations in B2C Commerce using the Service Framework.
Overview
The Service Framework provides a structured way to call external services with:
| Feature | Description |
|---|---|
| Configuration | Service settings managed in Business Manager |
| Rate Limiting | Automatic throttling to protect external systems |
| Circuit Breaker | Automatic failure handling to prevent cascade failures |
| Logging | Communication logging with sensitive data filtering |
| Mocking | Test services without external calls |
Service Types
| Type | Use Case | Protocol |
|---|---|---|
| REST APIs, webhooks | HTTP/HTTPS |
| Form submissions | HTTP/HTTPS with form encoding |
| File transfers (deprecated) | FTP |
| Secure file transfers | SFTP |
| SOAP web services | HTTP/HTTPS with SOAP |
| Custom protocols | Any |
Service Framework Components
Business Manager Configuration
Services are configured in Administration > Operations > Services:
- Service Configuration - General settings (enabled, logging, callbacks)
- Service Profile - Rate limiting and circuit breaker settings
- Service Credential - URL and authentication credentials
Script Components
| Component | Purpose |
|---|---|
| Creates service instances |
| Defines request/response handling |
| Base service with common methods |
| Response object with status and data |
Basic Pattern
'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; }
Service Callbacks
| Callback | Required | Description |
|---|---|---|
| Yes* | Configure request, return body |
| Yes* | Parse response, return result object |
| No | Custom execution logic (replaces default) |
| No | Create/configure underlying client |
| No | Return mock response (execute phase only) |
| No | Return mock response (entire call) |
| Recommended | Filter sensitive data from logs |
| No | Custom request log message |
| No | Custom response log message |
*Required unless
execute is implemented
Result Object
The
call() method returns a dw.svc.Result:
| Property | Type | Description |
|---|---|---|
| Boolean | True if successful |
| String | "OK", "ERROR", or "SERVICE_UNAVAILABLE" |
| Object | Response from |
| Number | Error code (e.g., HTTP status) |
| String | Error description |
| String | Why service is unavailable |
| Boolean | True if from mock callback |
Unavailable Reasons
| Reason | Description |
|---|---|
| Call timed out |
| Rate limit exceeded |
| Circuit breaker open |
| Service disabled |
| Configuration error |
Error Handling
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);
Log Filtering
Production environments require log filtering to prevent sensitive data exposure:
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'; } });
Mocking Services
Use mock callbacks for testing without external calls:
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 });
Service Configuration in Business Manager
Creating a Service
- Go to Administration > Operations > Services
- Click New under Service Configurations
- Fill in:
- Service ID: Unique identifier (e.g.,
)my.api.service - Service Type: HTTP, FTP, SOAP, etc.
- Enabled: Check to enable
- Profile: Select or create a profile
- Credential: Select or create credentials
- Communication Log: Enable for debugging
- Service ID: Unique identifier (e.g.,
Service Profile Settings
| Setting | Description |
|---|---|
| Timeout | Maximum wait time in milliseconds |
| Rate Limit | Maximum calls per time unit |
| Circuit Breaker Enabled | Enable automatic failure handling |
| Max Circuit Breaker Calls | Calls before circuit opens |
| Circuit Breaker Interval | Time window for tracking failures |
Service Credential Settings
| Setting | Description |
|---|---|
| ID | Credential identifier |
| URL | Base URL for the service |
| User | Username for authentication |
| Password | Password for authentication |
Detailed References
- HTTP Services - REST API integrations
- FTP/SFTP Services - File transfer operations
- SOAP Services - SOAP web service integrations
- Services XML - Import/export service configurations
Script API Classes
| Class | Description |
|---|---|
| Create service instances |
| Base service class |
| HTTP service methods |
| FTP/SFTP service methods |
| SOAP service methods |
| Service call result |
| Service configuration |
| Rate limit/circuit breaker config |
| Authentication credentials |
| Underlying HTTP client |
| Underlying FTP client |
| Underlying SFTP client |