关于 odata
odata 为构建或消费 OData 服务的 ABAP 开发者提供指导,涵盖 RAP 和经典 SEGW 实现、外部服务消费、Fiori 注解及故障排查。
主要功能
- 01RAP OData 服务指导
- 02经典 SEGW V2 实现步骤
- 03外部 OData 消费模式
- 04Fiori 注解示例
- 05故障排查指南
适用场景
- 01将 RAP 业务对象发布为 OData
- 02维护经典 SEGW V2 服务
- 03从 ABAP 消费外部 OData 服务
- 04诊断 OData 错误
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ likweitan/ abap-skills --skill odata安装后在 Claude Code 中输入/odata确认已加载。
附带文件references/odata-annotation-examples.md
详细介绍
OData 服务开发
介绍如何在 ABAP 中创建和使用 OData 服务,涵盖基于 RAP(V4/V2)和基于 SEGW(V2)的方法。
工作流
-
确定用户的目标:
- 将 RAP BO 公开为 OData 服务(推荐方法)
- 创建经典的基于 SEGW 的 OData V2 服务
- 在 ABAP 中使用外部 OData 服务
- 为 Fiori UI 添加 OData 注解
- 排查 OData 错误
-
确定实现方法:
- 基于 RAP 的服务(ABAP Cloud 首选)
- 基于 SEGW 的服务(经典方法,仅适用于 Standard ABAP)
- 使用 OData(客户端代理)
-
按照 SAP 最佳实践指导实施
基于 RAP 的 OData 服务(推荐)
架构流程
CDS View Entity → Behavior Definition → Service Definition → Service Binding
↓
OData V4/V2 Endpoint
服务定义
将 CDS 实体及其行为公开为命名服务:
@EndUserText.label: 'Travel Service'
define service ZUI_TRAVEL_O4 {
expose ZC_Travel as Travel;
expose ZC_Booking as Booking;
expose I_Currency as Currency;
expose I_Country as Country;
}
主要规则
- 公开投影 CDS 视图(按惯例使用 C_ 前缀),而不是根视图
- 包含 UI 所需的值帮助 CDS 视图(I_* 视图)
- 别名名称将成为 OData 实体集名称
- 一个服务定义可以绑定到多个协议
服务绑定
将服务定义绑定到特定的 OData 协议,并提供 URL:
| 绑定类型 | 协议 | 用例 |
|---|---|---|
OData V4 - UI | V4 | SAP Fiori Elements 应用 |
OData V2 - UI | V2 | 旧版 Fiori 应用、较早的前端 |
OData V4 - Web API | V4 | API 使用(A2X 场景) |
OData V2 - Web API | V2 | API 使用(旧版) |
InA - UI | InA | 分析场景 |
创建服务绑定
- 在 ADT 中:New → Other ABAP Repository Object → Business Services → Service Binding
- 选择服务定义
- 选择绑定类型(例如,OData V4 - UI)
- 激活
- 单击 Publish 注册服务
- 单击 Preview 打开 Fiori Elements 预览
OData V4 与 V2
| 功能 | OData V4 | OData V2 |
|---|---|---|
| 协议 | 默认使用 JSON | 默认使用 XML(Atom),也可选择 JSON |
| 批处理 | 使用 JSON 的 $batch | 使用 multipart 的 $batch |
| 深层操作 | 支持深层创建/更新 | 有限支持 |
| 操作/函数 | 绑定和未绑定 | 函数导入 |
| 筛选 | 支持带 lambda 的 $filter | 基本 $filter |
| 草稿 | 完全支持 | 通过扩展支持 |
| 聚合 | $apply 转换 | 不原生支持 |
| 建议 | 新开发首选 | 仅维护现有服务 |
基于 SEGW 的 OData V2 服务(经典方法)
仅适用于 Standard ABAP(ABAP Cloud 不提供):
架构
SEGW Project → Data Model (Entity Types, Sets, Associations)
→ Service Implementation (MPC/DPC classes)
→ Register & Activate in /IWFND/MAINT_SERVICE
步骤
- 在
SEGW事务中创建项目 - 定义数据模型:实体类型、属性、导航属性
- 生成运行时制品(MPC/DPC 类)
- 实现 DPC 扩展方法:
GET_ENTITYSET、GET_ENTITY、CREATE_ENTITY等 - 在
/IWFND/MAINT_SERVICE中注册服务 - 通过
/IWFND/GW_CLIENT或浏览器测试
DPC 方法实现示例
METHOD travelset_get_entityset.
SELECT * FROM ztravel_tab
INTO TABLE @DATA(lt_travel)
UP TO 100 ROWS.
et_entityset = CORRESPONDING #( lt_travel ).
ENDMETHOD.
使用外部 OData 服务
在 ABAP Cloud 中(使用 HTTP 客户端和通信配置)
"1. Get HTTP client via communication arrangement
DATA(lo_dest) = cl_http_destination_provider=>create_by_comm_arrangement(
comm_scenario = 'Z_MY_OUTBOUND_SCENARIO'
service_id = 'Z_MY_HTTP_SERVICE' ).
DATA(lo_client) = cl_web_http_client_manager=>create_by_http_destination( lo_dest ).
"2. Build request
DATA(lo_request) = lo_client->get_http_request( ).
lo_request->set_uri_path( '/sap/opu/odata4/sap/api_business_partner/srvd_a2x/sap/api_business_partner/0001/A_BusinessPartner?$top=10' ).
"3. Execute and parse response
DATA(lo_response) = lo_client->execute( if_web_http_client=>get ).
DATA(lv_json) = lo_response->get_text( ).
lo_client->close( ).
使用 OData 客户端代理(V2/V4)
"Create OData client proxy for V4
DATA(lo_proxy) = /iwbep/cl_cp_client_proxy_fact=>create_v4_remote_proxy(
iv_service_definition_name = 'Z_MY_ODATA_CDEF'
io_http_client = lo_client
iv_relative_service_root = '/sap/opu/odata4/sap/api_service/0001/' ).
"Build and execute read request
DATA(lo_request) = lo_proxy->create_resource_for_entity_set( 'ENTITYSETNAME' )->create_request_for_read( ).
lo_request->set_top( 10 ).
DATA(lo_response) = lo_request->execute( ).
"Get business data
DATA lt_data TYPE STANDARD TABLE OF z_entity_type.
lo_response->get_business_data( IMPORTING et_business_data = lt_data ).
Fiori 的 OData 注解
控制 OData/Fiori 行为的关键 CDS 注解:
@UI.headerInfo: {
typeName: 'Travel',
typeNamePlural: 'Travels',
title: { type: #STANDARD, value: 'TravelID' },
description: { type: #STANDARD, value: 'Description' }
}
@UI.lineItem: [{ position: 10 }]
@UI.selectionField: [{ position: 10 }]
@UI.identification: [{ position: 10 }]
TravelID;
@UI.lineItem: [{ position: 20, importance: #HIGH }]
@UI.identification: [{ position: 20 }]
@Consumption.valueHelpDefinition: [{ entity: { name: 'I_Currency', element: 'Currency' } }]
CurrencyCode;
故障排查
| 错误 / 问题 | 解决方案 |
|---|---|
/IWBEP/CX_MGW_BUSI_EXCEPTION | 检查 DPC 实现,验证输入数据 |
/IWBEP/CX_MGW_TECH_EXCEPTION | 检查数据模型一致性,重新生成构件 |
| 403 Forbidden | 检查 ICF 节点是否已激活、授权设置 |
| 404 Not Found | 确认服务已注册并激活 |
$metadata 返回空内容 | 发布服务绑定,检查激活状态 |
| 草稿无法正常工作 | 确认草稿表存在,BDEF 包含 with draft |
| 深度创建失败 | 检查 CDS 和 BDEF 中的组合关系 |
CX_WEB_HTTP_CLIENT_ERROR | 检查通信安排、SSL 证书 |
输出格式
在回答 OData 相关主题时,请按以下结构组织回复:
## OData Service Guidance
### Approach
- Type: [RAP-based / SEGW-based / Consumption]
- Protocol: [OData V4 / OData V2]
### Implementation
[Step-by-step with code examples]
### Testing
[How to test the service]
参考资料
- SAP OData V4 文档:https://help.sap.com/docs/abap-cloud/abap-rap/odata-service
- RAP 服务绑定:https://help.sap.com/docs/abap-cloud/abap-rap/service-binding
- OData 客户端代理:https://help.sap.com/docs/abap-cloud/abap-rap/odata-client-proxy
相关技能
- rap:用于构建以 OData 服务形式公开的 RAP 业务对象
- cds-view-entities:用于为 OData 服务提供基础的数据建模
- authorization-iam:用于通过 IAM 应用保护 OData 服务
- btp-abap-environment:用于设置 OData 消费所需的通信安排
评论
支持 Markdown