SICF + IF_HTTP_EXTENSION 自定义 JSON REST 接口

步骤 1:SE24 创建处理类(100% 可激活)

  1. 事务码 SE24,输入类名 ZCL_HTTP_RFC_SRV,点击「创建」
  2. 类属性设置:公共类、最终类、实例化方式为「公共」,保存
  3. 切换到「接口」标签页,输入 IF_HTTP_EXTENSION 回车,保存
  4. 切换到「方法」标签页,双击 IF_HTTP_EXTENSION~HANDLE_REQUEST 进入方法实现编辑器
  5. 仅在方法内部粘贴以下代码(类定义、实现外壳由系统自动生成,不要手动粘贴)

abap

复制代码
DATA: lo_req   TYPE REF TO if_http_request,
      lo_rsp   TYPE REF TO if_http_response,
      lv_body  TYPE string,
      iv_aufnr TYPE aufnr,
      lt_out   TYPE TABLE OF zrfc_get_aufnr_a_out,
      lv_json  TYPE string.

" 获取请求/响应对象(属性调用,不加括号)
lo_req = server->request.
lo_rsp = server->response.

" 读取POST请求体
lv_body = lo_req->get_cdata( ).
IF lv_body IS INITIAL.
  lv_json = '{"code":400,"msg":"请求体不能为空"}'.
  lo_rsp->set_status( code = 400 reason = 'Bad Request' ).
ELSE.
  " JSON反序列化入参
  /ui2/cl_json=>deserialize(
    EXPORTING
      json = lv_body
    CHANGING
      data = iv_aufnr
  ).

  " 调用业务RFC
  CALL FUNCTION 'ZRFC_GET_AUFNR_A'
    EXPORTING
      i_aufnr = iv_aufnr
    TABLES
      ot_out  = lt_out.

  " 结果序列化为JSON
  /ui2/cl_json=>serialize(
    EXPORTING
      data = lt_out
    RECEIVING
      r_json = lv_json
  ).
  lo_rsp->set_status( code = 200 reason = 'OK' ).
ENDIF.

" 设置响应头与返回内容
lo_rsp->set_content_type( content_type = 'application/json;charset=utf-8' ).
lo_rsp->set_cdata( data = lv_json ).
lo_rsp->set_header_field( name = 'Access-Control-Allow-Origin' value = '*' ).
  1. 保存方法,返回类主界面,点击「激活」,无语法错误。

步骤 2:SICF 发布 HTTP 服务

  1. 事务码 SICF,执行后展开 default_host 节点
  2. 选择你要放置的路径(如 default_host/sap/zapi),右键「新建子元素」
  3. 服务名称输入 zrfc_aufnr,类型选择「独立服务」,描述自定义,保存
  4. 切换到「处理器列表」标签页,处理器类填入 ZCL_HTTP_RFC_SRV
  5. 切换到「登录数据」标签页:
    • 测试环境可勾选「无需登录」,填入有权限的系统用户和密码
    • 生产环境建议配置基础认证或 SSO
  6. 右键该服务节点,点击「激活服务」

步骤 3:接口测试

  • 请求地址:http://<系统域名>:<端口>/sap/zapi/zrfc_aufnr
  • 请求方式:POST
  • 请求头:Content-Type: application/json
  • 请求体示例:

json

复制代码
"0000123456"