SAP-ABAP:从SAP中暴露REST API:完整实操SICF接口开发指南

从SAP中暴露REST API:完整实操接口开发指南

核心摘要 :本文提供一份零基础可操作的SAP REST API开发指南,通过5个清晰步骤,从SICF配置到Postman测试全流程演示,帮助SAP开发者快速构建接收JSON参数、返回SFLIGHT表数据的API接口。

📋 教程全景导览

在SAP系统开发中,REST API是实现系统间数据交互的核心方式之一 。本文将带您一步步完成从SAP暴露REST API的全过程,该API接收JSON格式的CARRID参数,并返回SFLIGHT表中的相关数据,适合SAP开发初学者快速上手


一、前期准备

准备事项 具体说明 备注
权限准备 确保具备SAP系统操作权限,可访问TCode:SICF(定义服务)、SE24(类构建器) 必要权限
测试数据 若SFLIGHT表无测试数据,需准备程序SAPBC_DATA_GENERATOR用于生成测试数据 可选准备
测试工具 准备API测试工具(如Postman),用于后续接口验证 推荐使用

二、步骤详解

步骤1:通过SICF创建服务节点
  1. 启动SICF :输入TCode SICF,进入"定义服务"界面,按屏幕提示填写筛选条件(语言默认选择English),点击"执行"。

  2. 导航至路径 :在左侧层级结构中,导航至 default_host → sap → bc,右键点击"bc",选择"新建子元素"。

  3. 创建服务 :弹出SAP命名空间提示框,直接点击"确定",输入服务名称(示例:ZTESTM1),选择"独立服务"类型,点击"确定"。

  4. 配置服务数据 :进入服务配置界面,切换至"服务数据"标签页,填写描述(示例:For Test),其他保持默认。

  5. 设置登录数据 :切换至"登录数据"标签页,选择"使用所有登录程序",安全会话设为"无限制",认证方式选择"标准SAP用户"。

  6. 指定处理器 :切换至"处理器列表"标签页,输入服务处理器类名称(ZCL_HTTPHANDLER),点击"保存"(此时会提示类不存在,后续将创建)。

abap 复制代码
// 注意:此时保存会收到警告"类ZCL_HTTPHANDLER不存在"
// 这是正常情况,我们将在下一步创建此类
步骤2:通过SE24创建处理器类
  1. 启动SE24 :输入TCode SE24 ,进入类构建器,输入类名称ZCL_HTTPHANDLER,点击"创建"。

  2. 配置类属性 :在创建类界面,填写描述(HTTP Request Handler),实例生成设为"公开",类类型选择"常规ABAP类",点击"保存"。

  3. 设置本地对象 :弹出"创建对象目录条目"窗口,选择"本地对象",点击"确定"。

  4. 添加接口 :切换至"接口"标签页,输入接口名称IF_HTTP_EXTENSION,点击"添加"并激活接口。

  5. 定义属性 :切换至"属性"标签页,添加属性IF_HTTP_SERVER,类型设为REF TO IF_HTTP_SERVER,可见性设为"受保护"。

  6. 进入方法编辑 :切换至"方法"标签页,系统会自动生成方法IF_HTTP_EXTENSION~HANDLE_REQUEST,双击该方法名称,进入代码编辑界面。

关键点:IF_HTTP_EXTENSION接口是SAP HTTP处理器必须实现的接口,它包含handle_request方法,用于处理所有HTTP请求。

步骤3:编写方法逻辑(核心步骤)

在方法IF_HTTP_EXTENSION~HANDLE_REQUEST中输入以下ABAP代码,实现JSON payload解析、SFLIGHT表查询及响应返回:

abap 复制代码
METHOD if_http_extension~handle_request.
  TYPES : BEGIN OF ty_in_data,
            carrid TYPE s_carr_id,
          END OF ty_in_data,
          BEGIN OF ty_error,
            type    TYPE char1,
            message TYPE char50,
          END OF ty_error.

  DATA : _request_data TYPE string,
         respons_data_ TYPE string,
         _s_jsoninput  TYPE ty_in_data,
         _t_error      TYPE STANDARD TABLE OF ty_error,
         o_response_   TYPE REF TO if_http_response,
         _o_exception  TYPE REF TO cx_root.

  FIELD-SYMBOLS : <fs_outtab> TYPE ANY TABLE.

  _http_server  = server.
  TRY.
* 解析JSON请求体
      _request_data = server->request->get_cdata( ).
      CALL METHOD /ui2/cl_json=>deserialize
        EXPORTING
          json        = _request_data
          pretty_name = /ui2/cl_json=>pretty_mode-camel_case
        CHANGING
          data        = _s_jsoninput.

      IF _s_jsoninput IS NOT INITIAL.
* 查询SFLIGHT表数据
        SELECT * FROM sflight INTO TABLE @DATA(_t_sflight)
          WHERE carrid EQ @_s_jsoninput-carrid.
        ASSIGN _t_sflight TO <fs_outtab>.

        IF sy-subrc IS NOT INITIAL.
* 无数据时返回错误信息
          _t_error = VALUE #( BASE _t_error ( type = 'E' message = 'No data found' ) ).
          ASSIGN _t_error TO <fs_outtab>.
        ENDIF.
      ELSE.
* 空请求体时返回错误信息
        _t_error = VALUE #( BASE _t_error ( type = 'E' message = 'Empty Payload' ) ).
        ASSIGN _t_error TO <fs_outtab>.
      ENDIF.

* 转换结果为JSON格式并返回
      IF <fs_outtab> IS ASSIGNED.
        respons_data_ = /ui2/cl_json=>serialize(
                            data        = <fs_outtab>
                            compress    = abap_false
                            pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).

        o_response_ = _http_server->response.
        o_response_->set_status( code = '200' reason = 'OK' ).
        o_response_->set_content_type( 'application/json' ).
        o_response_->set_cdata( respons_data_ ).
      ELSE.
        o_response_->set_status( code = '500' reason = 'Internal Server Error' ).
      ENDIF.
    CATCH cx_root INTO _o_exception.
      _http_server->response->set_status( code = 500 reason = 'Internal Server Error' ).
  ENDTRY.
ENDMETHOD.

代码编写完成后,点击"保存"并"激活"类和方法。

步骤4:激活SICF服务
  1. 返回SICF:返回TCode SICF界面,找到创建的服务ZTESTM1,右键点击该服务。
  2. 激活服务:选择"激活",在弹出的确认窗口中点击"确定",完成服务激活。

注意:只有在处理器类创建并激活后,SICF服务才能成功激活。

步骤5:API测试(Postman实操)
测试准备
准备项 具体说明
获取URL 从Basis团队获取API访问URL(格式示例:https://[SAP服务器地址]/sap/bc/ZTESTM1)
数据准备 若SFLIGHT表无数据,执行程序SAPBC_DATA_GENERATOR生成测试数据
正常请求测试
  1. 打开Postman ,选择请求方式为GET
  2. 输入API URL,在"Body"标签页选择"raw",格式设为JSON。
  3. 输入请求参数{"carrid": "AA"},点击"发送"。
  4. 成功响应:返回200 OK状态码,包含SFLIGHT表中CARRID为"AA"的航班数据(如机型、价格、座位数等)。
异常场景测试
测试场景 输入 预期响应
空请求体 不输入任何JSON参数 {"type":"E","message":"Empty Payload"}
无数据测试 {"carrid": "ZZ"} {"type":"E","message":"No data found"}

三、关键注意事项

序号 注意事项 说明
1 避免在SAP命名空间(/sap)下创建自定义节点 后续系统升级可能被覆盖
2 确保处理器类ZCL_HTTPHANDLER已正确实现IF_HTTP_EXTENSION接口 否则服务无法正常响应
3 测试时若出现权限问题,需检查SAP用户的相关授权配置 包括HTTP服务权限和表访问权限
4 接口返回格式为JSON,前端系统可直接解析使用 无需额外格式转换

📝 总结与扩展

通过以上五个步骤,您已成功从SAP中暴露REST API并实现数据交互。这个简单的航班查询API展示了SAP系统与现代应用架构融合的基本模式。

如需扩展功能(如增加查询条件、权限校验、分页支持等),可在处理器类的handle_request方法中修改代码逻辑。现代SAP开发也推荐考虑OData服务作为替代方案,它提供了更丰富的元数据和标准化的查询能力。

相关推荐
独自破碎E2 小时前
【双指针】反转字符串
java·开发语言
信也科技布道师2 小时前
基石Redis实例自动化调度之路
java·开发语言·redis·自动化
鸠摩智首席音效师2 小时前
如何在 Docker 容器下运行 cronjob ?
运维·docker·容器
橙露2 小时前
Kubernetes 集群运维:故障排查、资源调度与高可用配置
运维·容器·kubernetes
666HZ6662 小时前
程序设计竞赛java
java·开发语言
开发者小天2 小时前
python查询天气小示例
开发语言·python
天空属于哈夫克32 小时前
企微API+RPA(机器人流程自动化)高效实战指南
linux·运维·服务器·自动化·企业微信·rpa
知行合一。。。2 小时前
Python--04--数据容器(元组)
开发语言·python