HTTP接口调用公用通道

发布时间 2023-12-01 09:48:31作者: ABAP-武汉-寒夜
class ZCL_RESTFUL_COMMON definition
  public
  final
  create public .

public section.

  interfaces IF_HTTP_EXTENSION .
protected section.
private section.
ENDCLASS.



CLASS ZCL_RESTFUL_COMMON IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_RESTFUL_COMMON->IF_HTTP_EXTENSION~HANDLE_REQUEST
* +-------------------------------------------------------------------------------------------------+
* | [--->] SERVER                         TYPE REF TO IF_HTTP_SERVER
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD if_http_extension~handle_request.
    DATA: req_input_json  TYPE string.
    DATA: response_json TYPE string.
    DATA: lv_method       TYPE string.
    DATA: lo_server_request  TYPE REF TO if_http_request,
          lo_server_response TYPE REF TO if_http_response.
    DATA: lt_header_fields TYPE tihttpnvp,
          ls_header_fields TYPE ihttpnvp.
    DATA: ls_syncfg TYPE ztif_syncfg.
    DATA: lv_if_id TYPE ze_if_id.
    DATA: BEGIN OF ls_error_return,
            ev_type    TYPE char1,
            ev_message TYPE char220,
          END OF ls_error_return.

    lo_server_request = server->request.            "获取请求(自)
    lo_server_response = server->response.          "获取响应(自)
    lv_method = lo_server_request->get_method( ).   "获取请求方式
    IF lv_method EQ 'POST'.
      "获取Header部分
      CALL METHOD lo_server_request->get_header_fields
        CHANGING
          fields = lt_header_fields.
      IF lt_header_fields[] IS NOT INITIAL .
        READ TABLE lt_header_fields WITH KEY name = 'if_id' INTO ls_header_fields .
      ENDIF.
      "获取body部分
      req_input_json = lo_server_request->get_cdata( ).

      lv_if_id = ls_header_fields-value.
      SELECT SINGLE * INTO ls_syncfg
        FROM ztif_syncfg
        WHERE if_id = lv_if_id
          AND active = 'X'.
      IF sy-subrc EQ 0 AND ls_syncfg-funcname IS NOT INITIAL.
        CALL FUNCTION ls_syncfg-funcname
          EXPORTING
            iv_json = req_input_json
          IMPORTING
            ev_json = response_json.
      ELSE.
        CLEAR: ls_error_return.
        ls_error_return-ev_type = 'E'.
        ls_error_return-ev_message = |SAP接口映射未配置|.
        "序列化JSON解析
        /ui2/cl_json=>serialize( EXPORTING data = ls_error_return
                                 RECEIVING r_json = response_json ).
      ENDIF.

      lo_server_response->set_status( code = 200 reason = 'OK' ). "设置响应
      lo_server_response->set_content_type( 'application/json;charset=utf-8' )."响应类型
      lo_server_response->set_cdata( data = response_json )."响应报文

    ENDIF.
  ENDMETHOD.
ENDCLASS.