SAP调用外部JOSN例子

I_URL_ID TYPE STRING                       http 服务接口地址id

I_BODYDATA TYPE STRING                       传入参数

I_HTTP_METHOD TYPE STRING 'POST' http方式:POST ,GET

image.png

E_MSG TYPE STRING 返回消息

E_CODE TYPE CHAR1 连接标志:S成功,E错误,W警告,A拒绝

E_DATA TYPE STRING 返回结果

E_HTTP_STATUS_CODE TYPE I HTTP状态码

E_BIZ_CODE TYPE CHAR1 业务标志:S成功,E错误

image.png

URL_NOT_FOUND 未配置URL信息

image.png


MANDT MANDT CLNT 3 0 集团

ZURLID ZURLID CHAR 30 0 接口地址ID

ZCLIENT ZCLIENT CHAR 3 0 系统客户端 

ZURL ZURL CHAR 100 0 接口的URL地址或SAP函数名称

ZTYPE ZCKSBUSTYPE CHAR 1 0 接口类型

ZREMARKS CHAR30 CHAR 30 0 30 个字符 

image.png

image.png

FUNCTION ZFM_RESTFUL_CKS.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_URL_ID) TYPE  STRING
*"     VALUE(I_BODYDATA) TYPE  STRING OPTIONAL
*"     VALUE(I_HTTP_METHOD) TYPE  STRING DEFAULT 'POST'
*"  EXPORTING
*"     VALUE(E_MSG) TYPE  STRING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_DATA) TYPE  STRING
*"     VALUE(E_HTTP_STATUS_CODE) TYPE  I
*"     VALUE(E_BIZ_CODE) TYPE  CHAR1
*"  EXCEPTIONS
*"      URL_NOT_FOUND
*"----------------------------------------------------------------------



  DATA OREF TYPE REF TO CX_ROOT.
  TRY .

      DATA LV_URL TYPE STRING .
      "根据配置信息,获取URL接口地址
      SELECT SINGLE  ZURL INTO LV_URL
        FROM ZCKSDATABUS
        WHERE ZURLID  = I_URL_ID
          AND ZCLIENT = SY-MANDT.
      IF SY-SUBRC NE 0.
        RAISE URL_NOT_FOUND.
      ENDIF.

      TRANSLATE LV_URL TO LOWER CASE.

      DATA: LO_HTTP_CLIENT  TYPE REF TO IF_HTTP_CLIENT.
      "实例化1个 IF_HTTP_CLIENT 的对象得到HTTP_CLIENT
      CL_HTTP_CLIENT=>CREATE_BY_URL(
                 EXPORTING URL    = LV_URL                "输入参数
                 IMPORTING CLIENT = LO_HTTP_CLIENT
                   ).


      LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED.
      CALL METHOD LO_HTTP_CLIENT->AUTHENTICATE(
        EXPORTING
*         client   = ''
*         proxy_authentication = 'X'
          USERNAME = ''
          PASSWORD = ''
*         LANGUAGE = 'E'
      ).


      "设置某个特定的header field的值
      LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
              EXPORTING
                   NAME  = '~SERVER_PROTOCOL'
                   VALUE = 'HTTP/1.1'
            ).

      "设置某个特定的header field的值
      CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
        EXPORTING
          NAME  = 'CONTENT-TYPE'
          VALUE = 'APPLICATION/JSON'.

      "设置某个特定的header field的值
      LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
            EXPORTING
                 NAME  = 'ACCEPT'
                 VALUE = '*/*' ).
      "设置http请求的方法GET 或者 POST,默认使用POST
      IF I_HTTP_METHOD IS NOT INITIAL.
        CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_METHOD( I_HTTP_METHOD ).
      ELSE.
        CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ).
      ENDIF.
      "设置http body
      CALL METHOD LO_HTTP_CLIENT->REQUEST->SET_CDATA
        EXPORTING
          DATA = I_BODYDATA.                             "输入参数
      "dispatch of data
      CALL METHOD LO_HTTP_CLIENT->SEND
        EXCEPTIONS
          HTTP_COMMUNICATION_FAILURE = 1
          HTTP_INVALID_STATE         = 2.

      "receipt of http response
      CALL METHOD LO_HTTP_CLIENT->RECEIVE
        EXCEPTIONS
          HTTP_COMMUNICATION_FAILURE = 1
          HTTP_INVALID_STATE         = 2
          HTTP_PROCESSING_FAILED     = 3.

      "返回状态校验
      LO_HTTP_CLIENT->RESPONSE->GET_STATUS( IMPORTING  CODE = E_HTTP_STATUS_CODE ).
      CASE E_HTTP_STATUS_CODE.
        WHEN 200.
          E_CODE = 'S'.
          E_MSG = '系统连接成功!请查看执行结果消息。'.
          "返回数据,"获取response中的http的body内容
          E_DATA = LO_HTTP_CLIENT->RESPONSE->GET_CDATA( ).
        WHEN OTHERS.
          E_CODE = 'E'.
          E_MSG =  '失败,返回码:' &&  E_HTTP_STATUS_CODE .
      ENDCASE.


      "关闭http链接
      CALL METHOD LO_HTTP_CLIENT->CLOSE.


    CATCH  CX_ROOT INTO  OREF.
      E_CODE = 'E'.
      E_MSG = OREF->IF_MESSAGE~GET_TEXT( ).
      "关闭http链接
      IF LO_HTTP_CLIENT IS NOT INITIAL.
        CALL METHOD LO_HTTP_CLIENT->CLOSE.
      ENDIF.
  ENDTRY.

*----------begin of  by  Luolin 02.03.2020 10:26:55----------
*业务状态识别
  IF E_CODE = 'S'.
*JSON数据转为内表数据
    TYPES : BEGIN OF LTY_ZITMSG,
              CODE(2)  TYPE C,
              ERRORMSG TYPE STRING,
              DATA     TYPE STRING,
            END OF LTY_ZITMSG.
    DATA :LS_MSG TYPE LTY_ZITMSG,
          LT_MSG TYPE STANDARD TABLE OF LTY_ZITMSG.

    CALL METHOD /UI2/CL_JSON=>DESERIALIZE
      EXPORTING
        JSON = E_DATA
*       PRETTY_NAME = ABAP_FALSE
      CHANGING
        DATA = LS_MSG.
    IF LS_MSG-CODE = '0'.
      E_BIZ_CODE = 'S'.
    ELSE.
      E_BIZ_CODE = 'E'.
      E_MSG = E_MSG && LS_MSG-ERRORMSG.
    ENDIF.
  ENDIF.
*  ----------end of  by Luolin 02.03.2020 10:26:55----------


ENDFUNCTION.


关键词: ABAP

网友评论

发表评论