ABAP 提供http post服务
1. SE24新建类ZCL_POS_HTTP_POST
实现接口IF_HTTP_EXTENSION
2. SICF在路径/default_host/sap/bc/下新建服务ZAPI_POS_HTTP,使用上面新建的类
方法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.