ABAP 通过REST Service + RFC实现数据传输

本文档详细介绍了如何使用ABAP创建一个HTTP服务接口,该接口通过工厂编码查询工厂数据。首先定义了输入和输出数据结构,然后解析JSON报文,根据输入查询数据库,并将结果转换回JSON。接着,创建关联表将HTTP请求方法与函数模块关联,实现了IF_HTTP_EXTENSION接口的类来处理请求。最后,通过SICF配置服务并进行测试。在Postman中,可以输入HTTP地址加上特定方法名进行调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建RFC

创建函数模块,模块中实现相应功能,本案例测试通过工厂编码查询工厂数据
传入参数在这里插入图片描述
传出参数在这里插入图片描述
在这里插入图片描述
实现代码

  DATA:BEGIN OF ls_input,
         werks TYPE t001w-werks,
       END OF ls_input.

  DATA:BEGIN OF ls_output,
         werks TYPE t001w-werks,
         name1 TYPE t001w-name1,
       END OF ls_output.

*---解析入站的json报文
  /ui2/cl_json=>deserialize( EXPORTING json = is_input
                              CHANGING data = ls_input ).

*---通过入站的条件查询数据
  IF ls_input-werks IS INITIAL.
    es_err_info-flag = abap_true.
    es_err_info-message = '请输入工厂编号'.
    RETURN.
  ENDIF.

  SELECT SINGLE
    werks
    name1
    FROM t001w
    INTO CORRESPONDING FIELDS OF ls_output
    WHERE werks = ls_input-werks.

  IF ls_output IS INITIAL.
    es_err_info-flag = abap_true.
    es_err_info-message = '未查询到工厂数据'.
    RETURN.
  ENDIF.

*---转换出站的json报文
  es_output = /ui2/cl_json=>serialize( data = ls_output ).

配置关联表

新建一张关联表,通过关联表将http请求中的方法名与实际函数模块名关联
在这里插入图片描述
新增一条关联数据在这里插入图片描述

定义实现 IF_HTTP_EXTENSION 接口的类

创建类并实现接口IF_HTTP_EXTENSION在这里插入图片描述
在这里插入图片描述
实现代码

    DATA:ls_input  TYPE string,
         ls_output TYPE string,
         ls_resp   TYPE string,
         lv_method TYPE string,
         lv_text   TYPE string.
    DATA:lv_funcnam  TYPE rs38l_fnam,
         ls_err_info TYPE zcms0001.
    DATA:BEGIN OF ls_msg,
           success       TYPE char10,
           message(2048),
           model         TYPE string,
         END OF ls_msg,
         lt_fields TYPE tihttpnvp.
    DATA:lv_flag.

*   获取调用时发送的json数据
    ls_input = server->request->if_http_entity~get_cdata( ).

*   get HEADER fields
    server->request->get_header_fields(
        CHANGING
          fields = lt_fields    "Header fields
      ).
      
    READ TABLE lt_fields
      WITH KEY name = '~query_string'
      ASSIGNING FIELD-SYMBOL(<lfs_field>).
    IF sy-subrc EQ 0.
      SPLIT <lfs_field>-value AT '&&' INTO DATA(lv_client) DATA(lv_query).
      SPLIT lv_query AT '=' INTO DATA(lv_param) DATA(lv_value).
      IF sy-subrc EQ 0.
*       获取方法是否已配置
        SELECT SINGLE * INTO @DATA(ls_test01)
          FROM zttestyh01 WHERE method = @lv_value.
        IF sy-subrc EQ 0.
          lv_funcnam = ls_test01-name.
          TRY.
              CALL FUNCTION lv_funcnam
                EXPORTING
                  is_input    = ls_input
                IMPORTING
                  es_output   = ls_output
                  es_err_info = ls_err_info
                EXCEPTIONS
                  faultmsg    = 1
                  OTHERS      = 2.
              IF ls_err_info-flag IS INITIAL AND sy-subrc EQ 0.
                ls_msg-success = 'true'.
                ls_msg-message = '查询到数据'."查询到数据
                lv_flag = abap_true.

*           反馈消息转换为JSON
                CALL METHOD /ui2/cl_json=>serialize
                  EXPORTING
                    data   = ls_msg
                  RECEIVING
                    r_json = ls_resp.
                FIND FIRST OCCURRENCE OF '"MODEL":'
                  IN ls_resp MATCH OFFSET DATA(lv_offset).
                IF sy-subrc EQ 0.
                  lv_offset += 8.
                  ls_resp = ls_resp+0(lv_offset) && ls_output && '}'.
                ENDIF.

              ELSE.
                ls_msg-success = 'false'.
                ls_msg-message = ls_err_info-message."请联系相关人员配置处理函数
              ENDIF.
            CATCH cx_sy_dyn_call_param_missing INTO DATA(lo_m).
              ls_msg-success = 'false'.
              lv_text = lo_m->get_text( ).
              MESSAGE s000(ytest) INTO ls_msg-message WITH lv_text."函数配置错误:&,请检查
            CATCH cx_root INTO DATA(lo_cx).
              ls_msg-success = 'false'.
              lv_text = lo_m->get_text( ).
              MESSAGE s000(ytest) INTO ls_msg-message WITH lv_text."函数配置错误:&,请检查
          ENDTRY.
        ELSE.
*         反馈消息
          ls_msg-success = 'false'.
          ls_msg-message = '未配置处理函数'."请联系相关人员配置处理函数
        ENDIF.
      ELSE.
*       反馈消息
        ls_msg-success = 'false'.
        ls_msg-message = '参数传入不正确'."参数传入不正确
      ENDIF.
    ELSE.
*     反馈消息
      ls_msg-success = 'false'.
      ls_msg-message = '未传输查询方法'."未传输查询方法
    ENDIF.

*   反馈消息转换为JSON
    IF lv_flag IS INITIAL.
      CALL METHOD /ui2/cl_json=>serialize
        EXPORTING
          data   = ls_msg
        RECEIVING
          r_json = ls_resp.
    ENDIF.
*   设置反馈json
    server->response->set_cdata(
      EXPORTING
        data   = ls_resp ).

配置SERVICE

事务码SICF在这里插入图片描述
路径default_host/sap下创建新的子元素在这里插入图片描述
在现在登录数据页签里录入登录数据,然后进入处理器清单页签将实现 IF_HTTP_EXTENSION 接口的类名录入,点击保存。在这里插入图片描述
右击服务点击激活在这里插入图片描述

调用测试

右击服务点击测试服务,获取http网址
在这里插入图片描述

打开postman,输入http地址然后加上“&&method=TEST01”在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值