很多跟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.