SAP 使用HTTP
示例程序
REPORT ZZ_SEND_HTTP.
* Selection Screen
SELECTION-SCREEN BEGIN OF BLOCK bk01 WITH FRAME TITLE text-001.
PARAMETER p_fname TYPE RS38L_FNAM.
PARAMETER p_json TYPE string.
SELECTION-SCREEN END OF BLOCK bk01.
* Message
TYPE: BEGIN OF str_message,
type TYPE bapi_mtype,
message TYPE bapi_msg,
END OF str_message.
DATA: e_data TYPE str_message.
* Connection Parameter
DATA:lt_setting TYPE TABLE OF zws_http_url WITH HEADER LINE.
DATA:lv_url TYPE string.
DATA:lv_user TYPE string.
DATA:lv_password TYPE string.
DATA:lv_authorization TYPE string.
DATA:lv_error TYPE c.
* HTTP Connection
DATA:lo_http_client TYPE REF TO if_http_client.
DATA:lv_message TYPE string.
DATA:lv_json TYPE string.
DATA:lv_len TYPE i.
* Return Log Table
CLEAR: lv_url,lv_user,lv_password,lv_authorization,lv_error,lv_message.
CLEAR: lo_http_client.
* Prepare HTTP Connection Parameter
CLEAR lt_setting.
REFRESH lt_setting.
SELECT *
INTO TABLE lt_setting
FROM zws_http_url
WHERE func_name = p_fname.
IF sy-subrc EQ 0.
SORT lt_setting BY zz_key.
ENDIF.
CLEAR: lv_url,lv_user,lv_password,lv_authorization,lv_error.
CLEAR: lo_http_client.
READ TABLE lt_setting WITH KEY zz_key = 'URL' BINARY SEARCH.
IF sy-subrc EQ 0.
lv_url = lt_setting-zz_data.
ELSE.
lv_error = abap_true.
ENDIF.
READ TABLE lt_setting WITH KEY zz_key = 'USERNAME' BINARY SEARCH.
IF sy-subrc EQ 0.
lv_user = lt_setting-zz_data.
ELSE.
lv_error = abap_true.
ENDIF.
READ TABLE lt_setting WITH KEY zz_key = 'PASSWORD' BINARY SEARCH.
IF sy-subrc EQ 0.
lv_password = lt_setting-zz_data.
ELSE.
lv_error = abap_true.
ENDIF.
READ TABLE lt_setting WITH KEY zz_key = 'AUTHORIZATION' BINARY SEARCH.
IF sy-subrc EQ 0.
lv_authorization = lt_setting-zz_data.
ELSE.
lv_error = abap_true.
ENDIF.
IF lv_error = abap_true.
e_data-type = 'E'.
e_data-message = '读取系统设置有错,请检查'.
RETURN.
ENDIF.
* 创建URL连接
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = lv_url
IMPORTING
client = lo_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
lo_http_client->get_last_error( importing message = lv_message ).
e_data-type = 'E'.
e_data-message = lv_message.
RETURN.
ENDIF.
* USER NAME & PASSWORD
CALL METHOD lo_http_client->authenticate
EXPORTING
username = lv_user
password = lv_password.
* SET HEADER FIELD
CALL METHOD lo_http_client->request->set_header_field
EXPORTING
name = 'Authorization'
value = lv_authorization.
CALL METHOD lo_http_client->request->set_header_field
EXPORTING
name = 'Password'
value = 'XXXXX'.
CALL METHOD lo_http_client->request->set_header_field
EXPORTING
name = 'Content-Type'
value = 'application/json'.
* SET content type
CALL METHOD lo_http_client->request->set_content_type
EXPORTING
content_type = 'application/json; charset=utf-8'.
CALL METNOD lo_http_client->request->set_method
EXPORTING
method = if_http_request=>co_request_method_post
* data->json
IF p_json IS INITIAL.
e_data-type = 'E'.
e_data-message = '传入参数为空,请检查'.
RETURN.
ENDIF.
* set data
lv_len = STRLEN( p_json ).
CALL METHOD lo_http_client->request->set_cdata
EXPORTING
data = p_json
offset = 0
length = lv_len.
* send data
DO 2 TIMES.
CALL METHOD lo_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
http_invalid_timeout = 4
OTHERS = 5.
IF sy-subrc <> 0.
e_data-type = 'E'.
e_data-message = '发送HTTP请求失败,请检查'.
WAIT UP TO 5 SECONDS. "最大发送2次,第一次发送失败,则延迟5秒发送第二次
ELSE.
CLEAR:e_data.
EXIT.
ENDIF.
ENDDO.
IF e_data-type IS NOT INITIAL.
RETURN.
ENDIF.
* receive
CALL METHOD lo_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4.
IF sy-subrc <> 0.
e_data-type = 'E'.
e_data-message = '接收HTTP响应失败,请检查'.
RETURN.
ENDIF.
* Get HTTP Response Data
CLEAR lv_json.
CALL METHOD lo_http_client->response->get_cdata
RECEIVING
data = lv_json.
* JSON->DATA
WRITE: / lv_json.
WRITE: / e_data.