SAP ABAP 主动调用外部系统的REST接口(x-www-form-urlencoded)

如何在SAP ECC中调用外部系统提供的REST接口地址?

Postman中使用Body中参数情况,使用链接的情况

x-www-form-urlencoded

POST成功调用样例如下:

SAP中实现如下:

  1. 事务码STRUST,导入对方系统证书
  1. 事务码SM59配置destination

外部系统提供的接口地址:

https://dev-api.jushuitan.com/open/jushuitan/otherinout/upload

测试连接

返回200表示成功

  1. 代码实现:

    &---------------------------------------------------------------------
    *& Report ZTEST_JST
    *&
    &---------------------------------------------------------------------
    *&
    *&
    &---------------------------------------------------------------------

    REPORT ztest_jst.

    "发送
    DATA: lo_http_client TYPE REF TO if_http_client.
    DATA: lv_respon TYPE string.
    DATA: lv_ssl_id TYPE ssfapplssl VALUE 'ANONYM'.
    DATA: lv_string TYPE string.
    DATA: lv_timestamp TYPE string.
    DATA: lv_sign TYPE string.
    DATA: lv_biz TYPE string.
    DATA: lv_jason TYPE string.
    DATA: lv_hashstring TYPE string.
    DATA: message TYPE string.
    DATA: msgtyp TYPE char1.

    "请求时间,时间戳格式(Unix 纪元到当前时间的秒数),API服务端允许客户端请求最大时间误差为10分钟。
    DATA: lv_sydatum TYPE sy-datum,
    lv_syuzeit TYPE sy-uzeit.

    "创建客户端请求
    CALL METHOD cl_http_client=>create_by_destination
    EXPORTING
    destination = 'JST'
    IMPORTING
    client = lo_http_client
    EXCEPTIONS
    argument_not_found = 1
    destination_not_found = 2
    destination_no_authority = 3
    plugin_not_active = 4
    internal_error = 5
    OTHERS = 6.
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH
    sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
    ENDIF.

    "设定传输请求内容格式以及编码格式
    lo_http_client->request->set_content_type( content_type = 'application/x-www-form-urlencoded;charset=UTF-8' ).

    "设定调用服务
    lo_http_client->request->set_method( if_http_request=>co_request_method_post ).

    lo_http_client->propertytype_accept_cookie = lo_http_client->co_enabled.

    lv_sydatum = sy-datum.
    lv_syuzeit = sy-uzeit.
    cl_pco_utility=>convert_abap_timestamp_to_java(
    EXPORTING
    iv_date = lv_sydatum "sy-datum
    iv_time = lv_syuzeit "sy-uzeit
    IMPORTING
    ev_timestamp = lv_timestamp ).

    lv_timestamp = lv_timestamp(10) - 8 * 60 * 60.
    CONDENSE lv_timestamp.

    lv_biz = '{"external_id": "2023111311287","type": "in","is_confirm": true,"items": [{"batch_id": "","qty": 120,"sku_id": "YC.01.0001","remark": "测试","expiration_date": "","sale_price": 0,"produced_date": ""}]}'.
    CONDENSE lv_biz.

    lv_string = '99c4cef262f34ca882975a7064de0b87' && 'access_token' && 'b7e3b1e24e174593af8ca5c397e53dad'
    && 'app_key' && 'b0b7d1db226d4216a3d58df9ffa2dde5' && 'biz' && lv_biz
    && 'charset' && 'utf-8' && 'timestamp' && lv_timestamp && 'version' && '2'.
    CONDENSE lv_string.

    CALL FUNCTION 'CALCULATE_HASH_FOR_CHAR'
    EXPORTING
    alg = 'MD5'
    data = lv_string
    IMPORTING
    hashstring = lv_hashstring
    EXCEPTIONS
    unknown_alg = 1
    param_error = 2
    internal_error = 3
    OTHERS = 4.
    lv_sign = lv_hashstring.
    TRANSLATE lv_sign TO LOWER CASE.

    lv_jason = 'app_key=' && 'b0b7d1db226d4216a3d58df9ffa2dde5' && '&access_token=' &&
    'b7e3b1e24e174593af8ca5c397e53dad' && '&timestamp=' && lv_timestamp
    && '&charset=' && 'utf-8' && '&version=' && '2' && '&sign=' && lv_sign
    && '&biz=' && lv_biz.

    *在POSTMAN中,调用时自动将参数进行urlencode转换,调用如果需要,可以如上使用方法转换
    *lv_time_64 = cl_http_utility=>escape_url( timestamp ). "escape_url

    "设置待传输内容
    lo_http_client->request->set_data( cl_abap_codepage=>convert_to( source = lv_jason ) ).

    "发送请求
    lo_http_client->send( EXCEPTIONS http_communication_failure = 1
    http_invalid_state = 2 ).

    IF sy-subrc <> 0.
    "操作失败,获取失败原因
    lo_http_client->get_last_error( IMPORTING message = message ).
    msgtyp = 'E'.
    ENDIF.

    "读取远程服务返回的处理过结果。
    lo_http_client->receive( EXCEPTIONS http_communication_failure = 1
    http_invalid_state = 2
    http_processing_failed = 3 ).
    IF sy-subrc <> 0 .
    "lv_subrc = sy-subrc.
    lo_http_client->get_last_error( IMPORTING message = message ).
    msgtyp = 'E'.
    ELSE.
    "读取返回返回内容
    CLEAR lv_respon.
    lv_respon = lo_http_client->response->get_cdata( ).

    • DATA: lv_xmldata TYPE xstring .

    • DATA: lt_result_xml TYPE STANDARD TABLE OF smum_xmltb,

    • 复制代码
         ls_result_xml TYPE smum_xmltb.
    • DATA: lt_return TYPE STANDARD TABLE OF bapiret2 .

    • CALL FUNCTION 'SCMS_STRING_TO_XSTRING'

    • EXPORTING

    • 复制代码
       text   = lv_respon
    • IMPORTING

    • 复制代码
       buffer = lv_xmldata.
    • CALL FUNCTION 'SMUM_XML_PARSE'

    • EXPORTING

    • 复制代码
       xml_input = lv_xmldata
    • TABLES

    • 复制代码
       xml_table = lt_result_xml
    • 复制代码
       return    = lt_return.

      "解析JSON串
      TYPES: BEGIN OF lty_recdata,
      msg TYPE string,
      code TYPE i,
      END OF lty_recdata.
      DATA: ls_recdata TYPE lty_recdata.

      CLEAR:ls_recdata.
      /ui2/cl_json=>deserialize( EXPORTING json = lv_respon
      pretty_name = 'X'
      CHANGING data = ls_recdata ).

    ENDIF.
    "关闭接口
    CALL METHOD lo_http_client->close.

相关推荐
爱喝水的鱼丶13 小时前
SAP-ABAP:变量、常量、结构与内表声明(10篇博客合集) 第六篇:ABAP 7.40+新特性:声明语法的简化写法与兼容注意事项
运维·服务器·开发语言·学习·算法·sap·abap
爱喝水的鱼丶18 小时前
SAP-ABAP:条件判断与循环控制语句(7篇) 第三篇:循环基础:for、while、do-while三种循环的差异与适用场景
运维·学习·性能优化·sap·abap·erp
SAP小崔说事儿1 天前
SAP B1 在Web Client里的AI数据分析(FP2608版本)
人工智能·ai·sap·sap b1·business one
爱喝水的鱼丶2 天前
SAP-ABAP:变量、常量、结构与内表声明(10篇博客合集) 第九篇:声明阶段的性能优化:如何从定义环节减少程序内存占用与运行耗时
开发语言·学习·算法·性能优化·sap·abap
修电脑的猫2 天前
SAP<->SQL server链接
sqlserver·sap·abap
爱喝水的鱼丶3 天前
SAP-ABAP:变量、常量、结构与内表声明(10篇博客合集) 第八篇:复杂业务场景下的声明组合:结构嵌套内表、内表包含结构的实现方法
运维·数据库·学习·算法·sap·abap
小羔羊的官方学习账号4 天前
树状展开BOM以及保存到本地
sap·abap·bom
Henry-SAP4 天前
BOM层级传递与MRP计划生成实战解析
人工智能·sap·erp
Henry-SAP5 天前
SAP MRP核心概念与学习路线解析
人工智能·sap
ERP面壁者7 天前
WTEW的操作记录
sap