本文主要是介绍4.SAP ECC上创建Restful服务并供外围系统调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SAP 系统上可以发布一个restful API并可以让外部系统调用。
1. 创建类ZCL_REST_01
接口: IF_HTTP_EXTENSION
在IF_HTTP_EXTENSION~HANDLE_REQUEST 方法中接收Http request请求,并发送http response:
例子:
METHOD IF_HTTP_EXTENSION~HANDLE_REQUEST.
TYPES: BEGIN OF TY_INPUT,
ROWS TYPE I,
END OF TY_INPUT.
DATA: L_INPUT TYPE TY_INPUT.
DATA: I_STRING TYPE STRING,
O_STRING TYPE STRING.
DATA: LT_SFLIGHT TYPE TABLE OF SFLIGHT.
"Get Importing Json
I_STRING = SERVER->REQUEST->IF_HTTP_ENTITY~GET_CDATA( )."
"Deserialize Json to data
ZUI2_CL_JSON=>DESERIALIZE( EXPORTING JSON = I_STRING CHANGING DATA = L_INPUT ).
"Get Return Data
SELECT *
FROM SFLIGHT
INTO TABLE LT_SFLIGHT
UP TO 10 ROWS.
"Serialize Data to Json
O_STRING = ZUI2_CL_JSON=>SERIALIZE( LT_SFLIGHT ).
"Set the return data format
CALL METHOD SERVER->RESPONSE->IF_HTTP_ENTITY~SET_CONTENT_TYPE
EXPORTING
CONTENT_TYPE = 'application/json'.
"set exporting data
SERVER->RESPONSE->SET_CDATA(
EXPORTING
DATA = O_STRING ).
ENDMETHOD.
2. 创建SICF服务,生成URL,可以指定匿名访问的账号
已经生成的服务z_rest_01,服务是通过‘创建主机/服务’创建出来的,比较简单
把第一步中建的类zcl_rest_01 放到处理器中:
右键点击可以测试该服务:
测试服务,可以获取服务的URL
3: 测试该服务是否可用:
*&---------------------------------------------------------------------*
*& Report ZZZZZZ3
*&
*&---------------------------------------------------------------------*
*& 自己写一个zcl_rest_01 做测试
*&
*&---------------------------------------------------------------------*
REPORT ZZZZZZ4.
DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT,
LO_REST_CLIENT TYPE REF TO CL_REST_HTTP_CLIENT,
LV_URL TYPE STRING,
LV_HTTP_STATUS TYPE STRING,
LV_BODY TYPE STRING.
DATA: LV_SIGN TYPE STRING,
LV_KEY TYPE STRING ,
LV_HASH_MD5 TYPE HASH160.
DATA LV_USERNAME TYPE STRING.
DATA LV_PASSWORD TYPE STRING.
TYPES: BEGIN OF TY_JSON_REQ,
USERNAME TYPE STRING ,
PWD TYPE STRING ,
MSG TYPE STRING ,
MOBILE TYPE STRING ,
MARK TYPE STRING ,
MSGTYPE TYPE STRING ,
SIGN TYPE STRING,
END OF TY_JSON_REQ.
DATA: LS_JSON_REQ TYPE TY_JSON_REQ.
DATA: LO_JSON TYPE REF TO CL_CLB_PARSE_JSON,
LO_RESPONSE TYPE REF TO IF_REST_ENTITY ,
LO_REQUEST TYPE REF TO IF_REST_ENTITY ,
LO_SQL TYPE REF TO CX_SY_OPEN_SQL_DB ,
LV_STATUS TYPE STRING ,
LV_REASON TYPE STRING ,
LV_RESPONSE TYPE STRING ,
LV_CONTENT_LENGTH TYPE STRING,
LV_LOCATION TYPE STRING ,
LV_CONTENT_TYPE TYPE STRING ,
LV_STATUS2 TYPE I.
DATA: LV_TOKEN_NUMBER TYPE STRING.
DATA LR_JSON_SERIALIZER TYPE REF TO CL_TREX_JSON_SERIALIZER.
DATA: LV_RESPONSE_MSG TYPE STRING,
LV_RESPONSE_RESULT TYPE STRING,
LV_DUMMY1 TYPE STRING ,
LV_DUMMY2 TYPE STRING .
LV_URL = 'http://edq.expr.com:8000/z_rest_01?sap-client=200'.
"Create HTTP Client
CL_HTTP_CLIENT=>CREATE_BY_URL(
EXPORTING
URL = LV_URL " Logical destination (specified in function call)
IMPORTING
CLIENT = LO_HTTP_CLIENT " HTTP Client Abstraction
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4
).
IF SY-SUBRC <> 0.
RETURN .
ENDIF.
* If you are using cl_http_client=>create_by_url use this code to supress and pass your
* HTTP basic authenication
LO_HTTP_CLIENT->PROPERTYTYPE_LOGON_POPUP = LO_HTTP_CLIENT->CO_DISABLED .
LV_USERNAME = 'SAPLOGONID'.
LV_PASSWORD = 'Abcd1234'.
CALL METHOD LO_HTTP_CLIENT->AUTHENTICATE
EXPORTING
USERNAME = LV_USERNAME
PASSWORD = LV_PASSWORD.
CREATE OBJECT LO_REST_CLIENT
EXPORTING
IO_HTTP_CLIENT = LO_HTTP_CLIENT.
LO_HTTP_CLIENT->REQUEST->SET_VERSION( IF_HTTP_REQUEST=>CO_PROTOCOL_VERSION_1_0 ).
IF LO_HTTP_CLIENT IS BOUND AND LO_REST_CLIENT IS BOUND.
CL_HTTP_UTILITY=>SET_REQUEST_URI(
EXPORTING
REQUEST = LO_HTTP_CLIENT->REQUEST " HTTP Framework (iHTTP) HTTP Request
URI = LV_URL " URI String (in the Form of /path?query-string)
).
ELSE.
RETURN .
ENDIF.
"message convert to Json
CREATE OBJECT LR_JSON_SERIALIZER
EXPORTING
DATA = LS_JSON_REQ.
LR_JSON_SERIALIZER->SERIALIZE( ).
LV_BODY = LR_JSON_SERIALIZER->GET_DATA( ).
* Or you can use this class as well
* lv_body = /ui2/cl_json=>serialize( data = json_req ).
* Converted JSON should look like this
lv_body = '{ "salesorder":"25252525", "type":"Direct"}'. "随便给一个
* Set Payload or body ( JSON or XML)
LO_REQUEST = LO_REST_CLIENT->IF_REST_CLIENT~CREATE_REQUEST_ENTITY( ).
LO_REQUEST->SET_CONTENT_TYPE( IV_MEDIA_TYPE = IF_REST_MEDIA_TYPE=>GC_APPL_JSON ).
LO_REQUEST->SET_STRING_DATA( LV_BODY ).
lv_token_number = '32d95891358e02e9abdaf6c9cfb01e9e'.
CALL METHOD LO_REST_CLIENT->IF_REST_CLIENT~SET_REQUEST_HEADER
EXPORTING
IV_NAME = 'appkey'
IV_VALUE = LV_TOKEN_NUMBER. "Set your header .
* POST Now !!!!!!!!!!!!!
LO_REST_CLIENT->IF_REST_RESOURCE~POST( LO_REQUEST ).
* Collect response
LO_RESPONSE = LO_REST_CLIENT->IF_REST_CLIENT~GET_RESPONSE_ENTITY( ).
LV_HTTP_STATUS = LV_STATUS = LO_RESPONSE->GET_HEADER_FIELD( '~status_code' ).
LV_REASON = LO_RESPONSE->GET_HEADER_FIELD( '~status_reason' ).
LV_CONTENT_LENGTH = LO_RESPONSE->GET_HEADER_FIELD( 'content-length' ).
LV_LOCATION = LO_RESPONSE->GET_HEADER_FIELD( 'location' ).
LV_CONTENT_TYPE = LO_RESPONSE->GET_HEADER_FIELD( 'content-type' ).
LV_RESPONSE = LO_RESPONSE->GET_STRING_DATA( ).
BREAK-POINT.
debug可以看到返回正确的数据:
如果post时需要传出参数,在IF_HTTP_EXTENSION~HANDLE_REQUEST中读取下http request就可以。
4. 参考了一些链接,具体没有记下来。
这篇关于4.SAP ECC上创建Restful服务并供外围系统调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!