FUNCTION zfm_restful_send.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IV_URL) TYPE STRING
*" VALUE(IV_METHOD) TYPE STRING DEFAULT 'POST'
*" VALUE(IV_USERNAME) TYPE STRING OPTIONAL
*" VALUE(IV_PASSWORD) TYPE STRING OPTIONAL
*" VALUE(IT_FIELDS) TYPE TIHTTPNVP OPTIONAL
*" VALUE(IV_SEND_DATA) TYPE STRING OPTIONAL
*" EXPORTING
*" VALUE(EV_TYPE) TYPE BAPI_MTYPE
*" VALUE(EV_MESSAGE) TYPE STRING
*" VALUE(EV_RESPONSE_DATA) TYPE STRING
*"----------------------------------------------------------------------
" 接口日志写入
/afl/log_init.
TYPES: BEGIN OF ty_response,
code TYPE char1,
message TYPE string,
END OF ty_response.
DATA: ls_response TYPE ty_response.
DATA:lo_http_client TYPE REF TO if_http_client,
lv_code TYPE i.
DATA:lv_proxy_host TYPE string.
DATA:lv_proxy_service TYPE string.
DATA: lv_ssl_id TYPE ssfapplssl .
IF sy-host = 'vhhsgps4ci'.
lv_proxy_host = 'proxy'.
lv_proxy_service = '3128'.
ENDIF.
*创建客户端请求
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = iv_url
proxy_host = lv_proxy_host
proxy_service = lv_proxy_service
ssl_id = lv_ssl_id
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
pse_not_found = 4
pse_not_distrib = 5
pse_errors = 6
oa2c_set_token_error = 7
oa2c_missing_authorization = 8
oa2c_invalid_config = 9
oa2c_invalid_parameters = 10
oa2c_invalid_scope = 11
oa2c_invalid_grant = 12
OTHERS = 13.
IF sy-subrc <> 0.
ev_type = 'E'.
lo_http_client->get_last_error( IMPORTING message = ev_message ).
ev_message = '创建代理失败!' && ev_message.
RETURN.
ENDIF.
*不显示登录界面
lo_http_client->propertytype_logon_popup = lo_http_client->co_disabled.
*设置账号+密码
IF iv_username IS NOT INITIAL AND iv_password IS NOT INITIAL.
lo_http_client->authenticate( EXPORTING username = iv_username password = iv_password ).
ENDIF.
*设定调用服务
lo_http_client->request->set_method( EXPORTING method = iv_method ).
*设置Headers
lo_http_client->request->set_header_fields( EXPORTING fields = it_fields[] ).
*设置报文数据
IF iv_send_data IS NOT INITIAL.
CALL METHOD lo_http_client->request->set_cdata
EXPORTING
data = iv_send_data
offset = 0
length = strlen( iv_send_data ).
ENDIF.
*发送请求
CALL METHOD lo_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
ev_type = 'E'.
lo_http_client->get_last_error( IMPORTING message = ev_message ).
ev_message = '发送请求失败!' && ev_message.
RETURN.
ENDIF.
*读取远程服务返回的处理过结果
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
IF sy-subrc <> 0 .
ev_type = 'E'.
lo_http_client->get_last_error( IMPORTING message = ev_message ).
ev_message = '获取返回消息失败!' && ev_message.
RETURN.
ELSE.
CALL METHOD lo_http_client->response->get_status
IMPORTING
code = lv_code
reason = ev_message.
IF lv_code BETWEEN '200' AND '299'.
ev_type = 'S'.
ev_message = '调用接口成功!'.
ELSE.
ev_type = 'E'.
ev_message = '返回码提示失败!' && ev_message.
ENDIF.
*读取返回内容
ev_response_data = lo_http_client->response->get_cdata( ).
IF ev_response_data IS NOT INITIAL.
* REPLACE ALL OCCURRENCES OF '#' IN ev_response_data WITH space.
* CONDENSE ev_response_data NO-GAPS.
/ui2/cl_json=>deserialize( EXPORTING json = ev_response_data
CHANGING data = ls_response ).
IF ls_response-code = 1 AND ls_response-message IS NOT INITIAL.
ev_type = 'E'.
ev_message = ls_response-message && ev_message.
ENDIF.
ENDIF.
ENDIF.
lo_http_client->close( ).
" 保存日志
/afl/save.
ENDFUNCTION.