SAP ABAP 使用SICF发布HTTP API接口

news2025/1/12 22:57:35

一、SE24创建类:Z_HCX_HTTP

1、创建类:

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

 

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、创建子元素:

 

 之后点击保存。

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

 3、获取URL调用地址:

直接打开默认是GET请求:

 在Postman 中测试post请求:

在SoapUI 中测试post请求:

 

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

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

 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"  注:未获取到数据

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习记录——십구 进程间通信(1) 管道

文章目录 1、进程间通信介绍1、目的2、发展 2、管道1、原理2、简单模拟实现3、总结 3、匿名管道——控制进程4、命名管道1、原理2、模拟实现 1、进程间通信介绍 之前所学都是单个进程&#xff0c;多个进程之间如何运转&#xff1f; 1、目的 数据传输&#xff1a;一个进程需要…

Linux下SOCKET编程

一、SOCKET编程 1、socket()函数 int socket(int protofamily, int type, int protocol);//返回sockfd返回值sockfd是描述符。 socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字&#xff0c;而socket()用于创建一个socket描述符&#xff08;socke…

2. C++使用Thread线程参数传递问题

1. 说明 在子线程函数中进行参数传递&#xff0c;实际上是Thread类的构造函数对传递的参数进行了拷贝&#xff0c;拷贝到线程独立的内存中&#xff0c;及时参数是引用的形式&#xff0c;也可以在新线程中进行访问&#xff0c;如果参数传递时的类型不一致&#xff0c;在线程的上…

Servlet(二)

目录 1.Cookie 和 Session 1.1HttpServletRequest 类中的相关方法 1.HttpSession getSession() 2.Cookie[] getCookies() 1.2HttpServletResponse 类中的相关方法 1.void addCookie(Cookie cookie) 1.3HttpSession 类中的相关方法 1.4Cookie 类中的相关方法 1.5网页登录…

详解Spring Security

目录 1.概述 2.登录 2.1.默认用户 2.2.自定义用户 2.3.加密 2.4.绕过加密 2.5.怎么传递用户信息 2.6.记住我 3.登出 4.使用数据库 4.1.jdbcAuthentication 4.2.userDetailsService 5.自定义处理器 6.更多细粒度的控制 7.原理简述 1.概述 Spring Security是一个…

使用 Kubernetes 运行 non-root .NET 容器

翻译自 Richard Lander 的博客 Rootless 或 non-root Linux 容器一直是 .NET 容器团队最需要的功能。我们最近宣布了所有 .NET 8 容器镜像都可以通过一行代码配置为 non-root 用户。今天的文章将介绍如何使用 Kubernetes 处理 non-root 托管。 您可以尝试使用我们的 non-root…

gateway报 netty堆外内存溢出问题解决io.netty.util.internal.OutOfDirectMemoryError

昨天线上网关突然无法访问。打开日志看到错误信息“io.netty.util.internal.OutOfDirectMemoryError” 堆外内存溢出。。这也没碰到过啊&#xff0c;看来今天准点下班的愿望又落空了。老规矩面向百度编程。先看看网上有没有其他兄弟碰到这个问题。一顿搜索之后发现&#xff0c;…

已解决windows pycocotools安装失败问题 —— 超简单

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect个人…

分库分表与分布式主键生成策略详解--一个无数人踩过却一直被人忽视的深坑

文章目录 一、从分库分表的一个神坑说起二、分布式主键要考虑哪些问题&#xff1f;三、主要的主键生成策略1、数据库策略2、应用单独生成3、第三方服务统一生成4、与第三方结合的segment策略 四、定制雪花算法1、如影随形的时钟回拨问题2、用主键生成策略优化分配工作进程位3、…

萤石“小步快走”,跨进智能家居生态圈

文丨智能相对论 作者丨Kinki 近日&#xff0c;萤石网络&#xff08;下称“萤石”&#xff09;举办了2023春季新品发布会&#xff0c;这是公司上市以来的首个新品发布会&#xff0c;除了拳头产品智能家居摄像机之外&#xff0c;还有智能入户产品、TV Studio等十多款新品&#…

NC65 集团业务参数 GLS01参数值的默认值作用是什么?

NC65 集团业务参数 GLS01参数值的默认值作用是什么&#xff1f; 用在总账系统的所有账簿。如果设置的期间个数大于12&#xff0c;还得要求所查询的账表支持跨年查询&#xff0c;比如科目余额表&#xff0c;不支持跨年&#xff08;注意&#xff1a;这里说的不支持跨年是指余额为…

4.2.1朴素模式匹配算法

什么是字符串的模式匹配&#xff1a; 从这段字符串里面搜索内容&#xff0c;被搜索的字符串我们称之为主串。 也可能匹配不到 主串长度为n&#xff0c;模式串长度为m。 朴素模式匹配算法&#xff1a;将主串中所有长度为m的字串依次与模式串对比&#xff0c;直到找到一个完全匹…

【JavaEE】File、InputStream和OutputStream的使用

1.File 在计算机中目录结构如下&#xff1a; 而File就表示一个目录或者一个普通文件。 File表示目录&#xff1a; File表示普通文件&#xff1a; 我们先来看File的构造方法&#xff1a; 构造器描述File(File parent, String child)根据父目录 孩子文件路径&#xff0c;创…

Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权

Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权 1. 前言1.1. 如何找编译好的EXP 2. 定时任务提权2.1. 查看定时任务2.2. 通配符注入提权2.2.1. 创建执行脚本2.2.2. 创建定时任务2.2.3. 查看效果2.2.4. 提权操作2.2.4.1. 切换普通用户2.2.4.2. 执行命令2.2.4.3…

优先、双端队列-我的基础算法刷题之路(八)

本篇博客旨在整理记录自已对优先队列、双端队列的一些总结&#xff0c;以及刷题的解题思路&#xff0c;同时希望可给小伙伴一些帮助。本人也是算法小白&#xff0c;水平有限&#xff0c;如果文章中有什么错误之处&#xff0c;希望小伙伴们可以在评论区指出来&#xff0c;共勉 &…

Netty 源码解析(下)

接上一篇博客 Netty 源码解析&#xff08;上&#xff09;继续分析 上一篇博客中已经分析了绝大部分 ChannelFuture cf bootstrap.bind(9000).sync(); 这一行代码&#xff0c;当这一行代码运行完时&#xff0c;Netty服务端就已经启动好了&#xff0c;接下来就是接收链接&#x…

Spring Security OAuth2.0(二)-----简化模式/密码模式/客户端模式/刷新 token

简化模式 代码示例 修改authorization_server授权服务模块 新增“implicit” 和修改回调地址为本次地址 修改第三方应用项目搭建新页面模拟 新建implicit.jsp <% page contentType"text/html;charsetUTF-8" language"java" isELIgnored"fals…

C++入门篇(二)

目录 一、引用1.1 什么是引用&#xff1f;1.2 引用的特性1.3 常引用1.4 引用的使用场景1.5 传值和传引用效率比较1.5.1 传值和传引用做参数的性能对比1.5.2 传值和传引用做返回值的性能对比 1.6 引用和指针之间的区别 二、内联函数2.1 什么是内联函数&#xff1f;2.2 内联函数的…

知识变现海哥|研究了100个项目,这个才是人生逆袭首选

&#xff08;本文源自公号跟海哥学知识变现&#xff0c;移步公号与100万知识变现/知识付费创业者&#xff0c;一起学知识变现知识付费干货&#xff0c;回‘领书’获取3本电子书&#xff1a;【知识付费秘籍】【知识创业者成长手册】【100个知识付费成功案例】) 经常有人问海哥&a…

什么是中断向量表?作用是什么?为什么需要偏移?

一、定义与特点 定义&#xff1a;中断向量表(interrupt vector table)包含中断服务程序地址的特定内存区域&#xff0c;这些服务程序是处理外部硬件中断请求的代码。 特点&#xff1a;这些中断服务程序(函数)在中断向量表中的位置是由半导体厂商定好的&#xff0c;当某个中断…