SAP RESTFUL接口方式发布SICF实现全路径

其他相关资料帖可参考:

https://blog.csdn.net/woniu_maggie/article/details/146210752
https://blog.csdn.net/SAPmatinal/article/details/134349125
https://blog.csdn.net/weixin_44382089/article/details/128283417

【业务场景】

外部系统不想通过RFC (需要安装SAP官网的组件DDL等架包才能支持SAP 远程RFC的JDBC访问,比较麻烦)和WEBSERIVE服务方式访问接口,可通过restful接口方式访问更方便

1.SE24新建CLASS类: ZCL_QUERY_GDDH_DATA

激活,然后添加interface接口:IF_HTTP_EXTENSION并激活。

2.实现IF_HTTP_EXTENSION~HANDLE_REQUEST

扩展方法IF_HTTP_EXTENSION~HANDLE_REQUEST, 可以根据GET/POST请求方式处理,这个接口采用的是POST请求方式

部分参数可以放到URL上面参数传入,若有TOKEN认证放在REQUEST请求的BODY里面以json方式传入,这个跟对方协商好就行,注意信息安全要求。

POST参数设置

 if_http_extension~handle_request.方法中获取接口的调用方式是GET / POST请求

METHOD if_http_extension~handle_request.

  "调用的方法 GET / POST
  DATA(lv_method) = server->request->get_method( ).

  CASE lv_method.
    WHEN 'GET'.
      me->get( server ).

    WHEN 'POST'.
      me->post( server ).

  ENDCASE.
ENDMETHOD. 

GET请求方式: 

  METHOD get.
    TYPES:
      BEGIN OF ty_input,
        token TYPE string,
      END OF ty_input.

    DATA: BEGIN OF ls_result,
            data    TYPE STANDARD TABLE OF ty_input,
            msg     TYPE string,
            success TYPE string,
          END OF ls_result.

    DATA: lt_fields       TYPE tihttpnvp,
          ls_fields       TYPE ihttpnvp,
          lv_header_query TYPE string,
          lv_data         TYPE string,
          lv_html         TYPE string,
          lv_body         TYPE string,
          lv_token        TYPE string,
          lv_content_type TYPE string,
          lv_md5          TYPE string,
          lv_algo         TYPE string,
          ls_info         TYPE zshr_pernr_info_gddh,
          lv_zphone       TYPE zphone,
          lv_icnum        TYPE psg_idnum.

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

    "Json结构
    DATA: BEGIN OF ls_request,
            datalist TYPE TABLE OF zshr_pernr_info_gddh,
          END OF ls_request.

    "传输结构
    DATA: ls_itab TYPE zshr_pernr_info_gddh,
          lt_itab TYPE TABLE OF zshr_pernr_info_gddh.

    server->request->get_form_fields( CHANGING fields = lt_fields ).
    IF lt_fields IS INITIAL.
      server->response->set_status( code = 404 reason = '未查询到传入参数,请检查' ).
    ENDIF.

    LOOP AT lt_fields INTO ls_fields.
      TRANSLATE ls_fields-name TO UPPER CASE.
      CASE ls_fields-name.
        WHEN 'ZPHONE'.
          lv_zphone = ls_fields-value.

        WHEN 'ICNUM'.
          lv_icnum = ls_fields-value.
        WHEN OTHERS.
      ENDCASE.
    ENDLOOP.

    IF lv_zphone IS INITIAL.
      server->response->set_status( code = 404 reason = '手机号码必传,请检查' ).
    ENDIF.

    CALL FUNCTION 'ZHRFM_USER_INFO_GDDH'
      EXPORTING
        iv_zphone = lv_zphone
        iv_icnum  = lv_icnum
      IMPORTING
        es_info   = ls_info.

    server->response->set_cdata(
        /ui2/cl_json=>serialize( data        = ls_info
                                 compress    = abap_true
                                 pretty_name = /ui2/cl_json=>pretty_mode-camel_case ) ).

    server->response->set_status( code = 200 reason = 'OK' ).
    lv_content_type = 'application/json'.
    server->response->set_content_type( lv_content_type ).

  ENDMETHOD.

POST请求方式:

  METHOD post.
    TYPES:
      BEGIN OF ty_input,
        token TYPE string,
      END OF ty_input.

    DATA: BEGIN OF ls_result,
            data    TYPE STANDARD TABLE OF ty_input,
            msg     TYPE string,
            success TYPE string,
          END OF ls_result.

    DATA: lt_fields       TYPE tihttpnvp,
          ls_fields       TYPE ihttpnvp,
          lv_header_query TYPE string,
          lv_data         TYPE string,
          lv_html         TYPE string,
          lv_body         TYPE string,
          lv_token        TYPE string,
          lv_content_type TYPE string,
          lv_md5          TYPE string,
          lv_algo         TYPE string,
          ls_info         TYPE zshr_pernr_info_gddh,
          lv_zphone       TYPE zphone,
          lv_icnum        TYPE psg_idnum.

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

    "Json结构
    DATA: BEGIN OF ls_request,
            datalist TYPE TABLE OF zshr_pernr_info_gddh,
          END OF ls_request.

    "传输结构
    DATA: ls_itab TYPE zshr_pernr_info_gddh,
          lt_itab TYPE TABLE OF zshr_pernr_info_gddh.

    " get HEADER fields
    server->request->get_header_fields( CHANGING fields = lt_fields  ).
    lv_data = server->request->if_http_entity~get_cdata( ).

    "获取HTTP Body
    lv_body = server->request->get_cdata( ).

    "对方采用了basis认证登录方式
*lv_token = '7815696ecbf1c96f'.
**TOKEN加密认证
*    TRY.
*        lv_algo = 'MD5'.         " MD5, SHA1, SHA256, SHA384, SHA512
*        cl_abap_message_digest=>calculate_hash_for_char( EXPORTING if_algorithm = lv_algo
*                                                                   if_data      = lv_token
*                                                         IMPORTING
*                                                                   ef_hashstring = lv_md5 ).
*      CATCH cx_root INTO DATA(e_text).
*    ENDTRY.
*
*
*    "将Json转换成内表
*    TRY.
*
*        CALL METHOD /ui2/cl_json=>deserialize(
*          EXPORTING
*            json        = lv_body
*            pretty_name = /ui2/cl_json=>pretty_mode-camel_case
*          CHANGING
*            data        = ls_result ).

*
*        IF ls_result-data IS NOT INITIAL.
*          READ TABLE ls_result-data INTO DATA(ls_data) INDEX 1.
*          IF sy-subrc EQ 0.
*            IF ls_data-token NE lv_md5.
*              server->response->set_status( code = 400 reason = 'Token Authority Check failed' ).
*              server->response->set_cdata(
*                      /ui2/cl_json=>serialize( data        = ls_info
*                                               compress    = abap_true
*                                               pretty_name = /ui2/cl_json=>pretty_mode-camel_case ) ).
*              EXIT.
*            ENDIF.
*          ENDIF.
*        ENDIF.
*
*      CATCH cx_sy_move_cast_error.
*      CATCH cx_root.
*    ENDTRY..

    " Read the fields table and look for name "~query_string" -- this will contain the URL query
    READ TABLE lt_fields ASSIGNING <fs_field> WITH KEY name = '~query_string'.
    IF sy-subrc EQ 0.
      SPLIT <fs_field>-value AT '&' INTO TABLE DATA(lt_data).
      DELETE lt_data INDEX 1.
      LOOP AT lt_data INTO DATA(lw_data).
        CASE sy-tabix.
          WHEN 1.
            SPLIT lw_data AT '=' INTO DATA(lv_str1) lv_zphone.
          WHEN 2.
            SPLIT lw_data AT '=' INTO DATA(lv_str2) lv_icnum.
        ENDCASE.
      ENDLOOP.
    ENDIF.

    IF lv_zphone IS INITIAL.
      CONCATENATE '{"message": "Please input ZPHONE'
                        'as query parameter."}'
                   INTO lv_html SEPARATED BY space.

*" Output to HTML
      server->response->set_cdata(
        EXPORTING
          data   = lv_html    " Character data
      ).
      server->response->set_status( code = 400 reason = 'Please input ZPHONE' ).
    ENDIF.

    CALL FUNCTION 'ZHRFM_USER_INFO_GDDH'
      EXPORTING
        iv_zphone = lv_zphone
        iv_icnum  = lv_icnum
      IMPORTING
        es_info   = ls_info.

    server->response->set_status( code = 200 reason = 'OK' ).
    lv_content_type = 'application/json'.

    "设置返回格式Json
    server->response->set_content_type( 'application/json' ).

    "返回Body数据
    server->response->set_cdata(
   /ui2/cl_json=>serialize( data        = ls_info
                            compress    = abap_true
                            pretty_name = /ui2/cl_json=>pretty_mode-camel_case ) ).


  ENDMETHOD.

3.事务代码SICF定义REST服务,配置用户密码(需要认证可不配置),添加处理类

登录认证方式

SU01新增后台接口访问用户,用户类型:S(服务)

 若对方采用默认的BASIC Auth权限认证登录方式,提供接口访问用户密码给用户。

对请求添加Basic Authentication账号密码,否则无法获取

对方访问的时候会弹出用户密码登录这是SAP认证方式,如何避免弹窗呢?

如果SICF服务配置了后台访问的用户密码,安全会话设置了不受限制,则不受弹窗。但是安全考虑还是需要对方采用basic auth认证访问登录,也可以再加token认证匹配双层check。sicf此处用户密码不配置如果给外围系统访问的话。

SAP这边默认是basic认证方式, 如果访问方接口调用直接在对方那边维护好咱们给的接口用户就不会弹出来了 。当然你还可以用别的认证方式甚至免密登录都可以。你可以试试postman然后维护好你的密码就肯定不再需要认证了。

注意因为对方basis认证登录所以sicf用户密码不配置,代码中的TOKEN获取MD5加密匹配验证的逻辑可跟对方协商是否需要。

SICF发布服务名称:ZRS_GDDH_DATA

处理器清单配置ZCL_QUERY_GDDH_DATA

保存激活.测试服务

SICF发布服务给对方的各个系统访问地址,对方对各个环境访问地址和端口等做防火墙网络策略申请:各个环境访问的域名或IP地址,及对应端口,还要用RFC方式还是HTTP方式访问可能涉及到不同的端口访问。以及生产环境主服务器(负载均衡),还是各个应用节点服务器访问申请可以跟BASIS确认好。

最后使用SOUPUI 或者POSTMAN接口调用联通测试

token验证处理

token有放body的有放header的,取token再调业务接口的模式跟对方协商好就行。 

 token方式http处理,token放请求header中处理方式:

"拼接后续要使用的tken
  CONCATENATE 'Bearer' re_login-access_token INTO re_login-access_token SEPARATED BY space.
  lo_http_client->request->if_http_entity~set_content_type( content_type = 'application/json' ).
  lo_http_client->request->if_http_entity~set_header_field( name = 'Accept' value = 'application/json' ).
  lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
 
 
  lo_http_client->request->if_http_entity~set_header_field( name   = 'Authorization' value = re_login-access_token ).

token放在请求body中的处理方式如下:

简单一点可以理解为,双方约定用一个相同的accesskey访问密钥字符串(比如XXXX-2025),做MD5方式加密,对方JAVA端给这个值放入到请求头. sap端对这个请求获取JAVA传入的请求头属性,然后也给“XXXX-2025”这个字符串加密,看跟JAVA传入的请求头里面的数据是否一致,一致就通过,否则就报错

双方约定好一个accesskey访问密钥字符串,用MD5加密,再从对方传过来的请求BODY中获取token是否匹配一致,加密后的值比对,一致就返回,否则就报错。

*lv_token = '7815696ecbf1c96fuwuj2025'.
**加密
*    TRY.
*        lv_algo = 'MD5'.         " MD5, SHA1, SHA256, SHA384, SHA512
*        cl_abap_message_digest=>calculate_hash_for_char( EXPORTING if_algorithm = lv_algo
*                                                                   if_data      = lv_token
*                                                         IMPORTING
*                                                                   ef_hashstring = lv_md5 ).
*      CATCH cx_root INTO DATA(e_text).
*    ENDTRY.

*    "将Json转换成内表
*    TRY.
*
*        CALL METHOD /ui2/cl_json=>deserialize(
*          EXPORTING
*            json        = lv_body
*            pretty_name = /ui2/cl_json=>pretty_mode-camel_case
*          CHANGING
*            data        = ls_result ).
*
*        IF ls_result-data IS NOT INITIAL.
*          READ TABLE ls_result-data INTO DATA(ls_data) INDEX 1.
*          IF sy-subrc EQ 0.
*            IF ls_data-token NE lv_md5.
*              server->response->set_status( code = 400 reason = 'Token Authority Check failed' ).
*              server->response->set_cdata(
*                      /ui2/cl_json=>serialize( data        = ls_info
*                                               compress    = abap_true
*                                               pretty_name = /ui2/cl_json=>pretty_mode-camel_case ) ).
*              EXIT.
*            ENDIF.
*          ENDIF.
*        ENDIF.
*
*      CATCH cx_sy_move_cast_error.
*      CATCH cx_root.
*    ENDTRY..

另外,关于登录身份认证,JAVA等外围系统有白名单的概念,就是有一些外部接口是不需要做登录认证的,都是通过token的方式,比如签名方式。一些外部接口就不需要走登录认证。 比如有个接口要给非公司内部的系统调用,访问用户都没有内部员工账号,不能登录公司统一的IDM/authing用户单点登录统一身份认证平台。 

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

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

相关文章

在windows中安装或卸载nginx

首先在nginx的安装目录下cmd查看nginx的版本&#xff1a; 在看windows的服务中是否nginx注册为服务了 如果注册了服务就先将服务卸载了 在nginx的安装目录cmd执行命令 NginxService.exe uninstall “NginxService”是对应的注册的服务名称 关闭所有的相关nginx的服务这个也…

FaceFusion 技术深度剖析:核心算法与实现机制揭秘

在 AI 换脸技术蓬勃发展的浪潮中&#xff0c;FaceFusion 凭借其出色的换脸效果和便捷的操作&#xff0c;成为众多用户的首选工具。从短视频平台上的创意恶搞视频&#xff0c;到影视制作中的特效合成&#xff0c;FaceFusion 都展现出强大的实用性。而这一切的背后&#xff0c;是…

2. Web网络基础 - 协议端口

深入解析协议端口与netstat命令&#xff1a;网络工程师的实战指南 在网络通信中&#xff0c;协议端口是服务访问的门户。本文将全面解析端口概念&#xff0c;并通过netstat命令实战演示如何监控网络连接状态。 一、协议端口核心知识解析 1. 端口号的本质与分类 端口范围类型说…

嵌入式学习笔记 - freeRTOS vTaskPlaceOnEventList()函数解析

vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); 函数第一个参数为消息队列等待插入链表&#xff0c; void vTaskPlaceOnEventList( List_t * const pxEventList, const TickType_t xTicksToWait ) { configASSERT( pxEventList ); /…

Ubuntu 配置使用 zsh + 插件配置 + oh-my-zsh 美化过程

Ubuntu 配置使用 zsh 插件配置 oh-my-zsh 美化过程 引言zsh 安装及基础配置oh-my-zsh 安装及美化配置oh-my-zsh 安装主题美化配置主题自定义主题 插件安装及配置官方插件查看及启用插件安装 主题文件备份.zshrcre5et_self.zsh-theme 同步发布在个人笔记Ubuntu 配置使用 zsh …

Xilinx FPGA 重构Multiboot ICAPE2和ICAPE3使用

一、FPGA Multiboot 本文主要介绍基于IPROG命令的FPGA多版本重构&#xff0c;用ICAP原语实现在线多版本切换。需要了解MultiBoot Fallback点击链接。 如下图所示&#xff0c;ICAP原语可实现flash中n1各版本的动态切换&#xff0c;在工作过程中&#xff0c;可以通过IPROG命令切…

springMVC-11 中文乱码处理

前言 本文介绍了springMVC中文乱码的解决方案&#xff0c;同时也贴出了本人遇到过的其他乱码情况&#xff0c;可以根据自身情况选择合适的解决方案。 其他-jdbc、前端、后端、jsp乱码的解决 Tomcat导致的乱码解决 自定义中文乱码过滤器 老方法&#xff0c;通过javaW…

mysql-innoDB存储引擎事务的原理

InnoDB 存储引擎支持 ACID 事务&#xff0c;其事务机制是通过 Redo Log&#xff08;重做日志&#xff09;、Undo Log&#xff08;回滚日志&#xff09; 和 事务日志系统 来实现的。下面详细解析 InnoDB 事务的工作原理。 1.事务的基本特性&#xff08;ACID&#xff09; 特性描…

在GIS 工作流中实现数据处理

通过将 ArcPy 应用于实际的 GIS 工作流&#xff0c;我们可以高效地完成数据处理任务&#xff0c;节省大量时间和精力。接下来&#xff0c;本文将结合具体案例&#xff0c;详细介绍如何运用 ArcPy 实现 GIS 数据处理的全流程。 数据读取与合并 假设我们有多个 shapefile 文件&a…

第十四届蓝桥杯_省赛B组(C).冶炼金属

题目如下: 拿到题我们来看一下&#xff0c;题目的意思&#xff0c;就是求出N个记录中的最大最小值&#xff0c;言外之意就是&#xff0c;如果超过了这个最大值不行&#xff0c;如果小于这个最小值也不行&#xff0c;所以我们得出&#xff0c;这道题是一个二分答案的题目&#x…

​​Android 如何查看CPU架构?2025年主流架构有哪些?​

在开发安卓应用或选购手机时&#xff0c;了解设备的CPU架构至关重要。不同的架构影响性能、兼容性和能效比。那么&#xff0c;​​如何查看安卓设备的CPU架构&#xff1f;2025年主流架构有哪些&#xff1f;不同架构之间有什么区别&#xff1f;​​ 本文将为你详细解答。 ​​1.…

飞算 JavaAI 2.0.0:开启老项目迭代维护新时代

在软件开发领域&#xff0c;老项目的迭代与维护一直是开发团队面临的难题。代码逻辑混乱、技术栈陈旧、开发效率低下等问题&#xff0c;让老项目改造犹如一场 “噩梦”。而飞算 JavaAI 2.0.0 版本的正式上线&#xff0c;通过三大核心能力升级&#xff0c;为老项目开发带来了全新…

Linux初步介绍

Linux是一种开源的类Unix操作系统内核&#xff0c;广泛应用于服务器、桌面、嵌入式设备等各种计算平台。它由Linus Torvalds于1991年首次开发&#xff0c;因其稳定性、安全性和灵活性&#xff0c;被全球开发者和企业广泛采用。 特点&#xff1a; 开放性&#xff08;开源&#…

OneNet + openssl + MQTT

1.OneNet 使用的教程 1.在网络上搜索onenet&#xff0c;注册并且登录账号。 2.产品服务-----物联网服务平台立即体验 3.在底下找到立即体验进去 4.产品开发------创建产品 5.关键是选择MQTT&#xff0c;其他的内容自己填写 6.这里产品以及开发完成&#xff0c;接下来就是添加设…

行为设计模式之Memento(备忘录)

行为设计模式之Memento&#xff08;备忘录&#xff09; 前言&#xff1a; 备忘录设计模式&#xff0c;有点像vmware快照可以回滚&#xff0c;idea的提交记录同样可以混滚&#xff0c;流程引擎中流程可以撤销到或者回滚到某个指定的状态。 1&#xff09;意图 在不破坏封装性的…

动画直播如何颠覆传统?解析足球篮球赛事的数据可视化革命

在5G和AI技术快速发展的今天&#xff0c;体育赛事直播正在经历一场深刻的变革。传统视频直播虽然能提供真实的比赛画面&#xff0c;但在战术可视化、数据深度和交互体验方面存在明显短板。而基于实时数据驱动的动画直播技术&#xff0c;正通过创新的方式弥补这些不足&#xff0…

二刷苍穹外卖 day01

nginx nginx反向代理 将前端发送的请求由nginx转发到后端服务器 好处&#xff1a; 提速&#xff1a;nginx本身可缓存数据 负载均衡&#xff1a;配置多台服务器&#xff0c;大量请求来临可均衡分配 保证后端安全&#xff1a;不暴露后端服务真实地址 server{listen 80;server_…

5.2 HarmonyOS NEXT应用性能诊断与优化:工具链、启动速度与功耗管理实战

HarmonyOS NEXT应用性能诊断与优化&#xff1a;工具链、启动速度与功耗管理实战 在HarmonyOS NEXT的全场景生态中&#xff0c;应用性能直接影响用户体验。通过专业的性能分析工具链、针对性的启动速度优化&#xff0c;以及精细化的功耗管理&#xff0c;开发者能够构建"秒…

模型训练-关于token【低概率token, 高熵token】

Qwen团队新发现&#xff1a;大模型推理能力的提高仅由少数高熵 Token 贡献 不要让低概率token主导了LLM的强化学习过程 一 低概率词元问题 论文&#xff1a;Do Not Let Low-Probability Tokens Over-Dominate in RL for LLMs 在RL训练过程中&#xff0c;低概率词元&#xff08…

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag