SAP 接口方式之HTTP协议

很多跟JAVA直接交互接口方式采用HTTP协议,比如在SAP系统外挂SAP BW的报表链接等等

FUNCTION ZFI1107.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_REPORTNO)
*"     REFERENCE(IV_APPNAME) TYPE  WDY_APPLICATION_NAME
*"     REFERENCE(IV_BUKRS) TYPE  BUKRS OPTIONAL
*"     REFERENCE(IV_DATUM) TYPE  DATUM OPTIONAL
*"  EXPORTING
*"     REFERENCE(EV_URL) TYPE  STRING
*"     REFERENCE(EV_MSG)
*"  TABLES
*"      IR_POSID1 STRUCTURE  ZGR_POSID1 OPTIONAL
*"      IR_POSID2 STRUCTURE  ZGR_POSID2 OPTIONAL
*"----------------------------------------------------------------------
  DATA: BEGIN OF TY_LIST,
          REPORTURL  TYPE STRING,
          REPORTNO   TYPE STRING,
          REPORTNAME TYPE STRING,
        END OF TY_LIST.

  DATA: BEGIN OF TY_JSON,
          CODE      TYPE STRING,
          MESSAGE   TYPE STRING,
          TIMESTAMP TYPE TIMESTAMP,
          DATA      LIKE TABLE OF TY_LIST,
        END OF TY_JSON.

  TYPES: BEGIN OF TY_REPORT,
           REPORTURL  TYPE STRING,
           REPORTNO   TYPE STRING,
           REPORTNAME TYPE STRING,
         END OF TY_REPORT .

  DATA: LO_CLIENT       TYPE REF TO IF_HTTP_CLIENT,
        LV_URLX         TYPE XSTRING,
        LV_URL          TYPE STRING,
        LV_CONTENT_TYPE TYPE STRING VALUE 'application/x-www-form-urlencoded',
*        LV_CONTENT_TYPE TYPE STRING VALUE 'text/xml; charset=utf-8',
        LV_XSTRING      TYPE XSTRING,
        LV_STRING       TYPE STRING,
        LV_MSG          TYPE STRING,
        LV_STATUS       TYPE STRING,
        LV_JSON_MSG     TYPE STRING,
        LS_JSON         LIKE TY_JSON,
        LS_AB0032       TYPE ZTAB0032,
        LT_REPORT       TYPE TABLE OF TY_REPORT,
        LS_REPORT       TYPE TY_REPORT,
        LV_PARAM        TYPE STRING,
        LV_PARAM_X      TYPE XSTRING.

  LS_AB0032 = ZCL_AB_CONFIG=>GET_AB0032( IV_APPNAME ).

  "拼接参数
  PERFORM FRM_SPLICING_PARAMETERS USING LV_PARAM IV_BUKRS IR_POSID1[] IR_POSID2[] IV_DATUM.

  CALL FUNCTION 'ECATT_CONV_STRING_TO_XSTRING'
    EXPORTING
      IM_STRING   = LV_PARAM
      IM_ENCODING = '8400'
    IMPORTING
      EX_XSTRING  = LV_PARAM_X.

  LV_URL = 'http://172.31.2.128:8080/system/sso/getCommonUserUrl.json?param=' && LV_PARAM_X && '&username=' && SY-UNAME && '&reportRoleNo=' && LS_AB0032-IDP_ROLE."'IDP_R_CO_001'.

  TRY .

*--创建http对象
      CL_HTTP_CLIENT=>CREATE_BY_URL(
        EXPORTING
        URL                = LV_URL
        IMPORTING
        CLIENT             = LO_CLIENT
         EXCEPTIONS
         ARGUMENT_NOT_FOUND = 1
         PLUGIN_NOT_ACTIVE  = 2
         INTERNAL_ERROR     = 3
         OTHERS             = 4 ).

* set protocol version
      CALL METHOD LO_CLIENT->REQUEST->SET_HEADER_FIELD
        EXPORTING
          NAME  = '~server_protocol'
          VALUE = 'HTTP/1.1'.

* 提交方式
      CALL METHOD LO_CLIENT->REQUEST->SET_HEADER_FIELD
        EXPORTING
          NAME  = '~request_method'
          VALUE = 'GET'.
* 传参方式: application/json,application/x-www-form-urlencoded
      CALL METHOD LO_CLIENT->REQUEST->SET_HEADER_FIELD
        EXPORTING
          NAME  = 'Content-Type'
          VALUE = LV_CONTENT_TYPE.

* 发送
      CALL METHOD LO_CLIENT->SEND
        EXPORTING
          TIMEOUT                    = 200
        EXCEPTIONS
          HTTP_COMMUNICATION_FAILURE = 1
          HTTP_INVALID_STATE         = 2
          HTTP_PROCESSING_FAILED     = 3
          OTHERS                     = 4.

      IF SY-SUBRC NE 0.
        LO_CLIENT->GET_LAST_ERROR(
          IMPORTING
            MESSAGE = LV_MSG ).
        RETURN.
      ENDIF.

* 获取返回
      CALL METHOD LO_CLIENT->RECEIVE
        EXCEPTIONS
          HTTP_COMMUNICATION_FAILURE = 1
          HTTP_INVALID_STATE         = 2
          HTTP_PROCESSING_FAILED     = 3.
      IF SY-SUBRC NE 0.
        LO_CLIENT->GET_LAST_ERROR(
          IMPORTING
            MESSAGE = LV_MSG
        ).
        RETURN.
      ENDIF.
* 返回
      LV_XSTRING = LO_CLIENT->RESPONSE->GET_DATA( ).

* XSTRING to STRING
      CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
        EXPORTING
          IM_XSTRING  = LV_XSTRING
          IM_ENCODING = 'UTF-8'
        IMPORTING
          EX_STRING   = LV_STRING.

      /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_STRING  CHANGING  DATA = LS_JSON ).
      IF LS_JSON-MESSAGE IS NOT INITIAL.
        LV_MSG = LS_JSON-MESSAGE.
      ENDIF.

      LT_REPORT[] = LS_JSON-DATA[].

      READ TABLE LT_REPORT INTO LS_REPORT WITH KEY REPORTNO = IV_REPORTNO.
      IF SY-SUBRC = 0.
        EV_URL = LS_REPORT-REPORTURL.

        CHECK EV_URL IS NOT INITIAL.

        "打开URL
        CALL METHOD CL_GUI_FRONTEND_SERVICES=>EXECUTE
          EXPORTING
            DOCUMENT = EV_URL
          EXCEPTIONS
            OTHERS   = 1.

      ENDIF.
    CATCH CX_ROOT .
      LV_MSG = '异常'.
  ENDTRY.

  EV_MSG = LV_MSG.
ENDFUNCTION.


FORM FRM_SPLICING_PARAMETERS USING IV_PARAM IV_BUKRS IR_POSID1 IR_POSID2 IV_DATUM.
  DATA LT_PRPS1       TYPE TABLE OF PRPS.
  DATA LT_PRPS2       TYPE TABLE OF PRPS.
  DATA LS_PRPS        TYPE PRPS.
  DATA LR_POSID1      TYPE TABLE OF ZGR_POSID1 WITH HEADER LINE.
  DATA LR_POSID2      TYPE TABLE OF ZGR_POSID1 WITH HEADER LINE.
  DATA LV_NUPNM       TYPE ZTFI0005-NUPNM.

  LR_POSID1[]  = IR_POSID1.
  LR_POSID2[]  = IR_POSID2.

  "如果有参数,公司代码必输
  IF IV_BUKRS IS NOT INITIAL.
    SELECT SINGLE NUPNM FROM ZTFI0005 INTO LV_NUPNM WHERE HCODE = IV_BUKRS.
    IF SY-SUBRC = 0.
      IV_PARAM = IV_PARAM && '公司=' && LV_NUPNM && 'AND项目公司编码=' && IV_BUKRS.
    ELSE.
      MESSAGE TEXT-001 TYPE 'S' DISPLAY LIKE 'E'. REJECT.
    ENDIF.
  ENDIF.

  IF IV_DATUM IS NOT INITIAL.
    IV_PARAM = IV_PARAM && 'AND交房日期参数=' && IV_DATUM+0(4) && '-' && IV_DATUM+4(2) && '-' && IV_DATUM+6(2).
  ENDIF.

  IF IR_POSID1 IS NOT INITIAL.
    SELECT * FROM PRPS INTO TABLE LT_PRPS1 WHERE POSID IN LR_POSID1[] AND STUFE = 1.

    IV_PARAM = IV_PARAM && 'AND项目编码='.

    LOOP AT LT_PRPS1 INTO LS_PRPS.
      IF SY-TABIX = LINES( LT_PRPS1 ).
        IV_PARAM = IV_PARAM && LS_PRPS-POSID. EXIT.
      ENDIF..

      IV_PARAM = IV_PARAM && LS_PRPS-POSID &&  ','.
    ENDLOOP.
  ENDIF.

  IF IR_POSID2 IS NOT INITIAL.
    SELECT * FROM PRPS INTO TABLE LT_PRPS2 WHERE POSID IN LR_POSID2[] AND STUFE = 2.

    IV_PARAM = IV_PARAM && 'AND分期编码='.

    LOOP AT LT_PRPS2 INTO LS_PRPS.
      IF SY-TABIX = LINES( LT_PRPS2 ).
        IV_PARAM = IV_PARAM && LS_PRPS-POSID. EXIT.
      ENDIF.

      IV_PARAM = IV_PARAM && LS_PRPS-POSID  &&  ','.
    ENDLOOP.
  ENDIF.
ENDFORM.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值