第三方调用SAP的接口通常使用PI来实现,也可以直接让第三方调用SAP的RFC,或者是SAP生成WEBSERVICE给第三方调用,有的项目上没有PI,而使用RFC感觉不那么通用,第三没做过还不好实现,WEBSERVICE方式,SAP实现起来感觉又太麻烦,使用下来还是直接RESTful方式更方便些,并且可以传JSON,也可实现HTTP的POST ,GET 等方法,总来来说还是RESTful更方便些,
以下是现实项目中实现的框架,包含了保存日志,及不同接口自动配置调用,对开发新接口时,接口功能不用再修改,只需要增加配置,并按规范增加处理函数就行。
1.创建接口
使用事务码SICF创建一个服务ZREST_INTERFACE,服务名可以自己取,如图创建后那么接口地址就是:http://ip:80000/rf_rest/zrest_interface?sap-client=310

其中在服务ZREST_INTERFACE中在“登陆数据”中设置连接到的CLIETN及用户名密码,此用户密码就是提供接口使用的用户密码,并有“处理器清单”中增加一个自定义类名,比如ZREST_INTERFACE,后面一步创建这个类,
2.接口类实现
SE24创建一个类ZREST_INTERFACE,用来处理接口数据,其中类的接口中增加IF_HTTP_EXTENSION,此时就可以修改方法IF_HTTP_EXTENSION~HANDLE_REQUEST,来实再接口调用方法了,类激活后,如要IF_HTTP_EXTENSION~HANDLE_REQUEST方法中打断点,你会发现,当POST ,GET 调用地址http://ip:80000/rf_rest/zrest_interface?sap-client=310,断点就会来到这个方法中了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
METHOD IF_HTTP_EXTENSION~HANDLE_REQUEST. DATA: LV_JSON_STRING TYPE STRING. "传入和传出JSON格式数据所用到的变量 DATA: LV_JSON_REPONSE TYPE STRING. "传入和传出JSON格式数据所用到的变量 DATA LV_METHOD TYPE STRING. "获取GET/POST方式 DATA: DY_TABLE TYPE REF TO DATA, DY_LINE TYPE REF TO DATA, DATA_EXPORT TYPE REF TO DATA. DATA:GT_DYN_TABLE TYPE REF TO CL_ABAP_STRUCTDESCR. DATA :LV_TABNAME TYPE CHAR15. FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE, <DYN_WA> TYPE ANY. DATA: BEGIN OF LW_REQUEST, ZC_ID TYPE STRING, ZC_UUID TYPE STRING, END OF LW_REQUEST. DATA:BEGIN OF LS_RETURN, CODE TYPE ZREST_LOG-ZC_CODE, MSG TYPE ZREST_LOG-ZC_MSG, END OF LS_RETURN. DATA: PTAB TYPE ABAP_FUNC_PARMBIND_TAB, PTAB_LINE TYPE ABAP_FUNC_PARMBIND, ETAB TYPE ABAP_FUNC_EXCPBIND_TAB, ETAB_LINE TYPE ABAP_FUNC_EXCPBIND. DATA:LS_ZREST_LOG TYPE ZREST_LOG. DATA:LV_DATE TYPE ZREST_LOG-ZC_DATE. DATA:LV_TIME TYPE ZREST_LOG-ZC_TIME. DATA:LW_ZREST_CONFIG TYPE ZREST_CONFIG. DATA: LR_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT . DATA: LV_URL TYPE STRING, LV_RESULT TYPE STRING, LV_POST_STRING TYPE STRING, LV_LEN TYPE I. LV_METHOD = SERVER->REQUEST->GET_METHOD( ). "获取方式 CASE LV_METHOD. WHEN 'POST'. LS_ZREST_LOG-ZC_DIRECTION = '入站'. LV_DATE = SY-DATUM. LV_TIME = SY-UZEIT. LV_JSON_STRING = SERVER->REQUEST->GET_CDATA( ). "获取传入的JSON格式数据 /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON_STRING CHANGING DATA = LW_REQUEST ). IF LW_REQUEST-ZC_ID IS INITIAL OR LW_REQUEST-ZC_UUID IS INITIAL. LS_RETURN-CODE = 'E'. LS_RETURN-MSG = '请求参数不存在ZC_ID或者ZC_UUID!'. ELSE. SELECT COUNT(*) INTO @DATA(LV_COUNT) FROM ZREST_LOG WHERE ZC_UUID = @LW_REQUEST-ZC_UUID. IF LV_COUNT > 0. LS_RETURN-CODE = 'E'. LS_RETURN-MSG = 'ZC_UUID已存在,请以新的ZC_UUID重新请求'. ELSE. SELECT * INTO TABLE @DATA(LT_ZREST_CONFIG) FROM ZREST_CONFIG WHERE ZC_ID = @LW_REQUEST-ZC_ID. IF LT_ZREST_CONFIG IS INITIAL. LS_RETURN-CODE = 'E'. LS_RETURN-MSG = '接口在SAP未配置!'. ELSE. LOOP AT LT_ZREST_CONFIG INTO DATA(LS_ZREST_CONFIG). IF LS_ZREST_CONFIG-ZC_REF_FUNCTION IS INITIAL. LS_RETURN-CODE = 'E'. LS_RETURN-MSG = '接口实现SAP未配置!'. ELSE. SELECT * INTO TABLE @DATA(LT_ZREST_F_CONFIG) FROM ZREST_F_CONFIG WHERE ZC_REF_FUNCTION = @LS_ZREST_CONFIG-ZC_REF_FUNCTION. IF LT_ZREST_F_CONFIG IS INITIAL. LS_RETURN-CODE = 'E'. LS_RETURN-MSG = '接口处理函数SAP未配置!'. ELSE. LOOP AT LT_ZREST_F_CONFIG INTO DATA(LS_ZREST_F_CONFIG). CASE LS_ZREST_F_CONFIG-ZC_STYLLE. WHEN 'I'. CREATE DATA DY_TABLE TYPE TABLE OF (LS_ZREST_CONFIG-ZC_REF_DATA). ASSIGN DY_TABLE->* TO <DYN_TABLE>. CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE>. ASSIGN DY_LINE->* TO <DYN_WA>. /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON_STRING CHANGING DATA = <DYN_WA> ). PTAB_LINE-NAME = LS_ZREST_F_CONFIG-ZC_PARAM. PTAB_LINE-KIND = ABAP_FUNC_EXPORTING. GET REFERENCE OF <DYN_WA> INTO PTAB_LINE-VALUE. * APPEND PTAB_LINE TO PTAB. INSERT PTAB_LINE INTO TABLE PTAB. "PTAB参考是排序表 故用于insert WHEN 'E'. CREATE DATA DATA_EXPORT TYPE (LS_ZREST_F_CONFIG-ZC_REF_DATA). ASSIGN DATA_EXPORT TO FIELD-SYMBOL(<DATA_EXPORT>). PTAB_LINE-VALUE = <DATA_EXPORT>. PTAB_LINE-NAME = LS_ZREST_F_CONFIG-ZC_PARAM. PTAB_LINE-KIND = ABAP_FUNC_IMPORTING. * APPEND PTAB_LINE TO PTAB. INSERT PTAB_LINE INTO TABLE PTAB. WHEN OTHERS. ENDCASE. ENDLOOP. CALL FUNCTION LS_ZREST_CONFIG-ZC_REF_FUNCTION PARAMETER-TABLE PTAB. ENDIF. LOOP AT PTAB INTO PTAB_LINE WHERE KIND <> ABAP_FUNC_EXPORTING. IF PTAB_LINE-VALUE IS INITIAL. LS_RETURN-CODE = 'E'. LS_RETURN-MSG = '接口函数SAP返回参数为空!'. ELSE. CALL METHOD SERVER->RESPONSE->IF_HTTP_ENTITY~SET_CONTENT_TYPE EXPORTING CONTENT_TYPE = 'application/json'. LV_JSON_REPONSE = /UI2/CL_JSON=>SERIALIZE( DATA = PTAB_LINE-VALUE COMPRESS = ABAP_TRUE ). SERVER->RESPONSE->SET_CDATA( EXPORTING DATA = LV_JSON_REPONSE " ). /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON_REPONSE CHANGING DATA = LS_RETURN ). LS_ZREST_LOG-ZC_UUID = LW_REQUEST-ZC_UUID. LS_ZREST_LOG-ZC_ID = LW_REQUEST-ZC_ID. LS_ZREST_LOG-ZC_REQUEST_INFO = LV_JSON_STRING. LS_ZREST_LOG-ZC_RESPONSE_INFO = LV_JSON_REPONSE. LS_ZREST_LOG-ZC_CODE = LS_RETURN-CODE. LS_ZREST_LOG-ZC_MSG = LS_RETURN-MSG. LS_ZREST_LOG-ZC_DATE = LV_DATE. LS_ZREST_LOG-ZC_TIME = LV_TIME. GET TIME. LS_ZREST_LOG-ZC_END_TIME = SY-UZEIT. INSERT INTO ZREST_LOG VALUES LS_ZREST_LOG. COMMIT WORK. CLEAR LS_RETURN. ENDIF. ENDLOOP. ENDIF. ENDLOOP. ENDIF. ENDIF. ENDIF. IF LS_RETURN IS NOT INITIAL. CALL METHOD SERVER->RESPONSE->IF_HTTP_ENTITY~SET_CONTENT_TYPE EXPORTING CONTENT_TYPE = 'application/json'. LV_JSON_REPONSE = /UI2/CL_JSON=>SERIALIZE( DATA = LS_RETURN COMPRESS = ABAP_TRUE ). SERVER->RESPONSE->SET_CDATA( EXPORTING DATA = LV_JSON_REPONSE " Character data ). LS_ZREST_LOG-ZC_UUID = LW_REQUEST-ZC_UUID. LS_ZREST_LOG-ZC_ID = LW_REQUEST-ZC_ID. LS_ZREST_LOG-ZC_REQUEST_INFO = LV_JSON_STRING. LS_ZREST_LOG-ZC_RESPONSE_INFO = LV_JSON_REPONSE. LS_ZREST_LOG-ZC_CODE = LS_RETURN-CODE. LS_ZREST_LOG-ZC_MSG = LS_RETURN-MSG. LS_ZREST_LOG-ZC_DATE = LV_DATE. LS_ZREST_LOG-ZC_TIME = LV_TIME. GET TIME. LS_ZREST_LOG-ZC_END_TIME = SY-UZEIT. INSERT INTO ZREST_LOG VALUES LS_ZREST_LOG. COMMIT WORK. ENDIF. IF LS_ZREST_LOG-ZC_CODE NE 'S'. IF LS_ZREST_LOG-ZC_ID IS INITIAL. SELECT SINGLE * INTO LW_ZREST_CONFIG FROM ZREST_CONFIG. ELSE. SELECT SINGLE * INTO LW_ZREST_CONFIG FROM ZREST_CONFIG WHERE ZC_ID = LS_ZREST_LOG-ZC_ID. ENDIF. IF LW_ZREST_CONFIG-ZC_YW_USERID IS NOT INITIAL. LV_URL = 'http://10.2.0.67:40001/interFace'. LV_POST_STRING = '{"interfaceName":"ywSend","requestData":"{\"userId\":\"' && LW_ZREST_CONFIG-ZC_YW_USERID && '\",\"first\":\"尊敬的用户\",\"keyword1\":\"' && LW_ZREST_CONFIG-ZC_ID && '\",\"keyword2\":\"' && LS_ZREST_LOG-ZC_MSG && '\",\"keyword3\":\"' && LS_ZREST_LOG-ZC_DATE && LS_ZREST_LOG-ZC_TIME && '\"}"}'. LV_LEN = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( LV_POST_STRING ). CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_URL EXPORTING URL = LV_URL IMPORTING CLIENT = LR_HTTP_CLIENT EXCEPTIONS ARGUMENT_NOT_FOUND = 1 PLUGIN_NOT_ACTIVE = 2 INTERNAL_ERROR = 3 OTHERS = 4. CALL METHOD LR_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD EXPORTING NAME = '~request_method' VALUE = 'POST'. CALL METHOD LR_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD EXPORTING NAME = '~server_protocol' VALUE = 'HTTP/1.1'. CALL METHOD LR_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD EXPORTING NAME = 'Content-Type' VALUE = 'application/json; charset=utf-8'. CALL METHOD LR_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD EXPORTING NAME = 'Accept' VALUE = 'application/json'. CALL METHOD LR_HTTP_CLIENT->REQUEST->SET_CDATA EXPORTING DATA = LV_POST_STRING OFFSET = 0 LENGTH = LV_LEN. CALL METHOD LR_HTTP_CLIENT->SEND EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2. CALL METHOD LR_HTTP_CLIENT->RECEIVE EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2 HTTP_PROCESSING_FAILED = 3. LV_RESULT = LR_HTTP_CLIENT->RESPONSE->GET_CDATA( ). ENDIF. ENDIF. WHEN OTHERS. SERVER->RESPONSE->SET_STATUS( CODE = 405 REASON = '不支持的方法'). SERVER->RESPONSE->SET_CONTENT_TYPE( 'APPLICATION/JSON' ). SERVER->RESPONSE->SET_CDATA( DATA = /UI2/CL_JSON=>SERIALIZE( DATA = '不支持的方法' COMPRESS = ABAP_TRUE PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ). ENDCASE. ENDMETHOD. |
程序中用到三个表,ZREST_LOG(接口日志表),ZREST_CONFIG(SCIF接口配置表),ZREST_F_CONFIG(接口函数配置表) CALL FUNCTION LS_ZREST_CONFIG-ZC_REF_FUNCTION就是调用配置的接口函数 功能,
- ZREST_LOG-接口日志表
- ZC_UUID ZC_UUID CHAR 32 0 接口请求唯一ID
- ZC_DATE ZC_DATE DATS 8 0 接口日期
- ZC_TIME ZC_TIME TIMS 6 0 接口时间
- ZC_END_TIME ZC_END_TIME TIMS 6 0 接口执行结束时间
- ZC_ID ZC_ID CHAR 20 0 接口ID
- ZC_DIRECTION ZC_DIRECTION CHAR 10 0 接口方向
- ZC_REQUEST_INFO ZC_REQUEST_INFO STRING 0 0 请求报文
- ZC_RESPONSE_INFO ZC_RESPONSE_INFO STRING 0 0 返回报文
- ZC_CODE ZC_CODE CHAR 10 0 错误返回码
- ZC_MSG ZC_MSG STRING 0 0 错误返回信息
- ZREST_CONFIG-SCIF接口配置表
- ZC_ID ZC_ID CHAR 20 0 接口ID
- ZCNAME ZCNAME CHAR 100 0 接口名称
- ZC_REF_DATA ZC_REF_DATA CHAR 30 0 接口参考结构
- ZC_REF_FUNCTION ZC_REF_FUNCTION CHAR 50 0 接口业务实现
- ZC_URL ZC_URL STRING 0 0 接口地址url
- ZC_URL1 ZC_URL STRING 0 0 接口地址url
- ZC_YW_USERID ZC_YW_USERID CHAR 20 0 运维人员工号
- ZREST_F_CONFIG-接口函数配置表
- ZC_REF_FUNCTION ZC_REF_FUNCTION CHAR 50 0 接口业务实现
- ZC_STYLLE ZC_STYLLE CHAR 10 0 接口函数类型
- ZC_PARAM ZC_PARAM CHAR 20 0 接口函数参数名称
- ZC_REF_DATA ZC_REF_DATA CHAR 30 0 接口参考结构
- __________________ __________________ _ ___________________________________________________
3.增加一个新接口函数配置
增加一个接口配置,SCM030,同时创建结构ZCC_SCM030,配置接口调用函数ZC_F_SCM030

其中结构 为函数 的传入参数结构 ,此结构 对应接口POST传入参数的JSON结构 ,此结构中必须包含ZC_ID,用于指定接口编号 ,对于此接口此值 传为“SCM030”,
ZC_UUID,用于标记每次接口调用数据的主键值 ,用于标记接口调用的唯一性,如不考虑接口数据唯一性时,此值为随机字符串就行,如要防止业务数据重复传输,可以业务主键放到此字段中,比如采购订单只能收货一次时,可把采购订单放到此字段中。
后面的内容就是接口真实的数据内容了,

在表ZREST_F_CONFIG中指定函数 的传入,传出参数名入定义的类型


4.增加一个接口函数功能代码
在函数 ZC_F_SCM030,传入结构用ZCC_SCM030,
此函数 只要与接收到结构 化数据的数据处理逻辑就行,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
FUNCTION zc_f_scm030. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(IT_DATA) TYPE ZCC_SCM030 *" EXPORTING *" REFERENCE(IT_RETURN) TYPE ZREST_RESPONSE_MBEW *"---------------------------------------------------------------------- DATA:lt_zmbew_result TYPE TABLE OF zmbew_01 WITH HEADER LINE. DATA:z_netpr TYPE zafo_item-netpr. DATA z_price_long TYPE zafo_item-price_long. LOOP AT it_data-zcc_zmbew INTO DATA(ls_zmbew). CLEAR:z_netpr,z_price_long. IF ls_zmbew-matnr EQ '' OR ls_zmbew-matnr EQ 'NULL' OR ls_zmbew-matnr EQ 'null'. it_return-code = 'E'. it_return-msg = '物料码不能为空!'. RETURN. ENDIF. IF ls_zmbew-werks EQ '' OR ls_zmbew-werks EQ 'NULL' OR ls_zmbew-werks EQ 'null'. it_return-code = 'E'. it_return-msg = '估价范围(工厂)不能为空!'. RETURN. ENDIF. SELECT SINGLE * INTO @DATA(ls_mbew) FROM mbew WHERE matnr = @ls_zmbew-matnr AND bwkey = @ls_zmbew-werks. IF sy-subrc EQ 0. IF ls_mbew-vprsv = 'S'. z_netpr = ls_mbew-stprs. z_price_long = z_netpr * 113 / 100. ELSEIF ls_mbew-vprsv = 'V'. IF ls_mbew-lbkum <> 0. z_netpr = ls_mbew-salk3 / ls_mbew-lbkum. z_price_long = ls_mbew-salk3 / ls_mbew-lbkum * 113 / 100. ELSE. z_netpr = ls_mbew-verpr. z_price_long = z_netpr * 113 / 100. ENDIF. ENDIF. CALL FUNCTION 'ZAFO_CONVERT_PRICE' EXPORTING price_long = z_price_long IMPORTING price = lt_zmbew_result-price peinh = lt_zmbew_result-peinh. lt_zmbew_result-matnr = ls_zmbew-matnr. APPEND lt_zmbew_result. ENDIF. ENDLOOP. IF lt_zmbew_result[] IS NOT INITIAL. it_return-code = 'S'. it_return-msg = 'SUCCESS'. it_return-zcc_zmbew = lt_zmbew_result[]. ELSE. it_return-code = 'E'. it_return-msg = '暂无成本价,请联系管理员!'. ENDIF. ENDFUNCTION. |
5.日志查询程序
在上面接口中会自动把接口的传入,传出数据保存到日志表中,所以创建 一个程序来做日志查询处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 |
*&---------------------------------------------------------------------* *& Report ZREST_QUERY *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT ZREST_QUERY. DATA: GV_REPID TYPE SY-REPID, GS_LAYOUT TYPE LVC_S_LAYO, GS_REPID TYPE SY-REPID, GT_ALV_FILEDCAT TYPE LVC_T_FCAT, GS_ALV_FILED LIKE LVC_S_FCAT. DATA: ZC_ID TYPE ZREST_LOG-ZC_ID. DATA: ZC_UUID TYPE ZREST_LOG-ZC_UUID. DATA: ZC_DATE TYPE ZREST_LOG-ZC_DATE. DATA: ZC_CODE TYPE ZREST_LOG-ZC_CODE. DATA: ZC_KEYWORD TYPE ZREST_LOG-ZC_REQUEST_INFO. DATA: ZREST_RETURN TYPE ZREST_RETURN. DATA LS_ZREST_LOG TYPE ZREST_LOG.. DATA:LR_GRID TYPE REF TO CL_GUI_ALV_GRID. DATA:GT_MSG TYPE TABLE OF ZCCT_MSG_DIS WITH HEADER LINE. DATA GT_MESSAGE TYPE TABLE OF ESP1_MESSAGE_WA_TYPE WITH HEADER LINE. DATA: BEGIN OF LT_ZREST_LOG OCCURS 0, ICON TYPE ICON_D. INCLUDE TYPE ZREST_LOG. DATA: END OF LT_ZREST_LOG. DATA: DY_TABLE TYPE REF TO DATA, DY_LINE TYPE REF TO DATA, DATA_EXPORT TYPE REF TO DATA. DATA: PTAB TYPE ABAP_FUNC_PARMBIND_TAB, PTAB_LINE TYPE ABAP_FUNC_PARMBIND, ETAB TYPE ABAP_FUNC_EXCPBIND_TAB, ETAB_LINE TYPE ABAP_FUNC_EXCPBIND. FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE, <DYN_WA> TYPE ANY. DATA:GT_DYN_TABLE TYPE REF TO CL_ABAP_STRUCTDESCR. DATA:BEGIN OF LS_RETURN, CODE TYPE ZREST_LOG-ZC_CODE, MSG TYPE ZREST_LOG-ZC_MSG, END OF LS_RETURN. SELECT-OPTIONS:S_ID FOR ZC_ID. SELECT-OPTIONS:S_UUID FOR ZC_UUID. SELECT-OPTIONS:S_DATE FOR ZC_DATE. SELECT-OPTIONS:S_CODE FOR ZC_CODE. PARAMETERS:KEYWORD LIKE ZC_KEYWORD. " @DATA(LT_ZREST_LOG) START-OF-SELECTION. PERFORM GET_DATA. PERFORM FRM_SHOW. FORM FRM_SHOW . PERFORM FRM_SET_FIELDCAT. PERFORM FRM_SET_LAYOUT. PERFORM FRM_SHOW_ALV. ENDFORM. FORM GET_DATA . SELECT * INTO TABLE @DATA(LT_ZREST_LOG_1) FROM ZREST_LOG WHERE ZC_ID IN @S_ID AND ZC_UUID IN @S_UUID AND ZC_DATE IN @S_DATE AND ZC_CODE IN @S_CODE. SORT LT_ZREST_LOG_1 DESCENDING BY ZC_DATE ZC_TIME. LOOP AT LT_ZREST_LOG_1 INTO LS_ZREST_LOG. MOVE-CORRESPONDING LS_ZREST_LOG TO LT_ZREST_LOG. CASE LS_ZREST_LOG-ZC_CODE. WHEN 'E'. LT_ZREST_LOG-ICON = ICON_RED_LIGHT. WHEN 'S'. LT_ZREST_LOG-ICON = ICON_GREEN_LIGHT. WHEN OTHERS. LT_ZREST_LOG-ICON = ICON_YELLOW_LIGHT. ENDCASE. IF KEYWORD IS INITIAL. APPEND LT_ZREST_LOG. ELSE. IF LS_ZREST_LOG-ZC_REQUEST_INFO CS KEYWORD. APPEND LT_ZREST_LOG. ELSE. IF LS_ZREST_LOG-ZC_RESPONSE_INFO CS KEYWORD. APPEND LT_ZREST_LOG. ENDIF. ENDIF. ENDIF. ENDLOOP. ENDFORM. FORM PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB. SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB. ENDFORM. FORM USER_COMMAND USING R_UCOMM TYPE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD. DATA :LV_JSON TYPE STRING, LV_CONVERT TYPE STRING, LO_JSON_SER TYPE REF TO CL_TREX_JSON_SERIALIZER, LV_ERR_TEXT TYPE STRING, LS_MSG TYPE LVC_S_MSG1, LS_LMESS TYPE LMESS, LT_MESS TYPE STANDARD TABLE OF LMESS. CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' IMPORTING E_GRID = LR_GRID. CALL METHOD LR_GRID->CHECK_CHANGED_DATA. CASE R_UCOMM. WHEN '&IC1'. READ TABLE LT_ZREST_LOG ASSIGNING FIELD-SYMBOL(<FS_DATA>) INDEX RS_SELFIELD-TABINDEX. IF SY-SUBRC EQ 0. CASE RS_SELFIELD-FIELDNAME. WHEN 'ZC_REQUEST_INFO'. LV_JSON = <FS_DATA>-ZC_REQUEST_INFO. WHEN 'ZC_RESPONSE_INFO'. LV_JSON = <FS_DATA>-ZC_RESPONSE_INFO. ENDCASE. ENDIF. WHEN '&GO'. PERFORM GO_DEAL. WHEN 'REFRESH'. PERFORM GET_DATA. CALL METHOD LR_GRID->REFRESH_TABLE_DISPLAY. WHEN OTHERS. ENDCASE. RS_SELFIELD-REFRESH = 'X'. TRY. CALL TRANSFORMATION SJSON2HTML SOURCE XML LV_JSON RESULT XML DATA(LV_HTML). CATCH CX_XSLT_RUNTIME_ERROR INTO DATA(LO_ERR). LV_ERR_TEXT = LO_ERR->GET_TEXT( ). WRITE: LV_ERR_TEXT. RETURN. ENDTRY. LV_CONVERT = CL_ABAP_CODEPAGE=>CONVERT_FROM( LV_HTML ). CL_ABAP_BROWSER=>SHOW_HTML( HTML_STRING = LV_CONVERT ). ENDFORM. FORM GO_DEAL. DATA:LT_INDEX_ROWS TYPE LVC_T_ROW, LS_INDEX_ROWS TYPE LVC_S_ROW, LT_ROW_NO TYPE LVC_T_ROID. CALL METHOD LR_GRID->GET_SELECTED_ROWS IMPORTING ET_INDEX_ROWS = LT_INDEX_ROWS ET_ROW_NO = LT_ROW_NO. IF LT_INDEX_ROWS[] IS INITIAL. MESSAGE '请选择抬头行' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. LOOP AT LT_INDEX_ROWS INTO LS_INDEX_ROWS. READ TABLE LT_ZREST_LOG INTO DATA(LW_ZREST_LOG) INDEX LS_INDEX_ROWS-INDEX. IF SY-SUBRC EQ 0. IF LW_ZREST_LOG-ZC_CODE EQ 'S'. PERFORM FRM_ADD_MSG USING 'ZREST' 'W' '000' '接口ID' LW_ZREST_LOG-ZC_UUID '' '成功状态不允许执行!'. CONTINUE. ENDIF. IF LW_ZREST_LOG-ZC_DIRECTION = '入站'. SELECT * INTO TABLE @DATA(LT_ZREST_CONFIG) FROM ZREST_CONFIG WHERE ZC_ID = @LW_ZREST_LOG-ZC_ID. LOOP AT LT_ZREST_CONFIG INTO DATA(LS_ZREST_CONFIG). SELECT * INTO TABLE @DATA(LT_ZREST_F_CONFIG) FROM ZREST_F_CONFIG WHERE ZC_REF_FUNCTION = @LS_ZREST_CONFIG-ZC_REF_FUNCTION. LOOP AT LT_ZREST_F_CONFIG INTO DATA(LS_ZREST_F_CONFIG). CASE LS_ZREST_F_CONFIG-ZC_STYLLE. WHEN 'I'. CREATE DATA DY_TABLE TYPE TABLE OF (LS_ZREST_CONFIG-ZC_REF_DATA). ASSIGN DY_TABLE->* TO <DYN_TABLE>. CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE>. ASSIGN DY_LINE->* TO <DYN_WA>. /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LW_ZREST_LOG-ZC_REQUEST_INFO CHANGING DATA = <DYN_WA> ). PTAB_LINE-NAME = LS_ZREST_F_CONFIG-ZC_PARAM. PTAB_LINE-KIND = ABAP_FUNC_EXPORTING. GET REFERENCE OF <DYN_WA> INTO PTAB_LINE-VALUE. APPEND PTAB_LINE TO PTAB. WHEN 'E'. CREATE DATA DATA_EXPORT TYPE (LS_ZREST_F_CONFIG-ZC_REF_DATA). ASSIGN DATA_EXPORT TO FIELD-SYMBOL(<DATA_EXPORT>). PTAB_LINE-VALUE = <DATA_EXPORT>. PTAB_LINE-NAME = LS_ZREST_F_CONFIG-ZC_PARAM. PTAB_LINE-KIND = ABAP_FUNC_IMPORTING. APPEND PTAB_LINE TO PTAB. WHEN OTHERS. ENDCASE. ENDLOOP. ENDLOOP. CALL FUNCTION LS_ZREST_CONFIG-ZC_REF_FUNCTION PARAMETER-TABLE PTAB. LOOP AT PTAB INTO PTAB_LINE WHERE KIND <> ABAP_FUNC_EXPORTING. IF PTAB_LINE-VALUE IS INITIAL. PERFORM FRM_ADD_MSG USING 'ZREST' 'E' '000' '接口ID' LW_ZREST_LOG-ZC_UUID '' '接口函数SAP返回参数为空!'. CONTINUE. ELSE. DATA(LV_JSON_REPONSE) = /UI2/CL_JSON=>SERIALIZE( DATA = PTAB_LINE-VALUE COMPRESS = ABAP_TRUE ). /UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON_REPONSE CHANGING DATA = LS_RETURN ). CASE LW_ZREST_LOG-ZC_CODE. WHEN 'E'. LW_ZREST_LOG-ICON = ICON_RED_LIGHT. WHEN 'S'. LW_ZREST_LOG-ICON = ICON_GREEN_LIGHT. WHEN OTHERS. LW_ZREST_LOG-ICON = ICON_YELLOW_LIGHT. ENDCASE. LW_ZREST_LOG-ZC_CODE = LS_RETURN-CODE. LW_ZREST_LOG-ZC_MSG = LS_RETURN-MSG. MOVE-CORRESPONDING LW_ZREST_LOG TO LS_ZREST_LOG. UPDATE ZREST_LOG FROM LS_ZREST_LOG. IF SY-SUBRC EQ 0. COMMIT WORK. IF LS_RETURN-CODE EQ 'S'. PERFORM FRM_ADD_MSG USING 'ZREST' 'S' '000' '接口ID' LW_ZREST_LOG-ZC_UUID '' '处理成功'. ELSE. PERFORM FRM_ADD_MSG USING 'ZREST' 'S' '000' '接口ID' LW_ZREST_LOG-ZC_UUID '' '处理失败'. ENDIF. ELSE. ROLLBACK WORK. ENDIF. CLEAR LS_RETURN. ENDIF. ENDLOOP. ELSE. CALL FUNCTION 'ZREST_JSON_CLIENT' EXPORTING ZC_ID = LW_ZREST_LOG-ZC_ID ZC_JSON_PARAM = LW_ZREST_LOG-ZC_REQUEST_INFO IMPORTING ZREST_RETURN = ZREST_RETURN. IF ZREST_RETURN-CODE = 'S'. LW_ZREST_LOG-ICON = ICON_GREEN_LIGHT. ELSE. LW_ZREST_LOG-ICON = ICON_RED_LIGHT. ENDIF. LW_ZREST_LOG-ZC_CODE = LS_RETURN-CODE. LW_ZREST_LOG-ZC_MSG = LS_RETURN-MSG. MOVE-CORRESPONDING LW_ZREST_LOG TO LS_ZREST_LOG. UPDATE ZREST_LOG FROM LS_ZREST_LOG. IF SY-SUBRC EQ 0. COMMIT WORK. IF LS_RETURN-CODE EQ 'S'. PERFORM FRM_ADD_MSG USING 'ZREST' 'S' '000' '接口ID' LW_ZREST_LOG-ZC_UUID '' '处理成功'. ELSE. PERFORM FRM_ADD_MSG USING 'ZREST' 'S' '000' '接口ID' LW_ZREST_LOG-ZC_UUID '' '处理失败'. ENDIF. ELSE. ROLLBACK WORK. ENDIF. ENDIF. ENDIF. ENDLOOP. IF GT_MESSAGE[] IS NOT INITIAL. CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP' TABLES I_MESSAGE_TAB = GT_MESSAGE[]. CLEAR GT_MESSAGE[]. ENDIF. ENDFORM. FORM FRM_ADD_MSG USING MSGID MSGTY MSGNO MSGV1 MSGV2 MSGV3 MSGV4. CLEAR GT_MSG. GT_MESSAGE-MSGID = MSGID . GT_MESSAGE-MSGTY = MSGTY . GT_MESSAGE-MSGNO = MSGNO . GT_MESSAGE-MSGV1 = MSGV1 . GT_MESSAGE-MSGV2 = MSGV2 . GT_MESSAGE-MSGV3 = MSGV3 . GT_MESSAGE-MSGV4 = MSGV4 . APPEND GT_MESSAGE. ENDFORM. FORM FRM_SHOW_ALV . CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING I_CALLBACK_PROGRAM = GS_REPID I_SAVE = 'A' IT_FIELDCAT_LVC = GT_ALV_FILEDCAT[] IS_LAYOUT_LVC = GS_LAYOUT I_CALLBACK_PF_STATUS_SET = 'PF_STATUS' I_CALLBACK_USER_COMMAND = 'USER_COMMAND' TABLES T_OUTTAB = LT_ZREST_LOG[] EXCEPTIONS PROGRAM_ERROR = 1 OTHERS = 2. IF SY-SUBRC <> 0. MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. ENDFORM. FORM FRM_SET_LAYOUT . GS_LAYOUT-SEL_MODE = 'A'. GS_REPID = SY-REPID. GS_LAYOUT-ZEBRA = 'X'. GS_LAYOUT-CWIDTH_OPT = 'X'. "最优宽 * gs_layout-cwidth_opt = 'X'. * GS_LAYOUT-BOX_FNAME = 'SLBOX'. ENDFORM. FORM FRM_SET_FIELDCAT . CLEAR:GT_ALV_FILEDCAT. PERFORM FRM_FILL_FIELDCAT USING 'ICON' 'ID' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_UUID' '接口唯一ID' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_ID' '接口ID' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_DIRECTION' '接口方向' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_CODE' '接口返回码' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_MSG' '接口返回信息' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_DATE' '接口请求日期' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_TIME' '接口请求时间' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_END_TIME' '接口返回时间' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_REQUEST_INFO' '接口请求报文' '' '' '' '' ''. PERFORM FRM_FILL_FIELDCAT USING 'ZC_RESPONSE_INFO' '接口返回报文' '' '' '' '' ''. ENDFORM. FORM FRM_FILL_FIELDCAT USING P_FIELDNAME P_COLTEXT P_KEY P_REF_TABLE P_REF_FIELD P_OUTPUTLEN P_NO_ZERO. DATA:LS_ALV_FILED LIKE GS_ALV_FILED. LS_ALV_FILED-FIELDNAME = P_FIELDNAME. LS_ALV_FILED-COLTEXT = P_COLTEXT. LS_ALV_FILED-OUTPUTLEN = P_OUTPUTLEN. LS_ALV_FILED-NO_ZERO = P_NO_ZERO. LS_ALV_FILED-KEY = P_KEY. LS_ALV_FILED-REF_TABLE = P_REF_TABLE. LS_ALV_FILED-REF_FIELD = P_REF_FIELD. APPEND LS_ALV_FILED TO GT_ALV_FILEDCAT. ENDFORM. |
6.其它
前面的程序还用到一个JSON结构 化数据的函数 ,其中ZC_ID CHAR20,ZC_JSON_PARAM为STRING类型

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
FUNCTION ZREST_JSON_CLIENT. *"---------------------------------------------------------------------- *"*"本地接口: *" IMPORTING *" REFERENCE(ZC_ID) TYPE ZC_ID *" REFERENCE(ZC_JSON_PARAM) TYPE ZC_JSON_PARAM *" EXPORTING *" REFERENCE(ZREST_RETURN) TYPE ZREST_RETURN *"---------------------------------------------------------------------- DATA: LR_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT . DATA: E_SUBRC TYPE SY-SUBRC, E_MSG_TEXT TYPE STRING. DATA LO_UUID TYPE REF TO IF_SYSTEM_UUID. DATA LV_UUID_X16 TYPE SYSUUID_X16. " raw(16) -> data element GUID DATA:LT_ZREST_LOG TYPE TABLE OF ZREST_LOG WITH HEADER LINE. DATA:LV_DATE TYPE ZREST_LOG-ZC_DATE. DATA:LV_TIME TYPE ZREST_LOG-ZC_TIME. DATA: LV_URL TYPE STRING, LV_RESULT TYPE STRING, LV_POST_STRING TYPE STRING, LV_RT_CODE TYPE I, LV_LEN TYPE I. LV_DATE = SY-DATUM. LV_TIME = SY-UZEIT. TRY. LO_UUID = CL_UUID_FACTORY=>CREATE_SYSTEM_UUID( ). LV_UUID_X16 = LO_UUID->CREATE_UUID_X16( ). CATCH CX_UUID_ERROR. ENDTRY. IF ZC_ID IS INITIAL. ZREST_RETURN-CODE = 'E'. ZREST_RETURN-MSG = '请求参数ZC_ID为不能为空'. ELSE. IF ZC_JSON_PARAM IS INITIAL. ZREST_RETURN-CODE = 'E'. ZREST_RETURN-MSG = '请求参数ZC_JSON_PARAM为不能为空'. ELSE. SELECT SINGLE * INTO @DATA(LW_ZREST_CONFIG) FROM ZREST_CONFIG WHERE ZC_ID = @ZC_ID. IF LW_ZREST_CONFIG IS INITIAL. ZREST_RETURN-CODE = 'E'. ZREST_RETURN-MSG = '接口' && ZC_ID && '未在ZREST_CONFIG配置'. ELSE. IF LW_ZREST_CONFIG-ZC_URL IS INITIAL. ZREST_RETURN-CODE = 'E'. ZREST_RETURN-MSG = '接口' && ZC_ID && '未在ZREST_CONFIG配置URL'. ELSE. LV_URL = LW_ZREST_CONFIG-ZC_URL && LW_ZREST_CONFIG-ZC_URL1. LV_POST_STRING = ZC_JSON_PARAM. * LV_LEN = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( LV_POST_STRING ). CL_HTTP_CLIENT=>CREATE_BY_URL( EXPORTING URL = LV_URL IMPORTING CLIENT = LR_HTTP_CLIENT ). LR_HTTP_CLIENT->REQUEST->SET_METHOD( 'POST' ). LR_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( EXPORTING NAME = '~server_protocol' VALUE = 'HTTP/1.1' ). LR_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( EXPORTING NAME = 'Content-Type' VALUE = 'application/json;charset=utf-8' ). LR_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( EXPORTING NAME = 'Accept' VALUE = '*/*' ). LR_HTTP_CLIENT->REQUEST->SET_CDATA( EXPORTING DATA = LV_POST_STRING ). LR_HTTP_CLIENT->SEND( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2 ). IF SY-SUBRC <> 0. LR_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING CODE = E_SUBRC MESSAGE = ZREST_RETURN-MSG ). ZREST_RETURN-CODE = 'E'. ELSE. LR_HTTP_CLIENT->RECEIVE( EXCEPTIONS HTTP_COMMUNICATION_FAILURE = 1 HTTP_INVALID_STATE = 2 HTTP_PROCESSING_FAILED = 3 ). IF SY-SUBRC <> 0. LR_HTTP_CLIENT->GET_LAST_ERROR( IMPORTING CODE = E_SUBRC MESSAGE = ZREST_RETURN-MSG ). ZREST_RETURN-CODE = 'E'. ELSE. LR_HTTP_CLIENT->RESPONSE->GET_STATUS( IMPORTING CODE = LV_RT_CODE ). IF LV_RT_CODE = 200. LV_RESULT = LR_HTTP_CLIENT->RESPONSE->GET_CDATA( ). ZREST_RETURN-RESPONSE_PARAM = LV_RESULT. ZREST_RETURN-CODE = 'S'. ZREST_RETURN-MSG = 'SUCCESS'. ELSE. ZREST_RETURN-CODE = 'E'. ZREST_RETURN-MSG = LV_RT_CODE. ENDIF. LR_HTTP_CLIENT->CLOSE( ). ENDIF. ENDIF. ENDIF. ENDIF. ENDIF. ENDIF. LT_ZREST_LOG-ZC_UUID = LV_UUID_X16. LT_ZREST_LOG-ZC_DIRECTION = '出站'. LT_ZREST_LOG-ZC_DATE = LV_DATE. LT_ZREST_LOG-ZC_TIME = LV_TIME. GET TIME. LT_ZREST_LOG-ZC_END_TIME = SY-UZEIT. LT_ZREST_LOG-ZC_ID = ZC_ID. LT_ZREST_LOG-ZC_REQUEST_INFO = ZC_JSON_PARAM. LT_ZREST_LOG-ZC_RESPONSE_INFO = LV_RESULT. LT_ZREST_LOG-ZC_CODE = ZREST_RETURN-CODE. LT_ZREST_LOG-ZC_MSG = ZREST_RETURN-MSG. INSERT INTO ZREST_LOG VALUES LT_ZREST_LOG. ENDFUNCTION. |