mcpField
O
odata

odata

github.com/likweitan开发7294 次安装2 周前更新
代码仓库

关于 odata

odata 为构建或消费 OData 服务的 ABAP 开发者提供指导,涵盖 RAP 和经典 SEGW 实现、外部服务消费、Fiori 注解及故障排查。

主要功能

  1. 01RAP OData 服务指导
  2. 02经典 SEGW V2 实现步骤
  3. 03外部 OData 消费模式
  4. 04Fiori 注解示例
  5. 05故障排查指南

适用场景

  1. 01将 RAP 业务对象发布为 OData
  2. 02维护经典 SEGW V2 服务
  3. 03从 ABAP 消费外部 OData 服务
  4. 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)的方法。

工作流

  1. 确定用户的目标:

    • 将 RAP BO 公开为 OData 服务(推荐方法)
    • 创建经典的基于 SEGW 的 OData V2 服务
    • 在 ABAP 中使用外部 OData 服务
    • 为 Fiori UI 添加 OData 注解
    • 排查 OData 错误
  2. 确定实现方法:

    • 基于 RAP 的服务(ABAP Cloud 首选)
    • 基于 SEGW 的服务(经典方法,仅适用于 Standard ABAP)
    • 使用 OData(客户端代理)
  3. 按照 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 - UIV4SAP Fiori Elements 应用
OData V2 - UIV2旧版 Fiori 应用、较早的前端
OData V4 - Web APIV4API 使用(A2X 场景)
OData V2 - Web APIV2API 使用(旧版)
InA - UIInA分析场景
创建服务绑定
  1. 在 ADT 中:New → Other ABAP Repository Object → Business Services → Service Binding
  2. 选择服务定义
  3. 选择绑定类型(例如,OData V4 - UI)
  4. 激活
  5. 单击 Publish 注册服务
  6. 单击 Preview 打开 Fiori Elements 预览

OData V4 与 V2

功能OData V4OData 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
步骤
  1. 在 SEGW 事务中创建项目
  2. 定义数据模型:实体类型、属性、导航属性
  3. 生成运行时制品(MPC/DPC 类)
  4. 实现 DPC 扩展方法:GET_ENTITYSET、GET_ENTITY、CREATE_ENTITY 等
  5. 在 /IWFND/MAINT_SERVICE 中注册服务
  6. 通过 /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]

参考资料

相关技能

  • rap:用于构建以 OData 服务形式公开的 RAP 业务对象
  • cds-view-entities:用于为 OData 服务提供基础的数据建模
  • authorization-iam:用于通过 IAM 应用保护 OData 服务
  • btp-abap-environment:用于设置 OData 消费所需的通信安排

评论

支持 Markdown