通过外部系统提供的URL直接访问接口
业务场景:业务完成订单创建时,通过外部系统接口URL实时同步推送数据
主要步骤:
① 建立HTTP连接;
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = iv_url
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
② 设置请求方式为:POST/GET;
"设置请求方式为:POST
IF iv_request_method = 'POST'.
CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
ENDIF.
③ 设置header(如有需要);
"设置header
CALL METHOD lo_http_client->request->set_header_fields
EXPORTING
fields = it_header_fields.
④ 推送送转换后的json数据;
"发送转换后的json数据
CALL METHOD lo_http_client->request->set_cdata( data = iv_json ).
CALL METHOD lo_http_client->send
EXPORTING
timeout = if_http_client=>co_timeout_infinite
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.
⑤ 接收请求返回消息;
"接收请求返回消息
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
⑥ 关闭http连接;
"关闭http连接
CALL METHOD lo_http_client->close.
完整代码如下,仅供学习参考
FUNCTION zfm_httpclient_create_by_url.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IV_URL) TYPE STRING OPTIONAL
*" VALUE(IV_REQUEST_METHOD) TYPE CHAR4 DEFAULT 'POST'
*" VALUE(IT_HEADER_FIELDS) TYPE TIHTTPNVP OPTIONAL
*" VALUE(IV_JSON) TYPE STRING OPTIONAL
*" EXPORTING
*" VALUE(EV_OUTPUT_JSON) TYPE STRING
*" VALUE(ES_MESSAGE) TYPE ZSNC_RFC_MSG
*"----------------------------------------------------------------------
TYPES:BEGIN OF ty_ret,
ret_pk TYPE string,
ret_busicode TYPE string,
ret_resultcode TYPE string,
ret_msg TYPE string,
END OF ty_ret.
DATA:lv_url TYPE string,
lv_data TYPE string,
lo_http_client TYPE REF TO if_http_client.
DATA: lv_error_msg TYPE string,
lv_sysubrc LIKE sy-subrc.
DATA:ls_ret TYPE ty_ret,
lt_ret LIKE TABLE OF ls_ret.
DATA:BEGIN OF ls_ret_msg,
success TYPE string,
data LIKE lt_ret,
code TYPE string,
message TYPE string,
errorStack TYPE string,
END OF ls_ret_msg.
lv_url = iv_url.
CONDENSE lv_url.
"建立HTTP连接
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = iv_url
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc NE 0.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = lv_error_msg.
es_message-type = 'E'.
es_message-message = lv_error_msg.
RETURN.
ENDIF.
"设置请求方式为:POST
IF iv_request_method = 'POST'.
CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_post ).
ENDIF.
IF iv_request_method = 'GET'.
CALL METHOD lo_http_client->request->set_method( if_http_request=>co_request_method_get ).
ENDIF.
"设置header
CALL METHOD lo_http_client->request->set_header_fields
EXPORTING
fields = it_header_fields.
"发送转换后的json数据
CALL METHOD lo_http_client->request->set_cdata( data = iv_json ).
CALL METHOD lo_http_client->send
EXPORTING
timeout = if_http_client=>co_timeout_infinite
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.
"接收请求返回消息
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
IF sy-subrc NE 0.
CALL METHOD lo_http_client->get_last_error
IMPORTING
code = lv_sysubrc
message = lv_error_msg.
es_message-type = 'E'.
es_message-message = lv_error_msg.
ELSE.
ev_output_json = lo_http_client->response->get_cdata( ).
ENDIF.
"关闭http连接
CALL METHOD lo_http_client->close.
ENDFUNCTION.