@abapify/adt-客户端
由合同驱动的SAP ADT REST客户端 - 用途 speci + 键 ts-xsd 为全类型安全.
为什么是V2?
此软件包取代了遗产 adt-client 带有 合同第一设计数字 :
┌─────────────────────────────────────────────────────────────────┐
│ adt-client │
│ (HTTP Client + Request Execution) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ adt-contracts │
│ (REST API Contracts using speci + ts-xsd) │
└─────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ adt-schemas │
│ (TypeScript schemas from SAP XSD definitions) │
└─────────────────────────────────────────────────────────────────┘
优于v1:
- ✅ XSD 的类型安全 - 正式SAP计划产生的类型
- ✅ 第一合同 - API合同界定接口
- ✅ 零手动类型 - 没有手写类型的定义
- ✅ 易于扩展 - 通过界定合同添加终点
- ✅ 可测试 - 合同是纯数据,易于取笑
特征
- ✅ 合同驱动 - 用途
speci+ 键ts-xsd合同 - ✅ 完整类型的推论 - 从XSD到响应的类型
- ✅ 零依赖关系 - 只使用本地获取 API
- ✅ 清洁 API - 箭功能合同
- ✅ 基于承诺 - 现代合成/等待API
安装
bun add @abapify/adt-client
快速启动
import { createAdtClient } from '@abapify/adt-client';
// Create client
const client = createAdtClient({
baseUrl: 'https://sap-system.com:8000',
username: 'YOUR_USER',
password: 'YOUR_PASS',
client: '100',
language: 'EN',
});
// Get complete class with all includes
const classObj = await client.getClass('ZCL_MY_CLASS');
console.log(classObj.metadata.description);
console.log(classObj.includes.main);
console.log(classObj.includes.definitions);
console.log(classObj.includes.implementations);
// Update main source
await client.updateMainSource('ZCL_MY_CLASS', newSource);
API 参考
客户端创建
createAdtClient(config: AdtConnectionConfig): AdtClient
配置 :
baseUrl- SAP系统URL(例如,https://sap-system.com:8000(中文(简体) )username- SAP 用户名password- SAP密码client- SAP客户端(可选,例如:,'100'(中文(简体) )language- SAP语言(可选,例如:,'EN'(中文(简体) )headersTimeoutMs- 对SAP长期请求的响应头暂停 (可选;否则将适用本地 HTTP 客户端默认)
类操作
获得完整类
getClass(className: string): Promise<ClassObject>
返回类元数据并全部包括(主要,定义,执行,宏,测试类).
只获取元数据
getMetadata(className: string): Promise<ClassMetadata>
返回类元数据(名称、描述、包等).
获取全部包含
getIncludes(className: string): Promise<ClassIncludes>
返回包含所有类源 .
获取特定包含
getInclude(className: string, includeType: 'main' | 'definitions' | 'implementations' | 'macros' | 'testclasses'): Promise<string>
返回特定内容包括源代码.
更新主要来源
updateMainSource(className: string, source: string): Promise<OperationResult>
更新主类源代码.
创建类
createClass(className: string, metadata: Partial<ClassMetadata>): Promise<OperationResult>
创建带有指定元数据的新类.
删除类
deleteClass(className: string): Promise<OperationResult>
删除一个类.
锁定/ 解锁
lockClass(className: string): Promise<string>
unlockClass(className: string, lockHandle: string): Promise<OperationResult>
锁定和解锁类进行编辑.
类型
类元数据
interface ClassMetadata {
name: string;
description?: string;
packageName?: string;
responsible?: string;
createdBy?: string;
createdAt?: string;
changedBy?: string;
changedAt?: string;
final?: boolean;
abstract?: boolean;
visibility?: 'public' | 'protected' | 'private';
}
类别包含
interface ClassIncludes {
main?: string;
definitions?: string;
implementations?: string;
macros?: string;
testclasses?: string;
}
类对象
interface ClassObject {
metadata: ClassMetadata;
includes: ClassIncludes;
}
实例
读取并修改类
// Get class
const classObj = await client.getClass('ZCL_MY_CLASS');
// Modify source
const newSource = classObj.includes.main?.replace('OLD_TEXT', 'NEW_TEXT');
// Update
if (newSource) {
await client.updateMainSource('ZCL_MY_CLASS', newSource);
}
创建新类
await client.createClass('ZCL_NEW_CLASS', {
description: 'My new class',
packageName: 'ZPACKAGE',
visibility: 'public',
final: false,
abstract: false,
});
锁定、编辑、解锁模式
// Lock class
const lockHandle = await client.lockClass('ZCL_MY_CLASS');
try {
// Edit class
await client.updateMainSource('ZCL_MY_CLASS', newSource);
} finally {
// Always unlock
await client.unlockClass('ZCL_MY_CLASS', lockHandle);
}
建筑
双层设计
const client = createAdtClient({...});
// Layer 1: Low-level contracts (direct ADT REST access)
client.adt.core.http.sessions.getSession()
client.adt.cts.transportrequests.getTransport(id)
// Layer 2: High-level services (business logic)
client.services.transports.importAndActivate(transportId) // Future
// Utility: Raw HTTP for debugging
client.fetch('/arbitrary/endpoint', { method: 'GET' })
合同 - 薄度,声明式HTTP定义,并用 1:1 映射到 SAP APT 端点 服务 - 合并多个合同呼叫的商业逻辑安排
与 att- client v1 的比较
| 特性 | v1 (语言) | v2(新设) |
|---|---|---|
| 类型安全 | 手动类型 | 从 XSD 生成 |
| 建筑 | 基于服务 | 第一合同 |
| 依赖关系 | 许多 | 无 |
| 扩展性 | 复杂 | 加合同 |
| 测试 | 困难 | 简单( 纯数据) |
相关软件包
许可证
麻省理工学院