ABAP 提供http post服务

1. SE24新建类ZCL_POS_HTTP_POST

实现接口IF_HTTP_EXTENSION

ABAP 提供http post服务

2. SICF在路径/default_host/sap/bc/下新建服务ZAPI_POS_HTTP,使用上面新建的类

ABAP 提供http post服务

 

方法HANDLE_REQUEST

DATA: lv_method       TYPE string,
          lv_content_type TYPE string,
          lv_parameter    TYPE string,
          lt_head_fields  TYPE tihttpnvp,
          lv_parameter_return    TYPE string,
          lv_result       TYPE string,
          lv_xdata        TYPE xstring,
          lv_xdata_o      TYPE xstring,
          lv_json         TYPE string.
    DATA: lv_service TYPE string,
          lv_query   TYPE string,
          lv_out     TYPE string,
          lv_zfunc   TYPE rs38l_fnam.
    DATA: serializer TYPE REF TO cl_trex_json_serializer.
*  *******************************************************************************

    CLEAR: lv_method, lv_content_type, lv_parameter, lv_result .

    lv_method = server->request->get_header_field( '~request_method' ). " 调用方式(POST/GET)

    IF lv_method = 'GET'.

      CREATE OBJECT serializer
        EXPORTING data = lv_parameter.

      CALL METHOD serializer->serialize( ).

      lv_json = serializer->get_data( ).

    ELSEIF  lv_method = 'POST'.
*  *类型校验可以不需要
      lv_content_type = server->request->get_header_field( 'Content-Type' ).
*        CHECK lv_content_type+0(16) = 'application/json' .

**  *  获得输入参数
*      CALL METHOD server->request->get_cdata
*        RECEIVING
*          data = lv_parameter.

*      获得header
      CALL METHOD server->request->get_header_fields
        CHANGING
          fields = lt_head_fields.

      CALL FUNCTION 'ZFM_POS_RETURN_PAY_RESULT'
       EXPORTING
         "iv_parameter       = lv_parameter
         IT_HEAD_FIELDS     = lt_head_fields
       IMPORTING
         ov_parameter       = lv_parameter_return
                .
      CALL METHOD server->response->set_cdata
        EXPORTING
          data = lv_parameter_return.

    ENDIF.

 

函数:ZFM_POS_RETURN_PAY_RESULT

*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_PARAMETER) TYPE  STRING OPTIONAL
*"     REFERENCE(IT_HEAD_FIELDS) TYPE  TIHTTPNVP OPTIONAL
*"  EXPORTING
*"     REFERENCE(OV_PARAMETER) TYPE  STRING
*"----------------------------------------------------------------------

  DATA: lr_deserializer TYPE REF TO cl_trex_json_deserializer.
  DATA: lwa_zttr10 TYPE zttr10.
  DATA: lv_json TYPE string.

  DATA: lwa_head_fields TYPE ihttpnvp.
  DATA: lwa_tab TYPE ty_result.
  DATA: lt_tab TYPE TABLE OF ty_result.

  READ TABLE it_head_fields INTO lwa_head_fields WITH KEY name = '~query_string'.
  IF lwa_head_fields IS NOT INITIAL.
    PERFORM frm_mapping_result_fields USING lwa_head_fields-value
                                      CHANGING lt_tab.
  

  ENDIF.

  IF lt_tab[] IS INITIAL.
    ov_parameter = '未解析到数据'.
    RETURN.
  ENDIF.

  LOOP AT lt_tab INTO lwa_tab.

    CLEAR: lwa_zttr10.

    SELECT SINGLE * INTO lwa_zttr10
      FROM zttr10
      WHERE cusid = lwa_tab-cusid         "商户号
        AND bizseq = lwa_tab-bizseq.      "检索单号

*    IF sy-subrc NE 0.
*      ov_parameter = 'bizseq is Non-existent '.
*      EXIT.
*    ENDIF.

    MOVE-CORRESPONDING lwa_tab TO lwa_zttr10.

    lwa_zttr10-state = 'Y'.

    CALL FUNCTION 'ZFM_DBM_SET_UPDATE_LOG'
     EXPORTING
       iv_mode       = 'U'
     CHANGING
       cs_line       = lwa_zttr10
              .

    CALL FUNCTION 'ZFM_UPDATE_ZTTR10' IN UPDATE TASK
     EXPORTING
       is_zttr10       = lwa_zttr10
              .

    COMMIT WORK AND WAIT.
    IF sy-subrc = 0.
      ov_parameter = 'success'.
    ELSE.
      ov_parameter = 'error'.
    ENDIF.
  ENDLOOP.

 

 

FORM frm_mapping_result_fields  USING    pv_value TYPE ihttpval
                                CHANGING ct_tab TYPE tt_result.
  DATA: BEGIN OF lt_string OCCURS 0,
          value TYPE char255,
        END OF lt_string.
  DATA: lwa_tab TYPE ty_result.

  DATA: lv_name TYPE string.
  DATA: lv_value TYPE string.
"sap-client=200&acct=opn0buHwphGY11u5Q01PEVymBZYI&accttype=99&amount=12&appid=00004391&bizseq=02191030085936389A48&cusid=550100082990B20&fee=0&paytime=20191030090039&randomstr=655509&sign=da861f3b496904d6d6c0a7b779eef0e6&signtype=MD5
  "&termbatchid=000224&ter
  "若该参数值有中文,则会出现乱码现象,需要将中文转换成 %+ASCII 形
  CALL METHOD cl_http_utility=>unescape_url
          EXPORTING
            escaped   = pv_value
          RECEIVING
            unescaped = lv_value.

  SPLIT lv_value AT '&' INTO TABLE lt_string.

  LOOP AT lt_string.
    CLEAR: lv_name,lv_value.

    SPLIT lt_string-value AT '=' INTO lv_name lv_value.

    CASE lv_name.
      WHEN 'trxcode'.
        lwa_tab-trxcode = lv_value.
      WHEN 'appid'.
        lwa_tab-appid = lv_value.
      WHEN 'cusid'.
        lwa_tab-cusid = lv_value.
      WHEN 'timestamp'.
        lwa_tab-timestamp = lv_value.
      WHEN 'randomstr'.
        lwa_tab-randomstr = lv_value.
      WHEN 'sign'.
        lwa_tab-sign = lv_value.
      WHEN 'bizseq'.
        lwa_tab-bizseq = lv_value.
      WHEN 'trxstatus'.
        lwa_tab-trxstatus = lv_value.
      WHEN 'amount'.
        lwa_tab-amount = lv_value.
      WHEN 'trxid'.
        lwa_tab-trxid = lv_value.
      WHEN 'srctrxid'.
        lwa_tab-srctrxid = lv_value.
      WHEN 'trxday'.
        lwa_tab-trxday = lv_value.
      WHEN 'paytime'.
        lwa_tab-paytime = lv_value.
      WHEN 'termid'.
        lwa_tab-termid = lv_value.
      WHEN 'termbatchid'.
        lwa_tab-termbatchid = lv_value.
      WHEN 'traceno'.
        lwa_tab-traceno = lv_value.
      WHEN 'trxreserve'.
        lwa_tab-trxreserve = lv_value.
      WHEN 'accttype'.
        lwa_tab-accttype = lv_value.
      WHEN 'acct'.
        lwa_tab-acct = lv_value.
      WHEN 'termauthno'.
        lwa_tab-termauthno = lv_value.
      WHEN 'termrefnum'.
        lwa_tab-termrefnum = lv_value.
      WHEN 'fee'.
        lwa_tab-fee = lv_value.
      WHEN 'signtype'.
        lwa_tab-signtype = lv_value.
      WHEN OTHERS.

    ENDCASE.
  ENDLOOP.

  APPEND lwa_tab TO ct_tab.

ENDFORM.