巴拉巴拉 HANA CLOUD 版本的ODATE 接口案例
今天分享一個S4HC的ODATA 接口
這是一個維護PM中設備的的扣子
REPORT YTEST029.
DATA: LO_HTTP_CLIENT TYPE REF TO IF_HTTP_CLIENT.
DATA: LO_HTTP_CLIENT2 TYPE REF TO IF_HTTP_CLIENT.
DATA: RESPONSE TYPE STRING.
DATA:IV_URL TYPE STRING.
根據SM59中配置的鏈接創建HTTP請求對象
CALL METHOD CL_HTTP_CLIENT=>CREATE_BY_DESTINATION
EXPORTING "URL = 'https://********.s4hana.ondemand.com:443/sap/opu/odata/sap/API_EQUIPMENT'
DESTINATION = 'S4H_CLOUD_TEST'"ME->DEST
IMPORTING
CLIENT = LO_HTTP_CLIENT
EXCEPTIONS
ARGUMENT_NOT_FOUND = 1
PLUGIN_NOT_ACTIVE = 2
INTERNAL_ERROR = 3
OTHERS = 4.
IF SY-SUBRC <> 0.
"error handling
ENDIF.
ODATA 接口必須啟用COOKIE
LO_HTTP_CLIENT->PROPERTYTYPE_ACCEPT_COOKIE = IF_HTTP_CLIENT=>CO_ENABLED.
DATA:IV_URL2 TYPE STRING.
IV_URL2 = |/sap/opu/odata/sap/API_EQUIPMENT|.
或者的TOKEN是API_EQUIOMENT的
CALL METHOD CL_HTTP_UTILITY=>SET_REQUEST_URI
EXPORTING
REQUEST = LO_HTTP_CLIENT->REQUEST
URI = IV_URL2.
設置表頭參數
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD(
NAME = 'x-csrf-token'
VALUE = 'fetch' ).
這是獲取Token
LO_HTTP_CLIENT->REQUEST->SET_METHOD('HEAD').
" Send the request
LO_HTTP_CLIENT->SEND(
* EXPORTING
* timeout = CO_TIMEOUT_DEFAULT " Timeout of Answer Waiting Time
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
HTTP_INVALID_TIMEOUT = 4
OTHERS = 5 ).
發送請求獲取Token
IF SY-SUBRC <> 0.
RAISE HTTP_ERROR.
ENDIF.
" Receive the response
LO_HTTP_CLIENT->RECEIVE(
EXCEPTIONS
HTTP_COMMUNICATION_FAILURE = 1
HTTP_INVALID_STATE = 2
HTTP_PROCESSING_FAILED = 3
OTHERS = 4 ).
IF SY-SUBRC NE 0.
RAISE HTTP_ERROR.
ENDIF.
回收請求
DATA:EV_STATUS TYPE I.
DATA:IV_TOKEN TYPE STRING.
DATA:LT_COOKES TYPE TIHTTPCKI.
" Get status code
LO_HTTP_CLIENT->RESPONSE->GET_STATUS( IMPORTING CODE = EV_STATUS ).
檢查執行狀態
IF EV_STATUS = 200.
"GET TIME STAMP FIELD ME->TOKEN_REFRESH_TIME.
IV_TOKEN = LO_HTTP_CLIENT->RESPONSE->GET_HEADER_FIELD( 'x-csrf-token' ).
LO_HTTP_CLIENT->RESPONSE->GET_COOKIES( CHANGING COOKIES = LT_COOKES ).
ENDIF.
取出Token
DATA:LV_EQUNR TYPE EQUI-EQUNR,
LV_VALDT TYPE STRING.
LV_EQUNR = '''40043492'''.
LV_VALDT = '''9999-12-31T00%3A00'''.
IV_URL = | /sap/opu/odata/sap/API_EQUIPMENT/DismantleEquipment?Equipment=%2740043494%27&ValidityEndDate=datetime%279999-12-31T00%3A00%27 |.
拼接請求
在Odata中有些特殊的POST 是沒有PAYLOAD的 直接POST 很奇怪
CALL METHOD CL_HTTP_UTILITY=>SET_REQUEST_URI
EXPORTING
REQUEST = LO_HTTP_CLIENT->REQUEST
URI = IV_URL.
"setting request method
LO_HTTP_CLIENT->REQUEST->SET_METHOD('POST').
"adding headers
