巴拉巴拉 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                     ).
发送请求获取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                     ).

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_STATUSIMPORTING 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_COOKIESCHANGING 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

LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME 'x-csrf-token' VALUE = IV_TOKEN ).
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME 'If-Match' VALUE '*' ).

"BREAK-POINT .
content type 很重要 不然ODATA 没办法抓取请求参数值
LO_HTTP_CLIENT->REQUEST->SET_HEADER_FIELD( NAME 'Content-Type' VALUE 'application/json')."'application/xml;charset=utf-8').

CALL METHOD LO_HTTP_CLIENT->SEND
  EXCEPTIONS
    HTTP_COMMUNICATION_FAILURE 1
    HTTP_INVALID_STATE         2
    HTTP_PROCESSING_FAILED     3
    HTTP_INVALID_TIMEOUT       4
    OTHERS                     5.

IF SY-SUBRC 0.
  CALL METHOD LO_HTTP_CLIENT->RECEIVE
    EXCEPTIONS
      HTTP_COMMUNICATION_FAILURE 1
      HTTP_INVALID_STATE         2
      HTTP_PROCESSING_FAILED     3
      OTHERS                     5.
ENDIF.

IF SY-SUBRC <> 0.
  "error handling
ENDIF.

RESPONSE = LO_HTTP_CLIENT->RESPONSE->GET_CDATA).

WRITE'response: ', RESPONSE.


BREAK-POINT.

Content-Type
posted @ 2024-01-22 13:45  我肉山  阅读(53)  评论(0)    收藏  举报