1业务说明

ABAP系统通过HTTP方式调用其他系统发布的接口

2代码实现

2.1认证接口

根据访问的URL创建HTTP客户端

设置访问方式,并调用SEND和接收函数

有时需要专门验证用户名密码

获取返回的HTTP访问状态和状态描述,并关闭接口

其中定义的接收内表需要按照JSON结构来定义

2.2具体接口

当获取TOKEN成功之后,就可以继续执行后续的某个业务功能接口了

仍然根据访问的接口URL创建HTTP客户端

设置传输格式,校验权限,访问方式

根据传入JSON,定义内表,并转换为JSON格式

同理,调用发送和接收函数,之后用相同方式获取返回的JSON数据,并将其转换为内表,做后续操作,方法和认证接口处理一致,不再赘述。

2.3源代码

"TOKEN的结构
TYPESBEGIN OF TY_TOKEN,
         ACCESS_TOKEN  TYPE STRING,
         TOKEN_TYPE    TYPE STRING,
         REFRESH_TOKEN TYPE STRING,
         EXPIRES_IN    TYPE STRING,
         SCOPE         TYPE STRING,
       END OF TY_TOKEN.

"发送数据时的结构
DATA:BEGIN OF TY_DATILDATA OCCURS 0,
       DATEFROM TYPE STRING,
       DATETO   TYPE STRING,
       PAGE     TYPE STRING,
       SIZE     TYPE STRING,
     END OF TY_DATILDATA.

"编辑发送数据
DATABEGIN OF TY_SENDDATA,
        PAYLOAD LIKE TY_DATILDATA,
      END OF TY_SENDDATA.

"编辑接收数据
DATABEGIN OF TY_RECEIVEDATA,
        PAYLOAD LIKE TY_DATILDATA,
        DATA    LIKE TABLE OF TY_DATILDATA,
      END OF TY_RECEIVEDATA.

DATA:LS_TOKEN    TYPE TY_TOKEN,
     LS_SENDDATA LIKE TY_SENDDATA,
     LS_RECDATA  LIKE TY_RECEIVEDATA.

DATA: LV_LEN           TYPE I"发送报文长度
      LV_URL           TYPE STRING, "接口地址
      LO_HTTP_CLIENT   TYPE REF TO IF_HTTP_CLIENT, "http客户端
      LV_SEND_JSON     TYPE STRING, "发送的JSON
      LV_REC_JSON      TYPE STRING, "接收的JSON
      LV_AUTHORIZATION TYPE STRING,
      LV_CODE          TYPE I"HTTP 返回状态
      LV_REASON        TYPE  STRING. " HTTP 状态描述

START-OF-SELECTION.

CLEAR:LV_URL.
  LV_URL = 'https://hostname/oauth/oauth/token'.

"创建http客户端
  CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
    EXPORTING
      URL                = LV_URL
    IMPORTING
      CLIENT             = LO_HTTP_CLIENT
    EXCEPTIONS
      ARGUMENT_NOT_FOUND = 1
      PLUGIN_NOT_ACTIVE  = 2
      INTERNAL_ERROR     = 3
      OTHERS             = 4.

"不显示登录界面
  LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED.

"可以使用AUTHENTICATE方法专门验证用户名和密码,但本程序不适用
*  DATA LV_USERNAME TYPE STRING.
*  DATA LV_PASSWORD TYPE STRING.
*  Lv_USERNAME = '1234567'.
*  Lv_PASSWORD = '1234567'.
*  CALL METHOD LO_HTTP_CLIENT->AUTHENTICATE
*    EXPORTING
*      USERNAME = Lv_USERNAME
*      PASSWORD = Lv_PASSWORD.

"设置http method 为POST
  LO_HTTP_CLIENT->REQUEST->SET_METHOD(
    IF_HTTP_REQUEST=>CO_REQUEST_METHOD_POST
  ).
  "IF_HTTP_ENTITY~CO_REQUEST_METHOD_GET

"发送
  CALL METHOD LO_HTTP_CLIENT->SEND
    EXCEPTIONS
      HTTP_COMMUNICATION_FAILURE = 1
      HTTP_INVALID_STATE         = 2
      HTTP_PROCESSING_FAILED     = 3
      HTTP_INVALID_TIMEOUT       = 4
      OTHERS                     = 5.

"接收
  CALL METHOD LO_HTTP_CLIENT->RECEIVE
    EXCEPTIONS
      HTTP_COMMUNICATION_FAILURE = 1
      HTTP_INVALID_STATE         = 2
      HTTP_PROCESSING_FAILED     = 3.

"提取返回字符串
  CLEAR:LV_CODE,LV_REASON.
  CALL METHOD LO_HTTP_CLIENT->RESPONSE->GET_STATUS
    IMPORTING
      CODE   = LV_CODE
      REASON = LV_REASON.

"获取返回的JSON
  CLEAR:LV_REC_JSON,LS_TOKEN.
  LV_REC_JSON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
  /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_REC_JSON
                              CHANGING  DATA = LS_TOKEN ).

"关闭接口
  CALL METHOD LO_HTTP_CLIENT->CLOSE.

"获取Token
  CLEAR:LV_AUTHORIZATION.
  LV_AUTHORIZATION = LS_TOKEN-ACCESS_TOKEN.

"如果有值,证明返回了正确的TOKEN,就可以继续
  IF LS_TOKEN IS NOT INITIAL AND LV_CODE = '200'.
    CLEAR:LV_URL.
    LV_URL = 'https:// hostname/ssrc/v1/448/rgwd/price-library/list'.
    "创建http客户端
    CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL
      EXPORTING
        URL                = LV_URL
      IMPORTING
        CLIENT             = LO_HTTP_CLIENT
      EXCEPTIONS
        ARGUMENT_NOT_FOUND = 1
        PLUGIN_NOT_ACTIVE  = 2
        INTERNAL_ERROR     = 3
        OTHERS             = 4.

LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED.

"设定传输请求内容格式以及编码格式
    LO_HTTP_CLIENT->REQUEST->SET_CONTENT_TYPE(
      CONTENT_TYPE = 'application/json; charset=utf-8'
    ).

CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD

      EXPORTING
        NAME  = 'Authorization'
        VALUE = LV_AUTHORIZATION.

"设置http method 为POST
    LO_HTTP_CLIENT->REQUEST->SET_METHOD(
      IF_HTTP_REQUEST=>CO_REQUEST_METHOD_POST

    ).
    "IF_HTTP_ENTITY~CO_REQUEST_METHOD_GET
    CLEAR:LS_SENDDATA.
    LS_SENDDATA-PAYLOAD-DATEFROM = '20191231 00:00:00'.
    LS_SENDDATA-PAYLOAD-DATETO = '20191231 00:00:00'.
    LS_SENDDATA-PAYLOAD-PAGE = 0.
    LS_SENDDATA-PAYLOAD-SIZE = 50.
    "SAP不区分大小写,JAVA/C会区分,
    "一定让对方修改代码,不然只能SBB的拼接
    CLEAR:LV_SEND_JSON.
    LV_SEND_JSON = /UI2/CL_JSON=>SERIALIZE( LS_SENDDATA ).
    "设置待传输内容长度
    CLEAR:LV_LEN.
    LV_LEN = STRLEN( LV_SEND_JSON ).

CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA

      EXPORTING
        DATA   = LV_SEND_JSON

        OFFSET = 0
        LENGTH = LV_LEN.

"发送
    CALL METHOD LO_HTTP_CLIENT->SEND

      EXCEPTIONS
        HTTP_COMMUNICATION_FAILURE = 1
        HTTP_INVALID_STATE         = 2
        HTTP_PROCESSING_FAILED     = 3
        HTTP_INVALID_TIMEOUT       = 4
        OTHERS                     = 5.

"接收
    CALL METHOD LO_HTTP_CLIENT->RECEIVE
      EXCEPTIONS
        HTTP_COMMUNICATION_FAILURE = 1
        HTTP_INVALID_STATE         = 2
        HTTP_PROCESSING_FAILED     = 3.

CLEAR:LV_REC_JSON.",LS_JSON.
    LV_REC_JSON = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
    "解析JSON串
    CLEAR:LS_RECDATA.
    /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_REC_JSON

          PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE

                               CHANGING DATA = LS_RECDATA ).

"关闭接口
    CALL METHOD LO_HTTP_CLIENT->CLOSE.
    IF LS_RECDATA IS NOT INITIAL.
      "将获取到的数据做其他的操作
    ELSE.
      "报错
    ENDIF.

ELSEIF LV_CODE <> '200'.
    WRITE:LV_CODE.
    WRITE:/ LV_REASON.
  ENDIF.

SAP HTTP调用其他系统接口的更多相关文章

  1. Java 后台请求第三方系统接口详解

    //调用第三方系统接口 PrintWriter out = null; BufferedReader in = null; JSONObject jsonObject = null; Closeabl ...

  2. SAP系统接口方式:

    SAP系统接口方式: 1.PI - 信使中间件 (大公司多选择) 数据: SAP- PI- U8 U8- PI- SAPPI 底层用的还是webservice 技术优点:实时性高: 可处理大数据(在调 ...

  3. 【EWM系列】SAP EWM WCU和Non-SAP系统接口

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP EWM WCU和Non-SA ...

  4. Python OS模块标准库的系统接口及操作方法

    Python OS模块标准库的系统接口及操作方法 os.name 返回当前操作系统名,定义了'posix','nt','mac','os2','ce','java'(我使用win7/python3.1 ...

  5. js调用百度地图接口

    原文:js调用百度地图接口 这是前几天公司做的新项目,上面需要用到地图的数据.第一次做这类型的东西没啥思路,咱们经理说,这东西简单,截个图存文件夹里调整好尺寸,数据库里存上图片的地址动态调用就行了.心 ...

  6. UNIX系统接口

    UNIX系统接口 8.1 文件描述符 UNIX操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件.系统通过文件描述符来标识文件:标准输入为0,标准输出为1,标准错误为2. 当程序 ...

  7. 调用支付宝第三方接口(沙箱环境) SpringMVC+Maven

    一.蚂蚁金服开放平台的操作 网址:https://open.alipay.com/platform/home.htm 支付宝扫码登陆

  8. CAS 单点登录4.24版本 登录调用其它系统并且返回客户端用其它的用户信息改造

    1.登录调用其它系统.修改deployerConfigContext.xml <?xml version="1.0" encoding="UTF-8"?& ...

  9. 调用微信JS-SDK接口上传图片

    最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口,实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存, ...

随机推荐

  1. Python基础:按位异或 ^ ,按位或 | ,按位与 &

    前言文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http: ...

  2. 告诉你那里最受欢迎,python爬取全国13个城市旅游数据

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

  3. sprint3总结 && sprint4计划

    sprint3总结 在一周时间里,逻辑部分顺利的将数据库,查词,UI部分连接到一起.并且各部分也针对新的要求做出了一些修改,目前数据库和查词alpha版已经完成,UI部分还需要一些美化,逻辑部分也还需 ...

  4. W - Palindrome HDU - 1513

    题目大意: 插入最少的字符,使原字符串成为回文串. 题解: LCS问题,将字符串反转,然后求这俩字符串的LCS,总长度减去LCS即可(多组输入). N最大是5E3,直接用二维数组会超内存.所以要用到滚 ...

  5. sqli-labs通关教程----31~40关

    第三十一关 这关一样,闭合变成(",简单测试,#号不能用 ?id=1") and ("1")=("1")--+ 第三十二关 这关会把我们的输 ...

  6. 再接再厉,JSONViewer现已支持Firefox、Microsoft Edge、360浏览器,可能是最好用的JSON格式化工具

    之前写的JSONViewer,截至目前在谷歌商店里已经有1000+的自然下载量了 为什么开发JSONViewer? 日常开发中,拿到接口输出的JSON一般会去在线的JSON格式化网站查看,但是在线格式 ...

  7. vue2.x学习笔记(二十二)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12633051.html. 自定义指令 简介 除了核心功能默认内置的指令([v-mode]和[v-show]等),v ...

  8. Java 理解类加载过程 -- 自定义加载器

    类加载器可以看下我的收藏: https://www.cnblogs.com/dongguacai/p/5879931.html 现在准备一个字节码文件: 自定义加载器: package com.xzl ...

  9. Python操作三大主流数据库

    Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口. Python 数据库接口支持非常多的数据库,你可以选择适合你项目的数据库:  ...

  10. 前端js传值JSON.stringify(obj)

    用bootstrap-talbe前端传值 首先直接传肯定是不行的; 其次做一个全局变量也不行,因为这里的问题的是用bootstrap-table进行生成的操作HTML,从这里datass = row ...