ZCL_REST_SERVER

Introduction

ZCL_REST_SERVER

  • RESTful-API provider enhancement - 自動記錄request/response
  • 啟用CORS(Access-Control-Allow-Origin: *),供swagger使用

History

VersionDateNameDescription
V001 2020/10/14 Huang Roy 初版
V002 2021/10/14 Huang Roy 啟用CORS

Public Method

IF_HTTP_EXTENSION~HANDLE_REQUEST

  • Interface: IF_HTTP_EXTENSION method
ParameterLevelPass ValueOptionalType(Ref To)DefaultDescription
SERVER Importing     IF_HTTP_SERVER   HTTP Server

Protected Method

_HANDLE_REQUEST

  • 繼承後,實際客製的method
ParameterLevelPass ValueOptionalType(Ref To)DefaultDescription
SERVER Importing     IF_HTTP_SERVER   HTTP Server

Sample

建立RESTful-API Class

  1. T-code: SE24,建立Global Class,這邊用YCL_REST_TEST做範例
    Superclass設定ZCL_REST_SERVER,save,繼承method()

  2. 游標定位在method: _HANDLE_REQUEST,並點擊,Redefine

  3. 修改code,並Activate

    • 取得 ~request_method,檢查方法(GET/POST/PUT/DELETE...),這裡判斷GET才回傳值
    • get_form_fields( ),取得的參數名會自動轉小寫
    • 最後response
    METHOD _handle_request.
    * Process
      DATA: lt_param TYPE tihttpnvp,
            l_str TYPE string.
      FIELD-SYMBOLS <lw_param> TYPE ihttpnvp.
    
    * Process
    ** ~request_method is 'GET'
      ASSERT server->request->get_method( ) = 'GET'.
    ** Get Parameter(all parameter name is lowercase)
      server->request->get_form_fields( CHANGING fields = lt_param ).
      READ TABLE lt_param ASSIGNING <lw_param>
        WITH KEY name = 'type'.
      IF sy-subrc = 0.
    ** Response
        CASE <lw_param>-value.
          WHEN 'TEXT'.
            l_str = 'TEXT test'.
            server->response->set_content_type( 'text/html; charset=utf-8' ).
          WHEN 'JSON'.
            l_str = '{"JSONValue":"JSON test"}'.
            server->response->set_content_type( 'application/json; charset=utf-8' ).
        ENDCASE.
        server->response->set_status( code = '200' reason = 'OK' ).
        server->response->set_cdata( l_str ).
      ENDIF.
    ENDMETHOD.
    

設定API路徑

  1. T-code: SICF,執行
    ※在Windows AP上執行

  2. 我們在default_host/sap/restful-test下,建立一個sub element,命名為restful-test

  3. Description 1必填,切換到Handler List,將前面建立的Class填入,存檔
    ※ logon data預設是用SAP帳密驗證(Basic Authentication)

  4. 啟用Service

  5. Test Service,會自動開啟browser,輸入SAP帳號密碼

  6. 因為程式碼中有用參數來判斷回傳結果,所以加上參數獲得結果
    http://eccqdap.sapecc.inventec:8010/sap/restful-test?type=JSON

    {
        "JSONValue": "JSON test"
    }
    

    http://eccqdap.sapecc.inventec:8010/sap/restful-test?type=TEXT

    TEXT test
    

Logs

  1. 路徑設定於Table: ZTCFG_TOOLS,MAIN=ZCL_REST_SERVER,SUB1=LOG_BASEPATH

  2. 以資料夾(資料夾不存在會自動建立)區分環境及程式log

  3. log檔名為<ClassName>_<date>

    ※目前只能在Windows AP下存Log,所以用Unix AP會跳錯誤。
    ※不過目前IEC開放RESTful-API Server的host也只有Windows AP,所以根源上直接就解決這個問題

  4. 檔案內資訊

Appendix

SMICM

T-code: SMICM,點擊,可檢視該AP相關service info
※可以使用FM: /SDF/GET_ICM_VIRT_HOST_DATA or TH_SERVER_LIST,一次查詢所有AP host

※從menu→service→change可以修改該service參數

各環境HostName, Port

SystemHost
DEV http://eccqdap.sapecc.inventec:8010
https://eccqdap.sapecc.inventec:5210
QAS http://eccqdap.sapecc.inventec:8000
PRD http://eccap1.sapecc.inventec:8000
http://eccap1.sapecc.inventec:8001
http://eccap2.sapecc.inventec:8000
http://eccap2.sapecc.inventec:8001
http://eccap3.sapecc.inventec:8000
http://eccap3.sapecc.inventec:8001
http://eccap4.sapecc.inventec:8000
http://eccap4.sapecc.inventec:8001
posted @ 2023-05-18 23:02  TYAING  阅读(57)  评论(0)    收藏  举报