ABAP oData Service
ABAP oData Service
🎯 概述
本文介绍SAP后端系统基于数据结构创建==OData服务==的过程。OData(Open Data Protocol)是一种标准化的Web服务协议,用于对数据进行CRUD(创建、读取、更新、删除)操作。
graph TD
A[创建OData服务流程] --> B["1. 创建数据字典<br>结构"]
B --> C["2. 创建Gateway<br>服务项目(SEGW)"]
C --> D["3. 创建Data Model<br>(Entity/EntitySet)"]
D --> E["4. Generate<br>Runtime Objects"]
E --> F["5. 服务注册"]
F --> G["6. 实现CRUD方法"]
G --> H["7. 测试服务"]
📋 创建Gateway Service Project
事务码:SEGW
Gateway Service Project分为四个部分:
| 组成部分 | 说明 |
|---|---|
| ==Data Model== | 数据模型,包括Entity type、Entity set和Association |
| ==Service Implementation== | Entity set的CRUD实现 |
| ==Runtime Artifacts== | 基于Entity set的代码框架 |
| ==Service maintenance== | 注册服务、测试服务 |
🏗️ 创建Data Model
创建Entity
- 选中Data Model,右键 → Import → DDIC Structure
- 输入Entity Name以及数据表结构(如
ZRICO_USR) - 勾选 ==Create Default entity set== 自动创建Entity set
- 选中所有字段,点击 NEXT
- 选择主键字段(如 MANDT、USRID),Name值首字符需大写
- 点击 Finish
调整Entity Sets
设置Entity集合的CRUD操作权限。
💡 Generate Runtime Objects
- 选中项目名,右键 → Generate Runtime
- 保持所有值默认,点击 Continue
- 系统自动生成Runtime objects
🔍 服务注册
- 在 Service Maintenance 下可以看到已创建的Gateway Service别名
- 此时 Register Status ==没有状态==,点击 ==Register== 按钮
- 选择系统别名 ==LOCAL==
- 确认后完成服务注册,状态已改变
📋 测试OData Service
浏览器测试
点击 Maintain 进入激活并维护服务界面,调用浏览器测试。
⚠️浏览器测试可能的问题
问题1:主机名或端口未配置
使用事务码
使用事务码
SMICM → Goto → Services,检查主机和端口是否配置好。问题2:无法通过Internet访问
需要设置本机 hosts 文件:C:\Windows\System32\drivers\etc
Gateway客户端测试
使用事务代码 /N/IWFND/GW_CLIENT 进行测试。
💡事务码注意
输入事务码时需要加
/O 前缀,如 /O/IWFND/MAINT_SERVICE 和 /O/IWFND/GW_CLIENT。🏗️ 服务实现(CRUD)
服务实现是提供CRUD的具体实现。SAP把读取Entity叫做 ==Read==,读取EntitySet叫做 ==Query==。
graph LR
A[CRUD操作] --> B["Query<br>GetEntitySet"]
A --> C["Read<br>GetEntity"]
A --> D["Create"]
A --> E["Update"]
A --> F["Delete"]
Query重定义(GetEntitySet)
选中 GetEntitySet(Query),右键 → Go to ABAP Workbench:
1 | METHOD zusrset_get_entityset. |
ℹ️ET_ENTITYSET
ET_ENTITYSET 是类方法预设的参数,基于ZRICO_USR内表结构。Read重定义(GetEntity)
选中 GetEntity(Read),进入ABAP工作台:
1 | METHOD zusrset_get_entity. |
Postman测试地址:
1 | http://XXX.XXXXXXXXX.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet(Mandt='300',Usrid='1')?$format=json |
Create重定义
1 | METHOD zusrset_create_entity. |
⛔CSRF Token
Postman测试Create服务前,必须先通过GET请求获取CSRF Token:
1 | Headers: KEY = X-CSRF-Token, VALUE = Fetch |
获取Token后在后续POST请求中使用。
Update重定义
1 | METHOD zusrset_update_entity. |
使用 PUT 或 MERGE 方式发送更新请求。
Delete重定义
1 | METHOD zusrset_delete_entity. |
使用 DELETE 方式发送删除请求。
💡 Function Import函数导入
如果操作不适合CRUD方案,可以通过==函数导入==来执行自定义操作。
创建Function Import
- 选中 DataModel,右键 → Create → Function Import
- 输入导入名称(如
UserByName) - 设置参数:
| 参数 | 值 |
|---|---|
| Return type | Entity type: ZUSER |
| Return Cardinality | 0…n(返回实体集合) |
| HTTP | GET |
创建导入参数
双击 Function Import Parameters,创建参数:UsrName,类型 Edm.String。
重定义Function Import方法
1 | METHOD zusrset_userbyname. |
Postman测试:
1 | http://XXX.XXXXX.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/UserByName?UsrName='12' |
🔍 常见问题解决
| 问题 | 解决方案 |
|---|---|
| 登录错误 | 删除Cookies重新登录,检查用户权限 |
| CSRF Token失败 | Headers中添加 X-CSRF-Token: Fetch |
| 数据格式问题 | 使用 ?$format=json 获取JSON格式 |
| 服务未激活 | 确保所有方法已激活,检查语法错误 |
⚠️ 注意事项
- 创建服务前确保==数据字典结构==已定义
- Postman测试需要先获取==CSRF Token==
- 方法实现后必须==激活==才能生效
- URI中的参数需要==区分大小写==
- 建议使用
?$format=json获取JSON格式数据