SAP 通过RESTful实现Http接口
一.GUI端代码
1.SE24定义类 ZCL_DD_EBELNTOSAP
在类->接口里添加 IF_HTTP_EXTENSION,如下图
然后在【方法】里,就会出来 IF_HTTP_EXTENSION~HANDLE_REQUEST,如下图
如果没有GET和POST,需要手动添加一下。
继续在IF_HTTP_EXTENSION~HANDLE_REQUEST的参数里,添加server
我们需要通过传入的Server,双击进入IF_HTTP_EXTENSION~HANDLE_REQUEST调用类 IF_HTTP_REQUEST 和 IF_HTTP_RESPONSE,对参数进行处理并传出处理消息
代码如图:
2.Get事件
由于是第三方系统调用SAP发布的接口,主要用的是Post请求,所以这个Get里面就没细写,如有需要,把传入的值处理一下,写一个SQL或者调一个FM,最后通过SET_CDATA传出
代码如图:
METHOD GET.
DATA: LT_FIELDS TYPE TIHTTPNVP,
S_CARRID TYPE RSELOPTION,
S_CONNID TYPE RSELOPTION,
LV_CONTENT_TYPE TYPE STRING.
**A 请求参数——查找HTTP头数据,全量读取,适合读取文件
* DATA(LV_QUERY) = SERVER->REQUEST->GET_HEADER_FIELD( '~QUERY_STRING' ).
* IF LV_QUERY IS INITIAL.
* " SETS CURRENT HTTP STATUS CODE
* SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未查询到传入参数,请检查' ).
* RETURN.
* ENDIF.
* TRANSLATE LV_QUERY TO UPPER CASE.
*B 请求参数——查找HTTP头数据,生成内表,适合传值
SERVER->REQUEST->GET_FORM_FIELDS( CHANGING FIELDS = LT_FIELDS ).
IF LT_FIELDS IS INITIAL.
" SETS CURRENT HTTP STATUS CODE
SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未查询到传入参数,请检查' ).
RETURN.
ENDIF.
LOOP AT LT_FIELDS ASSIGNING FIELD-SYMBOL(<FS>).
TRANSLATE <FS>-NAME TO UPPER CASE.
CASE <FS>-NAME.
WHEN 'CARRID'.
APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = <FS>-VALUE ) TO S_CARRID.
WHEN 'CONNID'.
APPEND VALUE #( SIGN = 'I' OPTION = 'EQ' LOW = <FS>-VALUE ) TO S_CONNID.
ENDCASE.
ENDLOOP.
SELECT *
FROM SFLIGHT
INTO TABLE @DATA(LT_SFLIGHT)
WHERE CARRID IN @S_CARRID
AND CONNID IN @S_CONNID.
" SETS THE HTTP BODY OF THIS ENTITY TO THE GIVEN CHAR. DATA
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = LT_SFLIGHT"将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
" SETS CURRENT HTTP STATUS CODE
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
" SET THE BODY TYPE (TEXT/HTML, FOR EXAMPLE)
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
ENDMETHOD.
3.Post事件
我在每个处理逻辑块后面都加了异常返回,第三方调用的时候可以更清晰的看到异常原因,编写完成之后激活类即可
METHOD POST.
DATA:
BEGIN OF LS_REQUEST,
ACTION TYPE STRING, " 可以用来区分具体对应的处理类
DATA TYPE TABLE OF ZMMT003, " 表结构
END OF LS_REQUEST,
LV_JSON TYPE STRING,
LT_ZMMT003 TYPE TABLE OF ZMMT003,
LS_ZMMT003 TYPE ZMMT003,
LV_CONTENT_TYPE TYPE STRING,
LT_RETURN TYPE STANDARD TABLE OF BAPIRETURN,
LS_RETURN TYPE BAPIRETURN.
" DELIVERS THE HTTP BODY OF THIS ENTITY AS CHARACTER DATA
LV_JSON = SERVER->REQUEST->GET_CDATA( ).
IF LV_JSON IS INITIAL.
SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未解析到BODY参数,请检查' ).
RETURN.
ENDIF.
" 将JSON转换成内表
/UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON CHANGING DATA = LS_REQUEST ).
CASE LS_REQUEST-ACTION.
WHEN 'ZMMT003'.
WHEN OTHERS.
SERVER->RESPONSE->SET_STATUS( CODE = 404 REASON = '未解析到对应ACTION,请检查' ).
RETURN.
ENDCASE.
IF LS_REQUEST-DATA IS NOT INITIAL.
LT_ZMMT003 = LS_REQUEST-DATA.
ENDIF.
MODIFY ZMMT003 FROM TABLE LT_ZMMT003.
IF SY-SUBRC = 0.
" SETS THE HTTP BODY OF THIS ENTITY TO THE GIVEN CHAR. DATA
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:200 数据存储SUCCESS' " 将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
" SETS CURRENT HTTP STATUS CODE
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
" SET THE BODY TYPE (TEXT/HTML, FOR EXAMPLE)
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
ELSE.
" SETS THE HTTP BODY OF THIS ENTITY TO THE GIVEN CHAR. DATA
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 数据存储ERROR' " 将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
" SETS CURRENT HTTP STATUS CODE
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
" SET THE BODY TYPE (TEXT/HTML, FOR EXAMPLE)
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
ENDIF.
IF LT_ZMMT003 IS NOT INITIAL.
TYPES:BEGIN OF TY_TAB,
BANFN TYPE ZMMT003-BANFN,
BNFPO TYPE ZMMT003-BNFPO,
MENGE TYPE ZMMT003-MENGE,
FRGKZ TYPE ZMMT003-FRGKZ,
ERDAT TYPE ZMMT003-ERDAT,
AFNAM TYPE ZMMT003-AFNAM,
FRGGR TYPE T16FC-FRGGR, "审批组
FRGCO TYPE T16FC-FRGCO, "审批代码
END OF TY_TAB.
DATA:GT_ZMMT003 TYPE TABLE OF TY_TAB,
GS_ZMMT003 TYPE TY_TAB.
SELECT * FROM ZMMT003 INTO CORRESPONDING FIELDS OF TABLE GT_ZMMT003
FOR ALL ENTRIES IN LT_ZMMT003
WHERE BANFN = LT_ZMMT003-BANFN.
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 SQL(ZMMT003),SY-SUBRC=' && SY-SUBRC
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
LOOP AT GT_ZMMT003 INTO GS_ZMMT003.
GS_ZMMT003-BANFN = '00' && GS_ZMMT003-BANFN.
SELECT SINGLE FRGGR FROM EBAN INTO GS_ZMMT003-FRGGR WHERE BANFN = GS_ZMMT003-BANFN.
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 SQL(EBAN-FRGGR),SY-SUBRC=' && SY-SUBRC
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
SELECT SINGLE FRGCO FROM T16FC INTO GS_ZMMT003-FRGCO WHERE FRGGR = GS_ZMMT003-FRGGR.
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 SQL(T16FC-FRGCO),SY-SUBRC=' && SY-SUBRC
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
MODIFY GT_ZMMT003 FROM GS_ZMMT003.
ENDLOOP.
LOOP AT GT_ZMMT003 INTO GS_ZMMT003 WHERE FRGKZ = 'C'.
***************bapi审批****************
CALL FUNCTION 'BAPI_REQUISITION_RELEASE'
EXPORTING
number = GS_ZMMT003-BANFN
rel_code = GS_ZMMT003-FRGCO
item = GS_ZMMT003-BNFPO
* USE_EXCEPTIONS = 'X'
* NO_COMMIT_WORK = ' '
TABLES
RETURN = LT_RETURN
EXCEPTIONS
AUTHORITY_CHECK_FAIL = 1
REQUISITION_NOT_FOUND = 2
ENQUEUE_FAIL = 3
PREREQUISITE_FAIL = 4
RELEASE_ALREADY_POSTED = 5
RESPONSIBILITY_FAIL = 6
OTHERS = 7 .
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 (CALL FUNCTION BAPI_REQUISITION_RELEASE),SY-SUBRC=' && SY-SUBRC " 将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
*************更新申请数量、更新申请人手机号为申请人姓名*****************
"更新申请人姓名-EBAN
UPDATE EBAN SET AFNAM = GS_ZMMT003-AFNAM WHERE BANFN = GS_ZMMT003-BANFN AND BNFPO = GS_ZMMT003-BNFPO.
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 (UPDATE EBAN-AFNAM ERROR),SY-SUBRC=' && SY-SUBRC " 将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
"更新申请数量-EBAN
UPDATE EBAN SET MENGE = GS_ZMMT003-MENGE WHERE BANFN = GS_ZMMT003-BANFN AND BNFPO = GS_ZMMT003-BNFPO.
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 (UPDATE EBAN-MENGE ERROR),SY-SUBRC=' && SY-SUBRC " 将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
"更新申请数量-EBKN
UPDATE EBKN SET MENGE = GS_ZMMT003-MENGE WHERE BANFN = GS_ZMMT003-BANFN AND BNFPO = GS_ZMMT003-BNFPO.
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 (UPDATE EBKN-MENGE ERROR),SY-SUBRC=' && SY-SUBRC " 将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
ENDLOOP.
LOOP AT GT_ZMMT003 INTO GS_ZMMT003 WHERE FRGKZ = 'X'.
UPDATE EBAN SET LOEKZ = 'X' WHERE BANFN = GS_ZMMT003-BANFN AND BNFPO = GS_ZMMT003-BNFPO..
IF SY-SUBRC <> 0.
SERVER->RESPONSE->SET_CDATA(
/UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 (UPDATE EBAN-LOEKZ ERROR),SY-SUBRC=' && SY-SUBRC " 将内表转换为JSON传出
COMPRESS = ABAP_TRUE
PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
LV_CONTENT_TYPE = 'APPLICATION/JSON'.
SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
RETURN.
ENDIF.
ENDLOOP.
**************删除未通过审批的采购申请*****************
* DATA:GT_ZMMT003_B TYPE TABLE OF ZMMT003, GS_ZMMT003_B TYPE ZMMT003.
* DATA:GT_TAB TYPE TABLE OF BAPIEBAND, GS_TAB TYPE BAPIEBAND.
* DATA:GT_RETURN TYPE TABLE OF BAPIRETURN, GS_RETURN TYPE BAPIRETURN.
* DATA:ZNUMBER TYPE ZMMT003-BANFN.
*
* SELECT * FROM ZMMT003 INTO CORRESPONDING FIELDS OF TABLE GT_ZMMT003_B
* FOR ALL ENTRIES IN LT_ZMMT003
* WHERE BANFN = LT_ZMMT003-BANFN
* AND FRGKZ = 'X'.
* IF SY-SUBRC <> 0.
* SERVER->RESPONSE->SET_CDATA(
* /UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 SQL(GT_ZMMT003_B),SY-SUBRC=' && SY-SUBRC
* COMPRESS = ABAP_TRUE
* PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
* SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
* LV_CONTENT_TYPE = 'APPLICATION/JSON'.
* SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
* RETURN.
* ENDIF.
*
* LOOP AT GT_ZMMT003_B INTO GS_ZMMT003_B.
* IF ZNUMBER IS INITIAL.
* ZNUMBER = '00' && GS_ZMMT003_B-BANFN.
* ENDIF.
*
* GS_TAB-PREQ_ITEM = GS_ZMMT003_B-BNFPO.
* GS_TAB-DELETE_IND = 'X'.
* GS_TAB-CLOSED = ''.
* APPEND GS_TAB TO GT_TAB.
* IF SY-SUBRC <> 0.
* SERVER->RESPONSE->SET_CDATA(
* /UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 (APPEND GT_TAB),SY-SUBRC=' && SY-SUBRC
* COMPRESS = ABAP_TRUE
* PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
* SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
* LV_CONTENT_TYPE = 'APPLICATION/JSON'.
* SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
* RETURN.
* ENDIF.
* CLEAR GS_TAB.
* ENDLOOP.
*
* LOOP AT GT_TAB INTO GS_TAB.
* CALL FUNCTION 'BAPI_REQUISITION_DELETE'
* EXPORTING
* NUMBER = ZNUMBER
* TABLES
* REQUISITION_ITEMS_TO_DELETE = GT_TAB
* RETURN = GT_RETURN.
* IF SY-SUBRC <> 0.
* SERVER->RESPONSE->SET_CDATA(
* /UI2/CL_JSON=>SERIALIZE( DATA = 'CODE:500 (CALL FUNCTION BAPI_REQUISITION_DELETE),SY-SUBRC=' && SY-SUBRC
* COMPRESS = ABAP_TRUE
* PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE ) ).
* SERVER->RESPONSE->SET_STATUS( CODE = 200 REASON = 'OK' ).
* LV_CONTENT_TYPE = 'APPLICATION/JSON'.
* SERVER->RESPONSE->SET_CONTENT_TYPE( LV_CONTENT_TYPE ).
* RETURN.
* ENDIF.
* ENDLOOP.
ENDIF.
ENDMETHOD.
二.SICF 配置服务
直接执行
找到SAP的发布路径,一般都是在default_host目录下,然后点击创建主机服务
具体配置参数如下:
名称自行按规范定义即可
登录数据中的集团为发布此接口的集团,用户名和密码即是此集团下存在的账号密码
处理器清单中填写我们刚刚在se24中创建的类名
创建成功后,回到目录下,先激活服务,然后测试服务,即可弹出我们需要的http接口URL地址。
下图中的接口已经是激活状态,所以激活服务是灰色的
后续用postman等工具来测试接口即可。
post SAP-Garson
原文链接:https://blog.csdn.net/qq_42080586/article/details/121007027文章来自于网络,如果侵犯了您的权益,请联系站长删除!