SAP ABAP 使用SICF发布HTTP API接口

这篇具有很好参考价值的文章主要介绍了SAP ABAP 使用SICF发布HTTP API接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SE24创建类:Z_HCX_HTTP

1、创建类:

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

2、切换到接口(interface)页签,输入IF_HTTP_EXTENSION ,回车。切换到方法(method)页签,双击IF_HTTP_EXTENSION~HANDLE_REQUEST进入代码编辑界面。

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

 文章来源地址https://www.toymoban.com/news/detail-505725.html

3、在IF_HTTP_EXTENSION~HANDLE_REQUEST方法中编写代码:(注:文末附另一种写法)

   METHOD if_http_extension~handle_request.
     DATA: BEGIN OF ls_data,
             matnr TYPE matnr,
             maktx TYPE maktx,
           END OF ls_data.
     DATA: lt_data LIKE TABLE OF ls_data.

     DATA: lt_fields TYPE tihttpnvp.
     FIELD-SYMBOLS: <fs_field> LIKE LINE OF lt_fields.

     DATA: lv_method TYPE string. "获取GET/POST方式
     DATA: lv_json  TYPE string,  "返回参数
           lv_json1 TYPE string,  "获取传回值数据
           lv_json2 TYPE string.  "获取传回值数据


*    获取JSON抬头数据
     server->request->get_header_fields(
         CHANGING
           fields = lt_fields
       ).
     lv_method = server->request->get_header_field( name = '~request_method' )."获取GET/POST方式
     CALL METHOD server->response->if_http_entity~set_content_type
       EXPORTING
         content_type = 'application/json'.

     CASE lv_method.
       WHEN 'GET'.
*        获取数据
         SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE lt_data
           FROM makt
           UP TO 20 ROWS.

*        内表转换JSON
         CALL METHOD /ui2/cl_json=>serialize
           EXPORTING
             data   = lt_data
           RECEIVING
             r_json = lv_json.

*        将行数据JSON返回给调用端
         server->response->set_cdata(
           EXPORTING
             data   = lv_json
         ).

         server->response->set_status( code = 200 reason = 'OK' ).
       WHEN 'POST'.
*        获取JSON行数据
         lv_json1 = server->request->if_http_entity~get_cdata( ).
*        解析json至内表方法1
         /ui2/cl_json=>deserialize( EXPORTING json = lv_json1
                                     CHANGING data = ls_data ).
         IF NOT lv_json1 IS INITIAL.
*          获取数据
           SELECT matnr maktx INTO CORRESPONDING FIELDS OF TABLE lt_data
             FROM makt
             UP TO 20 ROWS
             where matnr = ls_data-matnr.
*         内表转换json
           CALL METHOD /ui2/cl_json=>serialize
             EXPORTING
               data   = lt_data
             RECEIVING
               r_json = lv_json.
*        将行数据JSON返回给调用端
           server->response->set_cdata(
             EXPORTING
               data   = lv_json
           ).
         ENDIF.

         LOOP AT lt_fields INTO DATA(ls_fields).
           CASE ls_fields-name.
             WHEN 'lt_data'.
               lv_json2 = ls_fields-value.
           ENDCASE.
         ENDLOOP.
*        解析json至内表方法1
         /ui2/cl_json=>deserialize( EXPORTING json = lv_json2
                                     CHANGING data = lt_data ).

         IF NOT lv_json2 IS INITIAL.
*        将行数据JSON返回给调用端
           server->response->set_cdata(
             EXPORTING
               data   = 'SoapUi传参已收到'
           ).
         ENDIF.
         server->response->set_status( code = 200 reason = 'OK' ).

     ENDCASE.
   ENDMETHOD.

二、使用事务码 SICF 在 default_host/sap/bc 节点下面创建子节点,用 Z_HCX_HTTP 类并激活方法: 

1、创建子元素:

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

 

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

 之后点击保存。

2、在default_host/sap中找到刚刚创建的子元素:Z_HCX_HTTP激活服务:

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

 3、获取URL调用地址:

SAP ABAP 使用SICF发布HTTP API接口

直接打开默认是GET请求:

SAP ABAP 使用SICF发布HTTP API接口

 在Postman 中测试post请求:

SAP ABAP 使用SICF发布HTTP API接口

在SoapUI 中测试post请求:

SAP ABAP 使用SICF发布HTTP API接口

 

文末附:上文步骤3提到的另一种写法。

1、手动再依次添加GET和POST方法,再依次选中,点击参数,添加参数SERVER - 类型Importing - 键入方法Type Ref To - 关联类型IF_HTTP_SERVER

SAP ABAP 使用SICF发布HTTP API接口

SAP ABAP 使用SICF发布HTTP API接口

 2、双击IF_HTTP_EXTENSION~HANDLE_REQUEST编写代码

  method IF_HTTP_EXTENSION~HANDLE_REQUEST.

    DATA(LV_METHOD) = SERVER->REQUEST->GET_METHOD( )."查看调用方法GET OR POST
    CASE LV_METHOD.

      WHEN 'GET'.
        ME->GET( SERVER ).

      WHEN 'POST'.
        ME->POST( SERVER ).

      WHEN OTHERS.
       "Sets current HTTP status code
        SERVER->RESPONSE->SET_STATUS( CODE = 405 REASON = '请求方法不支持,请联系管理员!' ).

    ENDCASE.

  endmethod.

3、根据业务需求情况,选择GET或POST编写代码,以GET为例: 

  method GET.

    TYPES:BEGIN OF TY_TAB,
      AUFNR TYPE AFPO-AUFNR, "生产订单号
*      WERKS TYPE MARC-WERKS, "工厂
*      MATNR TYPE AFPO-MATNR, "物料号
    END OF TY_TAB.
    DATA:GT_TAB TYPE TABLE OF TY_TAB,
         GS_TAB TYPE TY_TAB.

    TYPES:BEGIN OF TY_OUT,
      MATNR TYPE AFPO-MATNR, "物料号
      LGORT TYPE AFPO-LGORT, "库存地点
      PSMNG TYPE AFPO-PSMNG, "总数量
    END OF TY_OUT.
    DATA:GT_OUT TYPE TABLE OF TY_OUT,
         GS_OUT TYPE TY_OUT.

    DATA:
      BEGIN OF LS_REQUEST,
        ACTION TYPE STRING,           " 可以用来区分具体对应的处理类
        DATA   TYPE TABLE OF TY_TAB, " 表结构
      END OF LS_REQUEST,
      LV_JSON         TYPE STRING,
      LV_CONTENT_TYPE TYPE STRING,
      LV_JSON_OUT     TYPE STRING,
      LT_RETURN TYPE STANDARD TABLE OF BAPIRETURN,
      LS_RETURN TYPE BAPIRETURN.

    " DELIVERS THE HTTP BODY OF THIS ENTITY AS CHARACTER DATA
    LV_JSON  = SERVER->REQUEST->GET_CDATA( ).
    IF LV_JSON IS INITIAL.
      SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未解析到BODY参数,请检查' ).
      RETURN.
    ENDIF.

    " 将JSON转换成内表
    /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON CHANGING DATA = LS_REQUEST ).

    CASE LS_REQUEST-ACTION.
      WHEN 'ZGETPRINT'.

      WHEN OTHERS.
        SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未解析到对应ACTION,请检查' ).
        RETURN.
    ENDCASE.

    IF LS_REQUEST-DATA IS NOT INITIAL.
      GT_TAB = LS_REQUEST-DATA.
    ENDIF.

    LOOP AT GT_TAB INTO GS_TAB.
      "补全生产订单号的前导0.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GS_TAB-AUFNR
        IMPORTING
          OUTPUT = GS_TAB-AUFNR.

      MODIFY GT_TAB FROM GS_TAB.
    ENDLOOP.

*   获取打印数据
    SELECT MATNR LGORT PSMNG INTO CORRESPONDING FIELDS OF TABLE GT_OUT
      FROM AFPO FOR ALL ENTRIES IN GT_TAB
        WHERE AUFNR = GT_TAB-AUFNR.

    IF GT_OUT IS INITIAL.
      SERVER->RESPONSE->SET_CDATA( /UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500, SAP API SELECT ERROR' ) ).
       RETURN.
    ENDIF.

    LOOP AT GT_OUT INTO GS_OUT.
      "去除物料号的前导0.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
        EXPORTING
          INPUT  = GS_OUT-MATNR
        IMPORTING
          OUTPUT = GS_OUT-MATNR.

      MODIFY GT_OUT FROM GS_OUT.
    ENDLOOP.

*    内表转换JSON
    CALL METHOD /UI2/CL_JSON=>SERIALIZE
      EXPORTING
        DATA   = GT_OUT
      RECEIVING
        R_JSON = LV_JSON_OUT.

*   将行数据JSON返回给调用端
    SERVER->RESPONSE->SET_CDATA(
      EXPORTING
        DATA   = LV_JSON_OUT ).

  endmethod.

4、请求示例

{

  "ACTION""ZGETPRINT",

  "DATA": [

      {

            "AUFNR":"1000003"

        }

  ]

}

5、响应示例​​​

A[{"MATNR":"11000042","LGORT":"4071","PSMNG":1620.000}]

B"CODE:500, SAP API SELECT ERROR"  注:未获取到数据

 

到了这里,关于SAP ABAP 使用SICF发布HTTP API接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ABAP:调用HTTP接口详解

    DATA:pv_http_client TYPE REF TO if_http_client, pv_url TYPE string. 1.可以通过URL连接或者IP:端口连接,根据实际情况而定, 建议使用URL,省去地址服务器域名转换 \\\"URL接连 CALL METHOD cl_http_client=create_by_url EXPORTING url = pv_url IMPORTING client = pv_http_client EXCEPTIONS argument_not_found = 1 plugin_not_active = 2

    2023年04月12日
    浏览(43)
  • ABAP - 调用HTTP/HTTPS接口上传文件

    如果调用该外部接口是需要使用Oauth2.0的话,可参照该文章里的OAuth2.0的部分: ABAP代码使用OAuth2.0 Client Credential调用外部API 首先,先将文件内容转成binary格式的内表 , 可参照文章: 内表文件的,可参照ABAP - 下载ALV内表 - download ALV internal table SOST里的附件的,可参照ABAP获取发

    2024年02月20日
    浏览(43)
  • ABAP调用阿里云接口-短信服务-HTTP协议及签名(abap版本)<转载>

    原文链接:https://blog.csdn.net/xiefireworks/article/details/113037650 阿里云接口文档请参考官网地址 https://help.aliyun.com/document_detail/59210.html?spm=5176.8195934.J_5834642020.5.11ba4378DLVi4O 此处仅介绍使用ABAP完成阿里云短信服务签名请求的完成。 第一步:请求参数 1 abap 生成的uuid为32位不带“-”

    2024年02月16日
    浏览(47)
  • SAP ABAP 使用GENIOS求解线性规划问题的简单例子

    主要内容来自Operations Research ABAP ,结合我遇到的需求,做了一些修改。 需求:有BOX1和BOX2两种箱子,分别能包装不同数量的A物料和B物料,给出若干数量的A, B物料,怎样包装可以使箱子数最少? 线性规划有助于解决类似问题。 以下是一个示例程序,包含必要的注释,   运行

    2024年02月16日
    浏览(46)
  • API 接口主流协议有哪些?如何创建 HTTP/HTTP、WebSocket/WebSockets、TCP/UDP、gRPC、SOAP、Dubbo/HSF 等不同协议?

    API 接口协议繁多,不同的协议有着不同的使用场景。70% 互联网应用开发者日常仅会接触到最通用的 HTTP 协议,相信大家希望了解更多其他协议的信息。我们今天会给大家介绍各种 API 接口主流协议和他们之间的关系。 接口协议分成两类: 传输层协议和应用层协议。 传输层协

    2023年04月21日
    浏览(92)
  • SAP ABAP中使用函数ALSM_EXCEL_TO_INTERNAL_TABLE读取EXCEL中不同的SHEET数据

    SAP提供了标准的读取EXCEL的函数(ALSM_EXCEL_TO_INTERNAL_TABLE),但是此标准函数无法满足对同一EXCEL 进行不同SHEET的数据读取,一下方法就是教你如何通过修改程序来实现ALSM_EXCEL_TO_INTERNAL_TABLE读取多个SHEET; 一、拷贝ALSM_EXCEL_TO_INTERNAL_TABLE函数,拷贝时函数组选择自定义函数组 二

    2024年02月14日
    浏览(43)
  • SAP/ABAP(二)

    一、循环结构 二、条件判断 三、异常处理(cx-root) 四、结构体,工作区 五、内表

    2024年02月17日
    浏览(46)
  • java创建上传文件接口并使用HTTP测试

    备注: 使用jersey框架 2.1.1.上传本地文件 参考链接: Jersey (JAX-RS) multiple files upload example

    2024年02月11日
    浏览(287)
  • SAP ABAP技术文章合集_微信公众号:ABAP猿

    序号 文章标题 01 ABAP OOALV-基本显示 02 ABAP OOALV-排序、过滤 03 ABAP OOALV-合计、小计 04 ABAP OOALV-选择模式、触发事件 05 ABAP OOALV-隐藏列、修改列标题、添加图标列、调整列位置 06 ABAP OOALV-固定列、鼠标悬停文本 07 ABAP OOALV-颜色(列、行、单元格) 08 ABAP OOALV-样式(列、行、单元格

    2024年02月03日
    浏览(50)
  • SAP ABAP 用户状态锁定案例

    一、前言 项目需求是根据当天及前两天的离职员工信息(假设这是一个定时器任务每天下午5点执行程序,计算前两天的员工工号是为了将5点之后办理离职的员工工号找出来),将这些员工在用户表 USR02 中的锁定状态设置为 “64”,以保证离职员工无法继续使用系统账号。

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包