SAP HTTP調用其他系統接口


1業務說明

ABAP系統通過HTTP方式調用其他系統發布的接口

2代碼實現

2.1認證接口

根據訪問的URL創建HTTP客戶端

設置訪問方式,並調用SEND和接收函數

有時需要專門驗證用戶名密碼

獲取返回的HTTP訪問狀態和狀態描述,並關閉接口

其中定義的接收內表需要按照JSON結構來定義

2.2具體接口

當獲取TOKEN成功之后,就可以繼續執行后續的某個業務功能接口了

仍然根據訪問的接口URL創建HTTP客戶端

設置傳輸格式,校驗權限,訪問方式

根據傳入JSON,定義內表,並轉換為JSON格式

同理,調用發送和接收函數,之后用相同方式獲取返回的JSON數據,並將其轉換為內表,做后續操作,方法和認證接口處理一致,不再贅述。

2.3源代碼

"TOKEN的結構
TYPES: BEGIN 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.

"編輯發送數據
DATA: BEGIN OF TY_SENDDATA,
        PAYLOAD LIKE TY_DATILDATA,
      END OF TY_SENDDATA.

"編輯接收數據
DATA: BEGIN 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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM