在 OData V2 服务中,DELETE 操作用于删除指定的实体资源。本文将从客户端调用、HTTP 协议细节、ABAP 后端实现、常见错误等方面全面介绍 OData 的删除功能。如果你已经熟悉了 OData 的查询(GET)和创建(POST),DELETE 会非常简单------只需知道目标资源的 URI,发送一个带正确认证和 CSRF token 的 DELETE 请求即可。
1. DELETE 操作的核心概念
-
HTTP 方法 :
DELETE -
URI 格式 :
/sap/opu/odata/<服务路径>/<实体集>(<主键值>) -
CSRF 防护 :SAP Gateway 默认要求所有写操作(POST、PUT、DELETE)都必须携带有效的
X-CSRF-Token头。
2. 完整的 DELETE 请求示例
假设我们要删除 ZUSERSet 中 Id 为 3的用户。
2.1 请求 URL
http://主机:端口/sap/opu/odata/SAP/ZXKJ_USER_SRV/ZUSERSet(3)
2.2 请求头
DELETE /sap/opu/odata/SAP/ZXKJ_USER_SRV/ZUSERSet(5) HTTP/1.1
Host:
X-CSRF-Token:
注意 :DELETE 请求通常不需要请求体(body)。只需 URI 和头部即可。
2.3 操作示例
这是系统存在的 ZUSERSet 中 Id 为 3的用户

删除成功示例

2.4 成功的响应
-
HTTP 状态码 :
204 No Content(最常见,表示删除成功且无内容返回) -
响应体:空
某些服务也可能返回 200 OK 并在响应体中包含被删除实体的元数据,但 OData V2 规范推荐使用 204。
4. ABAP 后端实现(SAP Gateway)
在 SAP 系统中,DELETE 操作的逻辑实现在 DPC_EXT 类的 DELETE_ENTITY 方法中。
重写DELETE_ENTITY 方法代码如下:
DATA: ls_key TYPE zkjuser,
lv_id TYPE int1.
" 1. 从 iv_key_tab 中提取主键值
READ TABLE it_key_tab INTO DATA(ls_key_tab) WITH KEY name = 'Id'.
IF sy-subrc = 0.
lv_id = ls_key_tab-value.
ELSE.
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = /iwbep/cx_mgw_busi_exception=>business_error
message = '主键 Id 未提供'.
ENDIF.
" 2. 检查记录是否存在(可选,DELETE 语句本身会检查)
SELECT COUNT(*) FROM zkjuser INTO @DATA(lv_mandt)
WHERE id = @lv_id .
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = /iwbep/cx_mgw_busi_exception=>business_error
message = |用户 Id = { lv_id } 不存在|.
ENDIF.
" 3. 执行删除
DELETE FROM zkjuser WHERE id = @lv_id.
IF sy-subrc = 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
EXPORTING
textid = /iwbep/cx_mgw_busi_exception=>business_error
message = '删除失败,请重试'.
ENDIF.
关键点解析
-
主键提取 :参数
it_key_tab是一个表,每行包含字段名(name)和值(value)。你需要根据实体定义,从其中提取所有主键字段。 -
存在性检查:可选但推荐,可以给出明确的业务错误提示(如"记录不存在")。
-
事务提交 :删除成功后务必
COMMIT WORK,失败则ROLLBACK WORK。 -
异常抛出 :用
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception返回错误,客户端会收到400 Bad Request或500状态码及错误消息。
5. 完整的 OData CRUD 对照表
| 操作 | HTTP 方法 | URI 示例 | 常见状态码 | 是否需要请求体 | CSRF Token |
|---|---|---|---|---|---|
| Create | POST | /ZUSERSet |
201 | 是 (Atom/JSON) | 必须 |
| Read | GET | /ZUSERSet(3) |
200 | 否 | 不需要 |
| Update | PUT / MERGE | /ZUSERSet(3) |
204 | 是 | 必须 |
| Delete | DELETE | /ZUSERSet(3) |
204 | 否 | 必须 |
注意:UPDATE 既可以通过 PUT(完整替换)实现,也可以通过 MERGE/PATCH(部分更新)实现,具体取决于服务配置。
6 . 总结
如果你已经完成了 OData 的查询和创建功能,实现删除会非常顺畅。希望本文能帮助你快速掌握 OData DELETE 的使用。如果有任何问题,欢迎在评论区留言讨论!
