SAP-Fiori:系列(4)Gateway ODATA (V2) CURD之Delete

在 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 请求示例

假设我们要删除 ZUSERSetId 为 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 操作示例

这是系统存在的 ZUSERSetId 为 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 Request500 状态码及错误消息。


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 的使用。如果有任何问题,欢迎在评论区留言讨论!

相关推荐
HeathlX4 小时前
SAP-BTP :(7)RAP-EML
abap
爱喝水的鱼丶1 天前
SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行
运维·服务器·数据库·学习·sap·abap
爱喝水的鱼丶2 天前
SAP-ABAP:第二篇:实操避坑篇——ABAP Hello World程序创建、语法校验到调试运行全流程指南
运维·服务器·数据库·学习·sap·abap
清风雅雨4 天前
SAP-PP 物料标准成本发布异常不能生产报工CKMLPP改表解决方案
sap
HeathlX4 天前
SAP-BTP :(5)RAP-CDS VIEW发布ODATA UI Service
abap
HeathlX5 天前
SAP-BTP :(4)RAP-创建CDS DATA模型映射和拓展
abap
爱喝水的鱼丶6 天前
SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程(四篇连载) 第三篇:ADT常用开发插件与个性化配置教程
数据库·学习·sap·abap
爱喝水的鱼丶6 天前
SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程(四篇连载) 第二篇:ADT客户端完整安装与初始配置教程
运维·开发语言·学习·sap·abap
爱喝水的鱼丶6 天前
SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程(四篇连载)第四篇:ADT连接故障排查与环境迁移教程
运维·开发语言·数据库·学习·sap·abap
爱喝水的鱼丶7 天前
SAP-ABAP:SAP 与 ABAP 关联逻辑与入门路径:业务×开发的协作指南
服务器·前端·数据库·学习·sap·abap