Difference between revisions of "SAP ABAP HTTP"
From SapWiki
| (21 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
==Ejemplo HTTP_CLIENT== | ==Ejemplo HTTP_CLIENT== | ||
| + | ===Ejemplo con SOAP=== | ||
| + | <nowiki> *URL https://qa.sapwiki.cl:443/polosur/DLEApi.php | ||
| + | *NAMESPACE https://qa.sapwiki.cl/polosur/ | ||
| + | *HOST qa.sapwiki.cl | ||
| + | *SOAP ACTION https://qa.sapwiki.cl/polosur/CargarDocumento | ||
| − | + | *----------------------------------------------------------------------* | |
| − | + | * FORM http_client | |
| − | + | *----------------------------------------------------------------------* | |
| − | + | * basado en programa RSWF_TEST_HTTP | |
| + | *----------------------------------------------------------------------* | ||
| + | * --> p_url Ej.: https://qa.sapwiki.cl:443/polosur/DLEApi.php | ||
| + | * --> p_soap String <soapenv:Envelope...</soapenv:Envelope> | ||
| + | * --> p_soap_action Parámetro SOAPAction: | ||
| + | * --> p_host Parámetro Host: | ||
| − | *----------------------------------------------------------------------* | + | * <-- p2 text |
| − | + | *----------------------------------------------------------------------* | |
| − | + | ||
| − | + | FORM http_client USING p_url | |
| − | + | p_soap | |
| − | + | p_soap_action | |
| − | + | p_host | |
| − | + | CHANGING p_subrc | |
| − | + | p_msg | |
| − | + | p_response. | |
| − | + | ||
| − | + | TYPE-POOLS: swfxc, icon. | |
| − | + | DATA: l_http_client TYPE REF TO if_http_client. | |
| − | + | DATA: l_url TYPE string. | |
| − | + | DATA: l_code TYPE sy-subrc. | |
| − | + | DATA: l_code_string TYPE string. | |
| − | + | DATA: l_message_string TYPE string. | |
| − | + | DATA: lt_http_fields TYPE tihttpnvp. | |
| − | + | DATA: l_http_field_wa TYPE ihttpnvp. | |
| − | + | DATA: l_char_header(40) TYPE c. | |
| − | + | DATA: l_body_string TYPE string. | |
| − | + | *----------------------------------------------------------------------- | |
| − | + | *- Create the HTTP-Client | |
| − | + | *----------------------------------------------------------------------- | |
| − | + | ||
| − | + | CALL METHOD cl_http_client=>create_by_url | |
| − | + | EXPORTING | |
| − | + | url = p_url | |
| − | + | * PROXY_HOST = l_proxy_host | |
| − | + | * PROXY_SERVICE = l_proxy_service | |
| − | + | ssl_id = 'ANONYM' | |
| − | + | IMPORTING | |
| − | + | client = l_http_client | |
| − | + | EXCEPTIONS | |
| − | + | argument_not_found = 1 | |
| − | + | plugin_not_active = 2 | |
| − | + | internal_error = 3 | |
| − | + | OTHERS = 4. | |
| − | + | IF sy-subrc <> 0. | |
| − | + | * MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO | |
| − | + | * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 | |
| − | + | * into l_message_string. | |
| − | + | IF l_message_string IS INITIAL. | |
| − | + | l_message_string = 'Error creating HTTP-Client'. "#EC NOTEXT | |
| − | + | ENDIF. | |
| − | + | * WRITE: / icon_red_light AS ICON. | |
| − | + | * PERFORM print_string USING l_message_string. | |
| − | + | p_msg = l_message_string. | |
| − | + | p_subrc = 9. | |
| − | + | ||
| − | + | EXIT. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | *--------------------------------------------------------------------* | |
| − | + | * HEADER | |
| − | + | *--------------------------------------------------------------------* | |
| − | + | ||
| − | + | * CALL METHOD l_http_client->request->set_header_field | |
| − | + | * EXPORTING | |
| − | + | * name = '~request_method' | |
| − | + | * value = 'POST'. | |
| − | + | ||
| − | + | DATA(l_bytes) = strlen( p_soap ). | |
| − | + | DATA l_content_length TYPE string. | |
| − | + | ||
| − | + | MOVE l_bytes TO l_content_length. | |
| − | + | CONDENSE l_content_length. | |
| − | + | ||
| − | + | CALL METHOD l_http_client->request->set_header_field | |
| − | + | EXPORTING | |
| − | + | name = 'Accept-Encoding' | |
| − | + | value = 'gzip,deflate'. "#EC NOTEXT | |
| − | + | ||
| − | + | CALL METHOD l_http_client->request->set_header_field | |
| − | + | EXPORTING | |
| − | + | name = 'Content-Type' | |
| − | + | value = 'text/xml;charset=UTF-8'. "#EC NOTEXT | |
| − | + | ||
| − | CALL METHOD l_http_client-> | + | CALL METHOD l_http_client->request->set_header_field |
| − | EXPORTING | + | EXPORTING |
| − | + | name = 'SOAPAction' | |
| − | + | value = p_soap_action. "#EC NOTEXT "'"https://qa.sapwiki.cl/polosur/CargarDocumento"'. | |
| − | + | ||
| − | + | CALL METHOD l_http_client->request->set_header_field | |
| − | + | EXPORTING | |
| − | + | name = 'Host' | |
| − | + | value = p_host. "#EC NOTEXT "'qa.sapwiki.cl'. | |
| − | + | ||
| − | + | CALL METHOD l_http_client->request->set_header_field | |
| − | + | EXPORTING | |
| − | + | name = 'Connection' | |
| − | + | value = 'Keep-Alive'. "#EC NOTEXT | |
| − | + | ||
| − | + | CALL METHOD l_http_client->request->set_header_field | |
| − | + | EXPORTING | |
| − | + | name = 'User-Agent' | |
| − | + | value = 'SAP NetWeaver Application Server (1.0;740)'. "#EC NOTEXT | |
| − | + | ||
| − | + | CALL METHOD l_http_client->request->set_header_field | |
| − | + | EXPORTING | |
| − | + | name = 'Content-Length' | |
| − | + | value = l_content_length. "#EC NOTEXT "'30000'. | |
| − | + | ||
| − | + | *--------------------------------------------------------------------* | |
| − | + | * soapenvelope | |
| − | + | * string <soapenv:Envelope...</soapenv:Envelope> | |
| − | + | *--------------------------------------------------------------------* | |
| − | + | CALL METHOD l_http_client->request->set_cdata | |
| − | + | EXPORTING | |
| − | + | data = p_soap. | |
| − | + | * offset = 0 | |
| − | + | * length = '19000'. | |
| − | + | ||
| − | + | ** copiado de CL_SOAP_HTTP_TPBND_ROOT=======CM01V | |
| − | + | ** provide the compression settings to the HTTP client object | |
| − | + | ** a) compress request | |
| − | + | * IF 1 = 1. "m_compress_request EQ tsrtp_f_bdg_compress_true. | |
| − | + | * CALL METHOD l_http_client->set_compression | |
| − | + | * EXPORTING | |
| − | + | * options = if_http_client=>co_compress_in_all_cases | |
| − | + | * EXCEPTIONS | |
| − | + | * compression_not_possible = 1. "#EC * | |
| − | + | ** ignore this exception to have the same behaviour as for clients created | |
| − | + | ** via sm59-destination: for this clients the method set_compression is | |
| − | + | ** called within the method SEND without exception handling! | |
| − | + | * ENDIF. | |
| − | + | * | |
| − | + | * | |
| − | + | ** b) compress response | |
| − | + | * IF 1 = 1 ."m_compress_response EQ tsrtp_f_bdg_compress_true. | |
| − | + | * l_http_client->propertytype_accept_compress = if_http_client=>co_enabled. | |
| − | + | * ELSE. | |
| − | + | ** m_client->propertytype_accept_compress = if_http_client=>co_disabled. | |
| − | + | * ENDIF. | |
| − | + | * | |
| − | + | ** according to RFC2612, section 10.3. (10.3.2, 10.3.3, 10.3.8) | |
| − | + | ** the HTTP client is not allowed to follow an redirect automatically | |
| − | + | ** for methods other than HEAD and GET => prevent this for WS calls | |
| − | + | ** NOTE: prevent the redirect also for PING functionalty although HEAD is | |
| − | + | ** used in this case in order to get an reliable PING-result | |
| − | + | * l_http_client->propertytype_redirect = if_http_client=>co_disabled. | |
| − | + | *----------------------------------------------------------------------- | |
| − | + | *- send the http post | |
| − | + | *----------------------------------------------------------------------- | |
| − | + | CALL METHOD l_http_client->send | |
| − | + | EXCEPTIONS | |
| − | + | http_communication_failure = 1 | |
| − | + | http_invalid_state = 2. | |
| − | + | IF sy-subrc <> 0. | |
| − | + | * WRITE: / icon_red_light AS ICON. | |
| − | + | ||
| − | + | CALL METHOD l_http_client->get_last_error | |
| − | + | IMPORTING | |
| − | + | code = l_code | |
| − | + | message = l_message_string. | |
| − | + | ||
| − | + | CALL METHOD l_http_client->close. | |
| − | + | ||
| − | + | l_code_string = l_code. | |
| − | + | CONCATENATE 'HTTP-Send: RC=' l_code_string "#EC NOTEXT | |
| − | + | INTO l_code_string . | |
| − | + | CONCATENATE l_code_string l_message_string | |
| − | + | INTO l_message_string SEPARATED BY space. | |
| − | + | ||
| − | + | * PERFORM print_string USING l_message_string. | |
| − | + | p_msg = l_message_string. | |
| − | + | p_subrc = 8. | |
| − | + | EXIT. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | *----------------------------------------------------------------------- | |
| − | + | *- receive the result of http post | |
| − | + | *----------------------------------------------------------------------- | |
| − | + | CALL METHOD l_http_client->receive | |
| − | + | EXCEPTIONS | |
| − | + | http_communication_failure = 1 | |
| − | + | http_invalid_state = 2. | |
| − | + | IF sy-subrc <> 0. | |
| − | + | * WRITE: / icon_red_light AS ICON. | |
| − | + | ||
| − | + | CALL METHOD l_http_client->get_last_error | |
| − | + | IMPORTING | |
| − | + | code = l_code | |
| − | + | message = l_message_string. | |
| − | + | ||
| − | + | CALL METHOD l_http_client->close. | |
| − | + | ||
| − | + | l_code_string = l_code. | |
| − | + | CONCATENATE 'HTTP-Receive: RC=' l_code_string "#EC NOTEXT | |
| − | + | INTO l_code_string . | |
| − | + | CONCATENATE l_code_string l_message_string | |
| − | + | INTO l_message_string SEPARATED BY space. | |
| − | + | ||
| − | + | * PERFORM print_string USING l_message_string. | |
| − | + | p_msg = l_message_string. | |
| − | + | p_subrc = 7. | |
| − | + | EXIT. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | *----------------------------------------------------------------------- | |
| − | + | *- print the results | |
| − | + | *----------------------------------------------------------------------- | |
| − | + | CALL METHOD l_http_client->response->get_status | |
| − | + | IMPORTING | |
| − | + | code = l_code. | |
| − | + | IF l_code < 300. | |
| − | + | * HTTP-codes: 100 - 199 = informations | |
| − | + | * HTTP-codes: 200 - 299 = client-request successful (200 = OK) | |
| − | + | * WRITE: / icon_green_light AS ICON. | |
| − | + | p_subrc = 0. | |
| − | + | ELSE. | |
| − | + | * HTTP-codes: 300 - 399 = redirected; further actions required | |
| − | + | * HTTP-codes: 400 - 499 = client-request incomplete | |
| − | + | * HTTP-codes: 500 - 599 = server errors | |
| − | + | * WRITE: / icon_red_light AS ICON. | |
| − | + | * IF l_code BETWEEN 300 AND 399. | |
| − | + | * p_msg = 'Redirected; further actions required'. "#EC NOTEXT | |
| − | + | * ELSEIF l_code BETWEEN 400 AND 499. | |
| − | + | * p_msg = 'Client-request incomplete'. "#EC NOTEXT | |
| − | + | * ELSE. | |
| − | + | * p_msg = 'Server errors'. "#EC NOTEXT | |
| − | + | * ENDIF. | |
| − | + | * | |
| − | + | * p_msg = |Web Service: Error { l_code } { p_msg }|. "#EC NOTEXT | |
| − | + | ||
| − | + | p_subrc = 6. | |
| − | + | ENDIF. | |
| − | + | *-- get the http header fields | |
| − | + | * CALL METHOD l_http_client->response->get_header_fields | |
| − | + | * CHANGING | |
| − | + | * fields = lt_http_fields. | |
| − | + | * LOOP AT lt_http_fields INTO l_http_field_wa. | |
| − | + | * l_char_header = l_http_field_wa-name. | |
| − | + | * WRITE: / l_char_header. | |
| − | + | * l_char_header = l_http_field_wa-value. | |
| − | + | * WRITE: l_char_header. | |
| − | + | * ENDLOOP. | |
| − | + | * WRITE: / sy-uline. | |
| − | + | ||
| − | + | *- get the body | |
| − | + | IF p_subrc = 0. | |
| − | + | l_body_string = l_http_client->response->get_cdata( ). | |
| − | + | * PERFORM print_string USING l_body_string. | |
| − | + | p_response = l_body_string. | |
| − | + | ELSE. | |
| − | + | *-- get the http header fields | |
| − | + | CALL METHOD l_http_client->response->get_header_fields | |
| − | + | CHANGING | |
| − | + | fields = lt_http_fields. | |
| − | + | LOOP AT lt_http_fields INTO l_http_field_wa. | |
| − | + | p_msg = |Webservice: Error { l_http_field_wa-value }|. | |
| − | + | EXIT. | |
| − | + | ENDLOOP. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | ENDFORM.</nowiki> | |
| − | + | ===Ejemplo con POST=== | |
| − | + | <nowiki> | |
| − | + | METHOD http_client. | |
| − | + | TYPE-POOLS: swfxc, icon. | |
| − | + | DATA: l_http_client TYPE REF TO if_http_client. | |
| − | + | DATA: l_url TYPE string. | |
| − | + | DATA: l_code TYPE sy-subrc. | |
| − | + | DATA: l_code_string TYPE string. | |
| − | + | DATA: l_message_string TYPE string. | |
| − | + | DATA: lt_http_fields TYPE tihttpnvp. | |
| + | DATA: l_http_field_wa TYPE ihttpnvp. | ||
| + | DATA: l_char_header(40) TYPE c. | ||
| + | DATA: l_body_string TYPE string. | ||
| + | *----------------------------------------------------------------------- | ||
| + | *- Create the HTTP-Client | ||
| + | *----------------------------------------------------------------------- | ||
| + | |||
| + | CALL METHOD cl_http_client=>create_by_url | ||
| + | EXPORTING | ||
| + | url = i_url | ||
| + | * PROXY_HOST = l_proxy_host | ||
| + | * PROXY_SERVICE = l_proxy_service | ||
| + | ssl_id = 'ANONYM' | ||
| + | IMPORTING | ||
| + | client = l_http_client | ||
| + | EXCEPTIONS | ||
| + | argument_not_found = 1 | ||
| + | plugin_not_active = 2 | ||
| + | internal_error = 3 | ||
| + | OTHERS = 4. | ||
| + | IF sy-subrc <> 0. | ||
| + | * MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO | ||
| + | * WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 | ||
| + | * into l_message_string. | ||
| + | IF l_message_string IS INITIAL. | ||
| + | l_message_string = 'Error creating HTTP-Client'. "#EC NOTEXT | ||
| + | ENDIF. | ||
| + | * WRITE: / icon_red_light AS ICON. | ||
| + | * PERFORM print_string USING l_message_string. | ||
| + | e_msg = l_message_string. | ||
| + | e_subrc = 9. | ||
| + | |||
| + | EXIT. | ||
| + | ENDIF. | ||
| + | |||
| + | *--------------------------------------------------------------------* | ||
| + | * HEADER | ||
| + | *--------------------------------------------------------------------* | ||
| + | |||
| + | * l_http_client->request->set_method( 'POST' ). | ||
| + | l_http_client->request->set_method( i_method ). | ||
| + | |||
| + | * l_http_client->request->set_content_type( 'application/json' ). | ||
| + | |||
| + | IF i_content_type IS NOT INITIAL. | ||
| + | l_http_client->request->set_content_type( i_content_type ). | ||
| + | ENDIF. | ||
| + | |||
| + | IF i_x_api_key IS SUPPLIED. | ||
| + | CALL METHOD l_http_client->request->set_header_field | ||
| + | EXPORTING | ||
| + | name = i_x_api_key | ||
| + | value = i_api_key. "#EC NOTEXT | ||
| + | ELSE. | ||
| + | CALL METHOD l_http_client->request->set_header_field | ||
| + | EXPORTING | ||
| + | name = 'X-API-KEY' | ||
| + | value = i_api_key. "#EC NOTEXT | ||
| + | ENDIF. | ||
| + | |||
| + | IF i_content_type IS NOT INITIAL. | ||
| + | CALL METHOD l_http_client->request->set_header_field | ||
| + | EXPORTING | ||
| + | name = 'Content-Type' | ||
| + | value = 'application/json'. "#EC NOTEXT | ||
| + | ENDIF. | ||
| + | |||
| + | *--------------------------------------------------------------------* | ||
| + | * soapenvelope | ||
| + | * string <soapenv:Envelope...</soapenv:Envelope> | ||
| + | *--------------------------------------------------------------------* | ||
| + | IF i_body IS SUPPLIED. | ||
| + | CALL METHOD l_http_client->request->set_cdata | ||
| + | EXPORTING | ||
| + | data = i_body. | ||
| + | ENDIF. | ||
| + | * offset = 0 | ||
| + | * length = '19000'. | ||
| + | |||
| + | ** copiado de CL_SOAP_HTTP_TPBND_ROOT=======CM01V | ||
| + | ** provide the compression settings to the HTTP client object | ||
| + | ** a) compress request | ||
| + | * IF 1 = 1. "m_compress_request EQ tsrtp_f_bdg_compress_true. | ||
| + | * CALL METHOD l_http_client->set_compression | ||
| + | * EXPORTING | ||
| + | * options = if_http_client=>co_compress_in_all_cases | ||
| + | * EXCEPTIONS | ||
| + | * compression_not_possible = 1. "#EC * | ||
| + | ** ignore this exception to have the same behaviour as for clients created | ||
| + | ** via sm59-destination: for this clients the method set_compression is | ||
| + | ** called within the method SEND without exception handling! | ||
| + | * ENDIF. | ||
| + | * | ||
| + | * | ||
| + | ** b) compress response | ||
| + | * IF 1 = 1 ."m_compress_response EQ tsrtp_f_bdg_compress_true. | ||
| + | * l_http_client->propertytype_accept_compress = if_http_client=>co_enabled. | ||
| + | * ELSE. | ||
| + | ** m_client->propertytype_accept_compress = if_http_client=>co_disabled. | ||
| + | * ENDIF. | ||
| + | * | ||
| + | ** according to RFC2612, section 10.3. (10.3.2, 10.3.3, 10.3.8) | ||
| + | ** the HTTP client is not allowed to follow an redirect automatically | ||
| + | ** for methods other than HEAD and GET => prevent this for WS calls | ||
| + | ** NOTE: prevent the redirect also for PING functionalty although HEAD is | ||
| + | ** used in this case in order to get an reliable PING-result | ||
| + | * l_http_client->propertytype_redirect = if_http_client=>co_disabled. | ||
| + | *----------------------------------------------------------------------- | ||
| + | *- send the http post | ||
| + | *----------------------------------------------------------------------- | ||
| + | CALL METHOD l_http_client->send | ||
| + | EXCEPTIONS | ||
| + | http_communication_failure = 1 | ||
| + | http_invalid_state = 2. | ||
| + | IF sy-subrc <> 0. | ||
| + | * WRITE: / icon_red_light AS ICON. | ||
| + | |||
| + | CALL METHOD l_http_client->get_last_error | ||
| + | IMPORTING | ||
| + | code = l_code | ||
| + | message = l_message_string. | ||
| + | |||
| + | CALL METHOD l_http_client->close. | ||
| + | |||
| + | l_code_string = l_code. | ||
| + | CONCATENATE 'HTTP-Send: RC=' l_code_string "#EC NOTEXT | ||
| + | INTO l_code_string . | ||
| + | CONCATENATE l_code_string l_message_string | ||
| + | INTO l_message_string SEPARATED BY space. | ||
| + | |||
| + | * PERFORM print_string USING l_message_string. | ||
| + | e_msg = l_message_string. | ||
| + | e_subrc = 8. | ||
| + | EXIT. | ||
| + | ENDIF. | ||
| + | |||
| + | *----------------------------------------------------------------------- | ||
| + | *- receive the result of http post | ||
| + | *----------------------------------------------------------------------- | ||
| + | CALL METHOD l_http_client->receive | ||
| + | EXCEPTIONS | ||
| + | http_communication_failure = 1 | ||
| + | http_invalid_state = 2. | ||
| + | IF sy-subrc <> 0. | ||
| + | * WRITE: / icon_red_light AS ICON. | ||
| + | |||
| + | CALL METHOD l_http_client->get_last_error | ||
| + | IMPORTING | ||
| + | code = l_code | ||
| + | message = l_message_string. | ||
| + | |||
| + | CALL METHOD l_http_client->close. | ||
| + | |||
| + | l_code_string = l_code. | ||
| + | CONCATENATE 'HTTP-Receive: RC=' l_code_string "#EC NOTEXT | ||
| + | INTO l_code_string . | ||
| + | CONCATENATE l_code_string l_message_string | ||
| + | INTO l_message_string SEPARATED BY space. | ||
| + | |||
| + | * PERFORM print_string USING l_message_string. | ||
| + | e_msg = l_message_string. | ||
| + | e_subrc = 7. | ||
| + | EXIT. | ||
| + | ENDIF. | ||
| + | |||
| + | *----------------------------------------------------------------------- | ||
| + | *- print the results | ||
| + | *----------------------------------------------------------------------- | ||
| + | CALL METHOD l_http_client->response->get_status | ||
| + | IMPORTING | ||
| + | code = l_code. | ||
| + | IF l_code < 300 OR l_code = 400. "bad request | ||
| + | * HTTP-codes: 100 - 199 = informations | ||
| + | * HTTP-codes: 200 - 299 = client-request successful (200 = OK) | ||
| + | * WRITE: / icon_green_light AS ICON. | ||
| + | e_subrc = 0. | ||
| + | ELSE. | ||
| + | * HTTP-codes: 300 - 399 = redirected; further actions required | ||
| + | * HTTP-codes: 400 - 499 = client-request incomplete | ||
| + | * HTTP-codes: 500 - 599 = server errors | ||
| + | * WRITE: / icon_red_light AS ICON. | ||
| + | * IF l_code BETWEEN 300 AND 399. | ||
| + | * p_msg = 'Redirected; further actions required'. "#EC NOTEXT | ||
| + | * ELSEIF l_code BETWEEN 400 AND 499. | ||
| + | * p_msg = 'Client-request incomplete'. "#EC NOTEXT | ||
| + | * ELSE. | ||
| + | * p_msg = 'Server errors'. "#EC NOTEXT | ||
| + | * ENDIF. | ||
| + | * | ||
| + | * p_msg = |Cloudsigner: Error { l_code } { p_msg }|. "#EC NOTEXT | ||
| + | |||
| + | e_subrc = 6. | ||
| + | ENDIF. | ||
| + | *-- get the http header fields | ||
| + | * CALL METHOD l_http_client->response->get_header_fields | ||
| + | * CHANGING | ||
| + | * fields = lt_http_fields. | ||
| + | * LOOP AT lt_http_fields INTO l_http_field_wa. | ||
| + | * l_char_header = l_http_field_wa-name. | ||
| + | * WRITE: / l_char_header. | ||
| + | * l_char_header = l_http_field_wa-value. | ||
| + | * WRITE: l_char_header. | ||
| + | * ENDLOOP. | ||
| + | * WRITE: / sy-uline. | ||
| + | |||
| + | *- get the body | ||
| + | IF e_subrc = 0. | ||
| + | l_body_string = l_http_client->response->get_cdata( ). | ||
| + | * PERFORM print_string USING l_body_string. | ||
| + | e_response = l_body_string. | ||
| + | ELSE. | ||
| + | *-- get the http header fields | ||
| + | CALL METHOD l_http_client->response->get_header_fields | ||
| + | CHANGING | ||
| + | fields = lt_http_fields. | ||
| + | LOOP AT lt_http_fields INTO l_http_field_wa. | ||
| + | e_msg = |Acepta: Error { l_http_field_wa-value }|. | ||
| + | EXIT. | ||
| + | ENDLOOP. | ||
| + | ENDIF. | ||
| + | ENDMETHOD. | ||
| + | </nowiki> | ||
| + | ===Ejemplo con GET y obtener PDF (binario)=== | ||
| + | <nowiki> | ||
| + | METHOD http_client. | ||
| + | TYPE-POOLS: swfxc, icon. | ||
| + | DATA: l_http_client TYPE REF TO if_http_client. | ||
| + | DATA: l_url TYPE string. | ||
| + | DATA: l_code TYPE sy-subrc. | ||
| + | DATA: l_code_string TYPE string. | ||
| + | DATA: l_message_string TYPE string. | ||
| + | DATA: lt_http_fields TYPE tihttpnvp. | ||
| + | DATA: l_http_field_wa TYPE ihttpnvp. | ||
| + | DATA: l_char_header(40) TYPE c. | ||
| + | DATA: l_body_string TYPE string. | ||
| + | DATA: l_body_xstring TYPE xstring. | ||
| + | *----------------------------------------------------------------------- | ||
| + | *- Create the HTTP-Client | ||
| + | *----------------------------------------------------------------------- | ||
| + | DATA ssl_id TYPE ssfapplssl. | ||
| + | ssl_id = 'ANONYM'. | ||
| + | CALL METHOD cl_http_client=>create_by_url | ||
| + | EXPORTING | ||
| + | url = i_url | ||
| + | ssl_id = ssl_id "'ANONYM' | ||
| + | IMPORTING | ||
| + | client = l_http_client | ||
| + | EXCEPTIONS | ||
| + | argument_not_found = 1 | ||
| + | plugin_not_active = 2 | ||
| + | internal_error = 3 | ||
| + | OTHERS = 4. | ||
| + | IF sy-subrc <> 0. | ||
| + | IF l_message_string IS INITIAL. | ||
| + | l_message_string = 'Error creating HTTP-Client'. "#EC NOTEXT | ||
| + | ENDIF. | ||
| + | |||
| + | e_msg = l_message_string. | ||
| + | e_subrc = 9. | ||
| + | |||
| + | EXIT. | ||
| + | ENDIF. | ||
| + | |||
| + | *--------------------------------------------------------------------* | ||
| + | * HEADER | ||
| + | *--------------------------------------------------------------------* | ||
| + | IF i_method IS NOT INITIAL. | ||
| + | l_http_client->request->set_method( i_method ). | ||
| + | ENDIF. | ||
| + | |||
| + | IF i_content_type IS NOT INITIAL. | ||
| + | l_http_client->request->set_content_type( i_content_type ). | ||
| + | ENDIF. | ||
| + | |||
| + | IF i_api_key_key IS NOT INITIAL. | ||
| + | CALL METHOD l_http_client->request->set_header_field | ||
| + | EXPORTING | ||
| + | name = i_api_key_key | ||
| + | value = i_api_key_value. "#EC NOTEXT | ||
| + | ENDIF. | ||
| + | |||
| + | *--------------------------------------------------------------------* | ||
| + | * soapenvelope | ||
| + | * string <soapenv:Envelope...</soapenv:Envelope> | ||
| + | *--------------------------------------------------------------------* | ||
| + | IF i_body IS SUPPLIED. | ||
| + | CALL METHOD l_http_client->request->set_cdata | ||
| + | EXPORTING | ||
| + | data = i_body. | ||
| + | ENDIF. | ||
| + | |||
| + | *----------------------------------------------------------------------- | ||
| + | *- send the http post | ||
| + | *----------------------------------------------------------------------- | ||
| + | CALL METHOD l_http_client->send | ||
| + | EXCEPTIONS | ||
| + | http_communication_failure = 1 | ||
| + | http_invalid_state = 2. | ||
| + | IF sy-subrc <> 0. | ||
| + | CALL METHOD l_http_client->get_last_error | ||
| + | IMPORTING | ||
| + | code = l_code | ||
| + | message = l_message_string. | ||
| + | |||
| + | CALL METHOD l_http_client->close. | ||
| + | |||
| + | l_code_string = l_code. | ||
| + | CONCATENATE 'HTTP-Send: RC=' l_code_string "#EC NOTEXT | ||
| + | INTO l_code_string . | ||
| + | CONCATENATE l_code_string l_message_string | ||
| + | INTO l_message_string SEPARATED BY space. | ||
| + | |||
| + | e_msg = l_message_string. | ||
| + | e_subrc = 8. | ||
| + | EXIT. | ||
| + | ENDIF. | ||
| + | |||
| + | *----------------------------------------------------------------------- | ||
| + | *- receive the result of http post | ||
| + | *----------------------------------------------------------------------- | ||
| + | CALL METHOD l_http_client->receive | ||
| + | EXCEPTIONS | ||
| + | http_communication_failure = 1 | ||
| + | http_invalid_state = 2. | ||
| + | IF sy-subrc <> 0. | ||
| + | |||
| + | CALL METHOD l_http_client->get_last_error | ||
| + | IMPORTING | ||
| + | code = l_code | ||
| + | message = l_message_string. | ||
| + | |||
| + | CALL METHOD l_http_client->close. | ||
| + | |||
| + | l_code_string = l_code. | ||
| + | CONCATENATE 'HTTP-Receive: RC=' l_code_string "#EC NOTEXT | ||
| + | INTO l_code_string . | ||
| + | CONCATENATE l_code_string l_message_string | ||
| + | INTO l_message_string SEPARATED BY space. | ||
| + | |||
| + | e_msg = l_message_string. | ||
| + | e_subrc = 7. | ||
| + | EXIT. | ||
| + | ENDIF. | ||
| + | |||
| + | *----------------------------------------------------------------------- | ||
| + | *- print the results | ||
| + | *----------------------------------------------------------------------- | ||
| + | CALL METHOD l_http_client->response->get_status | ||
| + | IMPORTING | ||
| + | code = l_code. | ||
| + | IF l_code < 300 OR l_code = 400. "bad request | ||
| + | * HTTP-codes: 100 - 199 = informations | ||
| + | * HTTP-codes: 200 - 299 = client-request successful (200 = OK) | ||
| + | * WRITE: / icon_green_light AS ICON. | ||
| + | e_subrc = 0. | ||
| + | ELSE. | ||
| + | * HTTP-codes: 300 - 399 = redirected; further actions required | ||
| + | * HTTP-codes: 400 - 499 = client-request incomplete | ||
| + | * HTTP-codes: 500 - 599 = server errors | ||
| + | e_subrc = 6. | ||
| + | ENDIF. | ||
| + | |||
| + | *- get the body | ||
| + | IF e_subrc = 0. | ||
| + | l_body_xstring = l_http_client->response->get_data( ). | ||
| + | e_xresponse = l_body_xstring. | ||
| + | ELSE. | ||
| + | *-- get the http header fields | ||
| + | CALL METHOD l_http_client->response->get_header_fields | ||
| + | CHANGING | ||
| + | fields = lt_http_fields. | ||
| + | LOOP AT lt_http_fields INTO l_http_field_wa. | ||
| + | e_msg = |Error { l_http_field_wa-value }|. | ||
| + | EXIT. | ||
| + | ENDLOOP. | ||
| + | ENDIF. | ||
| + | ENDMETHOD. | ||
| + | |||
| + | CALL METHOD zcl_obtener_documento=>http_client | ||
| + | EXPORTING | ||
| + | i_url = l_url "https://www.sapwiki.cl/documentos/ObtenerDocumento/Id=12345678'. | ||
| + | * i_body = | ||
| + | i_api_key_key = l_api_key_key | ||
| + | i_api_key_value = l_api_key_value | ||
| + | i_method = 'GET' | ||
| + | i_content_type = l_content_type "space | ||
| + | IMPORTING | ||
| + | e_msg = e_msg | ||
| + | e_xresponse = e_xdocumento | ||
| + | e_subrc = e_subrc. | ||
| + | </nowiki> | ||
| + | ===agregar parámetros a URL=== | ||
| + | Ejemplo: programa RWPM_TEST_RE_SERVICES | ||
| + | <nowiki> | ||
| + | lv_querystring = ls_adapter_url-url. "/sap/xi/adapter_plain | ||
| + | * construct additional query part to call plain adapter correctly | ||
| + | CALL METHOD lr_http_client->append_field_url | ||
| + | EXPORTING | ||
| + | name = 'namespace' | ||
| + | value = lv_namespace | ||
| + | CHANGING | ||
| + | url = lv_querystring. | ||
| + | CALL METHOD lr_http_client->append_field_url | ||
| + | EXPORTING | ||
| + | name = 'interface' | ||
| + | value = lv_interface | ||
| + | CHANGING | ||
| + | url = lv_querystring. | ||
| + | ... | ||
| + | ... | ||
| + | ... | ||
| + | "/sap/xi/adapter_plain?namespace=http%3a%2f%2fsap.com%2fxi%2fEA-RETAIL%2fGlobal2&interface=RetailEventReplicationRequest_In&service= AF76047&sap-client=400&QOS=EO&msgguid=0022484C16541FD0AAF7645221979ECE | ||
| + | * add querystring to URL | ||
| + | CALL METHOD cl_http_utility=>set_request_uri | ||
| + | EXPORTING | ||
| + | request = lr_http_client->request | ||
| + | uri = lv_querystring. | ||
| + | </nowiki> | ||
| + | |||
| + | ==Llamada a proxy client== | ||
| + | |||
| + | <nowiki>* proxy client | ||
| + | DATA: lo_proxy TYPE REF TO zhcm_co_si_os_carga_documento, | ||
| + | ls_output TYPE zhcm_mt_carga_documento, | ||
| + | ls_input TYPE zhcm_mt_respuesta_documento, | ||
| + | lo_system_ex TYPE REF TO cx_ai_system_fault, | ||
| + | lo_app_ex TYPE REF TO cx_ai_application_fault. | ||
| + | |||
| + | *do something | ||
| + | *..... | ||
| + | * | ||
| + | |||
| + | TRY. | ||
| + | * create proxy | ||
| + | CREATE OBJECT lo_proxy. | ||
| + | |||
| + | CALL METHOD lo_proxy->si_os_carga_documento | ||
| + | EXPORTING | ||
| + | output = ls_output | ||
| + | IMPORTING | ||
| + | input = ls_input. | ||
| + | CATCH cx_ai_system_fault INTO lo_system_ex. | ||
| + | * WRITE lo_system_ex->errortext TO msg. | ||
| + | * msg = lo_system_ex->if_message~get_text( ). | ||
| + | CATCH cx_ai_application_fault INTO lo_app_ex. | ||
| + | * WRITE lo_app_ex->textid TO msg. | ||
| + | * msg = lo_app_ex->if_message~get_text( ). | ||
| + | ENDTRY. | ||
| + | |||
| + | |||
| + | IF lo_system_ex IS NOT INITIAL. | ||
| + | e_message = lo_system_ex->if_message~get_text( ). | ||
| + | e_subrc = 1. | ||
| + | RETURN. | ||
| + | ENDIF. | ||
| + | |||
| + | IF lo_app_ex IS NOT INITIAL. | ||
| + | e_message = lo_app_ex->if_message~get_text( ). | ||
| + | e_subrc = 2. | ||
| + | RETURN. | ||
| + | ENDIF.</nowiki> | ||
| + | ==clase cl_abap_browser=>show_url== | ||
| + | <nowiki> | ||
| + | DATA: lv_title TYPE cl_abap_browser=>title, | ||
| + | lv_url TYPE string. | ||
| + | PARAMETERS p_url TYPE string OBLIGATORY LOWER CASE. | ||
| + | |||
| + | *--------------------------------------------------------------------* | ||
| + | INITIALIZATION. | ||
| + | *--------------------------------------------------------------------* | ||
| + | p_url = 'https://homer.sii.cl/'. | ||
| + | lv_title = 'example'. | ||
| + | |||
| + | START-OF-SELECTION. | ||
| + | |||
| + | CALL METHOD cl_abap_browser=>show_url | ||
| + | EXPORTING | ||
| + | url = p_url | ||
| + | title = lv_title | ||
| + | size = cl_abap_browser=>xlarge | ||
| + | * modal = iv_sapgui_show_in_dialog | ||
| + | buttons = cl_abap_browser=>navigate_off | ||
| + | format = cl_abap_browser=>landscape | ||
| + | position = cl_abap_browser=>topleft | ||
| + | context_menu = abap_true.</nowiki> | ||
| + | ==Notas PROXY== | ||
| + | * SRT_UTIL tran. log de llamada proxy | ||
| + | * Tabla SPROXXSL : relación entre proxy & XSLT hay que concatenar /1SAI/TXS & NAME e ir a la XSLT_TOOL | ||
| + | * Si en llamada a proxy da error de deserialization, poner break en CL_SXMLP_DATA_ST==============CM004 línea 26 | ||
| + | * RSSIDL_DESERIALIZE_DEMO verificar WSDL, ver nota Ver nota 1801866 - Proxy generation terminated: Incorrect value: Unknown Type Reference | ||
| + | * Test conexión HTML, reporte RSWF_TEST_HTTP | ||
| + | * LOG ICM : transacción SMICM, en menú: Pasar a -->Fichero trace-->Visualizar todo | ||
| + | * Configuración Proxy : transacción SICF | ||
| + | * Trn. STRUST Instalar certificados | ||
| + | * error failed: NIECONN_REFUSED(-10) - error de conexión al tratar de conectarse al servicio, se puede verificar con el programa | ||
| + | RSWF_TEST_HTTP o vía browser si se cuenta con vpn | ||
| + | <nowiki> | ||
| + | The SAP error NIECONN_REFUSED(-10) indicates that the network layer (SAP NiLib) was unable to establish a connection to the target host and port. This is a "Connection Refused" error, typically occurring at the OS or network level before the SAP application can even begin the handshake</nowiki> | ||
| + | * Nota 2469949 - "ICF Error when creating HTTP client object by Config for URL" in Web Services ABAP | ||
| + | * Nota 2334940 - B2A: Troubleshooting HTTPS for communication with health insurance funds | ||
| + | * Nota 1714792 - Proxy generation terminated: Message must have exactly one part | ||
| + | * Nota 1817447 - Error "GET_BUSINESS_SYSTEM_ERROR" for Consumer Proxy calls | ||
| + | * Nota 2033184 - How to create Logical Port manually for a Service Consumer in SOAMANAGER [Video] | ||
| + | * Nota 1791729 - WDA FileUpload error: "Error when uploading; the file name is invalid or the file is too large" | ||
| + | * Nota 2322379 - How to create payload trace using SRT_UTIL in AS ABAP | ||
| + | * Nota 2368112 - Outgoing HTTPS connection does not work in AS ABAP | ||
| + | * Nota 2388992 - WSDL parsing error: Exception in library handler | ||
| + | * Nota 2508091 - Web Services ABAP: Error "Element is missing" CX_ST_GROUP_MISSING_CASE | ||
| + | * Nota 2553979 - SOAP Web Services ABAP - Guided Answers | ||
| + | |||
| + | ==Varios== | ||
| + | clase CL_GUI_HTML_VIEWER método SHOW_URL para ver URL | ||
Latest revision as of 23:31, 27 April 2026
Contents
Ejemplo HTTP_CLIENT
Ejemplo con SOAP
*URL https://qa.sapwiki.cl:443/polosur/DLEApi.php
*NAMESPACE https://qa.sapwiki.cl/polosur/
*HOST qa.sapwiki.cl
*SOAP ACTION https://qa.sapwiki.cl/polosur/CargarDocumento
*----------------------------------------------------------------------*
* FORM http_client
*----------------------------------------------------------------------*
* basado en programa RSWF_TEST_HTTP
*----------------------------------------------------------------------*
* --> p_url Ej.: https://qa.sapwiki.cl:443/polosur/DLEApi.php
* --> p_soap String <soapenv:Envelope...</soapenv:Envelope>
* --> p_soap_action Parámetro SOAPAction:
* --> p_host Parámetro Host:
* <-- p2 text
*----------------------------------------------------------------------*
FORM http_client USING p_url
p_soap
p_soap_action
p_host
CHANGING p_subrc
p_msg
p_response.
TYPE-POOLS: swfxc, icon.
DATA: l_http_client TYPE REF TO if_http_client.
DATA: l_url TYPE string.
DATA: l_code TYPE sy-subrc.
DATA: l_code_string TYPE string.
DATA: l_message_string TYPE string.
DATA: lt_http_fields TYPE tihttpnvp.
DATA: l_http_field_wa TYPE ihttpnvp.
DATA: l_char_header(40) TYPE c.
DATA: l_body_string TYPE string.
*-----------------------------------------------------------------------
*- Create the HTTP-Client
*-----------------------------------------------------------------------
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = p_url
* PROXY_HOST = l_proxy_host
* PROXY_SERVICE = l_proxy_service
ssl_id = 'ANONYM'
IMPORTING
client = l_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
* into l_message_string.
IF l_message_string IS INITIAL.
l_message_string = 'Error creating HTTP-Client'. "#EC NOTEXT
ENDIF.
* WRITE: / icon_red_light AS ICON.
* PERFORM print_string USING l_message_string.
p_msg = l_message_string.
p_subrc = 9.
EXIT.
ENDIF.
*--------------------------------------------------------------------*
* HEADER
*--------------------------------------------------------------------*
* CALL METHOD l_http_client->request->set_header_field
* EXPORTING
* name = '~request_method'
* value = 'POST'.
DATA(l_bytes) = strlen( p_soap ).
DATA l_content_length TYPE string.
MOVE l_bytes TO l_content_length.
CONDENSE l_content_length.
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'Accept-Encoding'
value = 'gzip,deflate'. "#EC NOTEXT
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'Content-Type'
value = 'text/xml;charset=UTF-8'. "#EC NOTEXT
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'SOAPAction'
value = p_soap_action. "#EC NOTEXT "'"https://qa.sapwiki.cl/polosur/CargarDocumento"'.
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'Host'
value = p_host. "#EC NOTEXT "'qa.sapwiki.cl'.
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'Connection'
value = 'Keep-Alive'. "#EC NOTEXT
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'User-Agent'
value = 'SAP NetWeaver Application Server (1.0;740)'. "#EC NOTEXT
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'Content-Length'
value = l_content_length. "#EC NOTEXT "'30000'.
*--------------------------------------------------------------------*
* soapenvelope
* string <soapenv:Envelope...</soapenv:Envelope>
*--------------------------------------------------------------------*
CALL METHOD l_http_client->request->set_cdata
EXPORTING
data = p_soap.
* offset = 0
* length = '19000'.
** copiado de CL_SOAP_HTTP_TPBND_ROOT=======CM01V
** provide the compression settings to the HTTP client object
** a) compress request
* IF 1 = 1. "m_compress_request EQ tsrtp_f_bdg_compress_true.
* CALL METHOD l_http_client->set_compression
* EXPORTING
* options = if_http_client=>co_compress_in_all_cases
* EXCEPTIONS
* compression_not_possible = 1. "#EC *
** ignore this exception to have the same behaviour as for clients created
** via sm59-destination: for this clients the method set_compression is
** called within the method SEND without exception handling!
* ENDIF.
*
*
** b) compress response
* IF 1 = 1 ."m_compress_response EQ tsrtp_f_bdg_compress_true.
* l_http_client->propertytype_accept_compress = if_http_client=>co_enabled.
* ELSE.
** m_client->propertytype_accept_compress = if_http_client=>co_disabled.
* ENDIF.
*
** according to RFC2612, section 10.3. (10.3.2, 10.3.3, 10.3.8)
** the HTTP client is not allowed to follow an redirect automatically
** for methods other than HEAD and GET => prevent this for WS calls
** NOTE: prevent the redirect also for PING functionalty although HEAD is
** used in this case in order to get an reliable PING-result
* l_http_client->propertytype_redirect = if_http_client=>co_disabled.
*-----------------------------------------------------------------------
*- send the http post
*-----------------------------------------------------------------------
CALL METHOD l_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
* WRITE: / icon_red_light AS ICON.
CALL METHOD l_http_client->get_last_error
IMPORTING
code = l_code
message = l_message_string.
CALL METHOD l_http_client->close.
l_code_string = l_code.
CONCATENATE 'HTTP-Send: RC=' l_code_string "#EC NOTEXT
INTO l_code_string .
CONCATENATE l_code_string l_message_string
INTO l_message_string SEPARATED BY space.
* PERFORM print_string USING l_message_string.
p_msg = l_message_string.
p_subrc = 8.
EXIT.
ENDIF.
*-----------------------------------------------------------------------
*- receive the result of http post
*-----------------------------------------------------------------------
CALL METHOD l_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
* WRITE: / icon_red_light AS ICON.
CALL METHOD l_http_client->get_last_error
IMPORTING
code = l_code
message = l_message_string.
CALL METHOD l_http_client->close.
l_code_string = l_code.
CONCATENATE 'HTTP-Receive: RC=' l_code_string "#EC NOTEXT
INTO l_code_string .
CONCATENATE l_code_string l_message_string
INTO l_message_string SEPARATED BY space.
* PERFORM print_string USING l_message_string.
p_msg = l_message_string.
p_subrc = 7.
EXIT.
ENDIF.
*-----------------------------------------------------------------------
*- print the results
*-----------------------------------------------------------------------
CALL METHOD l_http_client->response->get_status
IMPORTING
code = l_code.
IF l_code < 300.
* HTTP-codes: 100 - 199 = informations
* HTTP-codes: 200 - 299 = client-request successful (200 = OK)
* WRITE: / icon_green_light AS ICON.
p_subrc = 0.
ELSE.
* HTTP-codes: 300 - 399 = redirected; further actions required
* HTTP-codes: 400 - 499 = client-request incomplete
* HTTP-codes: 500 - 599 = server errors
* WRITE: / icon_red_light AS ICON.
* IF l_code BETWEEN 300 AND 399.
* p_msg = 'Redirected; further actions required'. "#EC NOTEXT
* ELSEIF l_code BETWEEN 400 AND 499.
* p_msg = 'Client-request incomplete'. "#EC NOTEXT
* ELSE.
* p_msg = 'Server errors'. "#EC NOTEXT
* ENDIF.
*
* p_msg = |Web Service: Error { l_code } { p_msg }|. "#EC NOTEXT
p_subrc = 6.
ENDIF.
*-- get the http header fields
* CALL METHOD l_http_client->response->get_header_fields
* CHANGING
* fields = lt_http_fields.
* LOOP AT lt_http_fields INTO l_http_field_wa.
* l_char_header = l_http_field_wa-name.
* WRITE: / l_char_header.
* l_char_header = l_http_field_wa-value.
* WRITE: l_char_header.
* ENDLOOP.
* WRITE: / sy-uline.
*- get the body
IF p_subrc = 0.
l_body_string = l_http_client->response->get_cdata( ).
* PERFORM print_string USING l_body_string.
p_response = l_body_string.
ELSE.
*-- get the http header fields
CALL METHOD l_http_client->response->get_header_fields
CHANGING
fields = lt_http_fields.
LOOP AT lt_http_fields INTO l_http_field_wa.
p_msg = |Webservice: Error { l_http_field_wa-value }|.
EXIT.
ENDLOOP.
ENDIF.
ENDFORM.
Ejemplo con POST
METHOD http_client.
TYPE-POOLS: swfxc, icon.
DATA: l_http_client TYPE REF TO if_http_client.
DATA: l_url TYPE string.
DATA: l_code TYPE sy-subrc.
DATA: l_code_string TYPE string.
DATA: l_message_string TYPE string.
DATA: lt_http_fields TYPE tihttpnvp.
DATA: l_http_field_wa TYPE ihttpnvp.
DATA: l_char_header(40) TYPE c.
DATA: l_body_string TYPE string.
*-----------------------------------------------------------------------
*- Create the HTTP-Client
*-----------------------------------------------------------------------
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = i_url
* PROXY_HOST = l_proxy_host
* PROXY_SERVICE = l_proxy_service
ssl_id = 'ANONYM'
IMPORTING
client = l_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
* into l_message_string.
IF l_message_string IS INITIAL.
l_message_string = 'Error creating HTTP-Client'. "#EC NOTEXT
ENDIF.
* WRITE: / icon_red_light AS ICON.
* PERFORM print_string USING l_message_string.
e_msg = l_message_string.
e_subrc = 9.
EXIT.
ENDIF.
*--------------------------------------------------------------------*
* HEADER
*--------------------------------------------------------------------*
* l_http_client->request->set_method( 'POST' ).
l_http_client->request->set_method( i_method ).
* l_http_client->request->set_content_type( 'application/json' ).
IF i_content_type IS NOT INITIAL.
l_http_client->request->set_content_type( i_content_type ).
ENDIF.
IF i_x_api_key IS SUPPLIED.
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = i_x_api_key
value = i_api_key. "#EC NOTEXT
ELSE.
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'X-API-KEY'
value = i_api_key. "#EC NOTEXT
ENDIF.
IF i_content_type IS NOT INITIAL.
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = 'Content-Type'
value = 'application/json'. "#EC NOTEXT
ENDIF.
*--------------------------------------------------------------------*
* soapenvelope
* string <soapenv:Envelope...</soapenv:Envelope>
*--------------------------------------------------------------------*
IF i_body IS SUPPLIED.
CALL METHOD l_http_client->request->set_cdata
EXPORTING
data = i_body.
ENDIF.
* offset = 0
* length = '19000'.
** copiado de CL_SOAP_HTTP_TPBND_ROOT=======CM01V
** provide the compression settings to the HTTP client object
** a) compress request
* IF 1 = 1. "m_compress_request EQ tsrtp_f_bdg_compress_true.
* CALL METHOD l_http_client->set_compression
* EXPORTING
* options = if_http_client=>co_compress_in_all_cases
* EXCEPTIONS
* compression_not_possible = 1. "#EC *
** ignore this exception to have the same behaviour as for clients created
** via sm59-destination: for this clients the method set_compression is
** called within the method SEND without exception handling!
* ENDIF.
*
*
** b) compress response
* IF 1 = 1 ."m_compress_response EQ tsrtp_f_bdg_compress_true.
* l_http_client->propertytype_accept_compress = if_http_client=>co_enabled.
* ELSE.
** m_client->propertytype_accept_compress = if_http_client=>co_disabled.
* ENDIF.
*
** according to RFC2612, section 10.3. (10.3.2, 10.3.3, 10.3.8)
** the HTTP client is not allowed to follow an redirect automatically
** for methods other than HEAD and GET => prevent this for WS calls
** NOTE: prevent the redirect also for PING functionalty although HEAD is
** used in this case in order to get an reliable PING-result
* l_http_client->propertytype_redirect = if_http_client=>co_disabled.
*-----------------------------------------------------------------------
*- send the http post
*-----------------------------------------------------------------------
CALL METHOD l_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
* WRITE: / icon_red_light AS ICON.
CALL METHOD l_http_client->get_last_error
IMPORTING
code = l_code
message = l_message_string.
CALL METHOD l_http_client->close.
l_code_string = l_code.
CONCATENATE 'HTTP-Send: RC=' l_code_string "#EC NOTEXT
INTO l_code_string .
CONCATENATE l_code_string l_message_string
INTO l_message_string SEPARATED BY space.
* PERFORM print_string USING l_message_string.
e_msg = l_message_string.
e_subrc = 8.
EXIT.
ENDIF.
*-----------------------------------------------------------------------
*- receive the result of http post
*-----------------------------------------------------------------------
CALL METHOD l_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
* WRITE: / icon_red_light AS ICON.
CALL METHOD l_http_client->get_last_error
IMPORTING
code = l_code
message = l_message_string.
CALL METHOD l_http_client->close.
l_code_string = l_code.
CONCATENATE 'HTTP-Receive: RC=' l_code_string "#EC NOTEXT
INTO l_code_string .
CONCATENATE l_code_string l_message_string
INTO l_message_string SEPARATED BY space.
* PERFORM print_string USING l_message_string.
e_msg = l_message_string.
e_subrc = 7.
EXIT.
ENDIF.
*-----------------------------------------------------------------------
*- print the results
*-----------------------------------------------------------------------
CALL METHOD l_http_client->response->get_status
IMPORTING
code = l_code.
IF l_code < 300 OR l_code = 400. "bad request
* HTTP-codes: 100 - 199 = informations
* HTTP-codes: 200 - 299 = client-request successful (200 = OK)
* WRITE: / icon_green_light AS ICON.
e_subrc = 0.
ELSE.
* HTTP-codes: 300 - 399 = redirected; further actions required
* HTTP-codes: 400 - 499 = client-request incomplete
* HTTP-codes: 500 - 599 = server errors
* WRITE: / icon_red_light AS ICON.
* IF l_code BETWEEN 300 AND 399.
* p_msg = 'Redirected; further actions required'. "#EC NOTEXT
* ELSEIF l_code BETWEEN 400 AND 499.
* p_msg = 'Client-request incomplete'. "#EC NOTEXT
* ELSE.
* p_msg = 'Server errors'. "#EC NOTEXT
* ENDIF.
*
* p_msg = |Cloudsigner: Error { l_code } { p_msg }|. "#EC NOTEXT
e_subrc = 6.
ENDIF.
*-- get the http header fields
* CALL METHOD l_http_client->response->get_header_fields
* CHANGING
* fields = lt_http_fields.
* LOOP AT lt_http_fields INTO l_http_field_wa.
* l_char_header = l_http_field_wa-name.
* WRITE: / l_char_header.
* l_char_header = l_http_field_wa-value.
* WRITE: l_char_header.
* ENDLOOP.
* WRITE: / sy-uline.
*- get the body
IF e_subrc = 0.
l_body_string = l_http_client->response->get_cdata( ).
* PERFORM print_string USING l_body_string.
e_response = l_body_string.
ELSE.
*-- get the http header fields
CALL METHOD l_http_client->response->get_header_fields
CHANGING
fields = lt_http_fields.
LOOP AT lt_http_fields INTO l_http_field_wa.
e_msg = |Acepta: Error { l_http_field_wa-value }|.
EXIT.
ENDLOOP.
ENDIF.
ENDMETHOD.
Ejemplo con GET y obtener PDF (binario)
METHOD http_client.
TYPE-POOLS: swfxc, icon.
DATA: l_http_client TYPE REF TO if_http_client.
DATA: l_url TYPE string.
DATA: l_code TYPE sy-subrc.
DATA: l_code_string TYPE string.
DATA: l_message_string TYPE string.
DATA: lt_http_fields TYPE tihttpnvp.
DATA: l_http_field_wa TYPE ihttpnvp.
DATA: l_char_header(40) TYPE c.
DATA: l_body_string TYPE string.
DATA: l_body_xstring TYPE xstring.
*-----------------------------------------------------------------------
*- Create the HTTP-Client
*-----------------------------------------------------------------------
DATA ssl_id TYPE ssfapplssl.
ssl_id = 'ANONYM'.
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = i_url
ssl_id = ssl_id "'ANONYM'
IMPORTING
client = l_http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc <> 0.
IF l_message_string IS INITIAL.
l_message_string = 'Error creating HTTP-Client'. "#EC NOTEXT
ENDIF.
e_msg = l_message_string.
e_subrc = 9.
EXIT.
ENDIF.
*--------------------------------------------------------------------*
* HEADER
*--------------------------------------------------------------------*
IF i_method IS NOT INITIAL.
l_http_client->request->set_method( i_method ).
ENDIF.
IF i_content_type IS NOT INITIAL.
l_http_client->request->set_content_type( i_content_type ).
ENDIF.
IF i_api_key_key IS NOT INITIAL.
CALL METHOD l_http_client->request->set_header_field
EXPORTING
name = i_api_key_key
value = i_api_key_value. "#EC NOTEXT
ENDIF.
*--------------------------------------------------------------------*
* soapenvelope
* string <soapenv:Envelope...</soapenv:Envelope>
*--------------------------------------------------------------------*
IF i_body IS SUPPLIED.
CALL METHOD l_http_client->request->set_cdata
EXPORTING
data = i_body.
ENDIF.
*-----------------------------------------------------------------------
*- send the http post
*-----------------------------------------------------------------------
CALL METHOD l_http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
CALL METHOD l_http_client->get_last_error
IMPORTING
code = l_code
message = l_message_string.
CALL METHOD l_http_client->close.
l_code_string = l_code.
CONCATENATE 'HTTP-Send: RC=' l_code_string "#EC NOTEXT
INTO l_code_string .
CONCATENATE l_code_string l_message_string
INTO l_message_string SEPARATED BY space.
e_msg = l_message_string.
e_subrc = 8.
EXIT.
ENDIF.
*-----------------------------------------------------------------------
*- receive the result of http post
*-----------------------------------------------------------------------
CALL METHOD l_http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
IF sy-subrc <> 0.
CALL METHOD l_http_client->get_last_error
IMPORTING
code = l_code
message = l_message_string.
CALL METHOD l_http_client->close.
l_code_string = l_code.
CONCATENATE 'HTTP-Receive: RC=' l_code_string "#EC NOTEXT
INTO l_code_string .
CONCATENATE l_code_string l_message_string
INTO l_message_string SEPARATED BY space.
e_msg = l_message_string.
e_subrc = 7.
EXIT.
ENDIF.
*-----------------------------------------------------------------------
*- print the results
*-----------------------------------------------------------------------
CALL METHOD l_http_client->response->get_status
IMPORTING
code = l_code.
IF l_code < 300 OR l_code = 400. "bad request
* HTTP-codes: 100 - 199 = informations
* HTTP-codes: 200 - 299 = client-request successful (200 = OK)
* WRITE: / icon_green_light AS ICON.
e_subrc = 0.
ELSE.
* HTTP-codes: 300 - 399 = redirected; further actions required
* HTTP-codes: 400 - 499 = client-request incomplete
* HTTP-codes: 500 - 599 = server errors
e_subrc = 6.
ENDIF.
*- get the body
IF e_subrc = 0.
l_body_xstring = l_http_client->response->get_data( ).
e_xresponse = l_body_xstring.
ELSE.
*-- get the http header fields
CALL METHOD l_http_client->response->get_header_fields
CHANGING
fields = lt_http_fields.
LOOP AT lt_http_fields INTO l_http_field_wa.
e_msg = |Error { l_http_field_wa-value }|.
EXIT.
ENDLOOP.
ENDIF.
ENDMETHOD.
CALL METHOD zcl_obtener_documento=>http_client
EXPORTING
i_url = l_url "https://www.sapwiki.cl/documentos/ObtenerDocumento/Id=12345678'.
* i_body =
i_api_key_key = l_api_key_key
i_api_key_value = l_api_key_value
i_method = 'GET'
i_content_type = l_content_type "space
IMPORTING
e_msg = e_msg
e_xresponse = e_xdocumento
e_subrc = e_subrc.
agregar parámetros a URL
Ejemplo: programa RWPM_TEST_RE_SERVICES
lv_querystring = ls_adapter_url-url. "/sap/xi/adapter_plain
* construct additional query part to call plain adapter correctly
CALL METHOD lr_http_client->append_field_url
EXPORTING
name = 'namespace'
value = lv_namespace
CHANGING
url = lv_querystring.
CALL METHOD lr_http_client->append_field_url
EXPORTING
name = 'interface'
value = lv_interface
CHANGING
url = lv_querystring.
...
...
...
"/sap/xi/adapter_plain?namespace=http%3a%2f%2fsap.com%2fxi%2fEA-RETAIL%2fGlobal2&interface=RetailEventReplicationRequest_In&service= AF76047&sap-client=400&QOS=EO&msgguid=0022484C16541FD0AAF7645221979ECE
* add querystring to URL
CALL METHOD cl_http_utility=>set_request_uri
EXPORTING
request = lr_http_client->request
uri = lv_querystring.
Llamada a proxy client
* proxy client
DATA: lo_proxy TYPE REF TO zhcm_co_si_os_carga_documento,
ls_output TYPE zhcm_mt_carga_documento,
ls_input TYPE zhcm_mt_respuesta_documento,
lo_system_ex TYPE REF TO cx_ai_system_fault,
lo_app_ex TYPE REF TO cx_ai_application_fault.
*do something
*.....
*
TRY.
* create proxy
CREATE OBJECT lo_proxy.
CALL METHOD lo_proxy->si_os_carga_documento
EXPORTING
output = ls_output
IMPORTING
input = ls_input.
CATCH cx_ai_system_fault INTO lo_system_ex.
* WRITE lo_system_ex->errortext TO msg.
* msg = lo_system_ex->if_message~get_text( ).
CATCH cx_ai_application_fault INTO lo_app_ex.
* WRITE lo_app_ex->textid TO msg.
* msg = lo_app_ex->if_message~get_text( ).
ENDTRY.
IF lo_system_ex IS NOT INITIAL.
e_message = lo_system_ex->if_message~get_text( ).
e_subrc = 1.
RETURN.
ENDIF.
IF lo_app_ex IS NOT INITIAL.
e_message = lo_app_ex->if_message~get_text( ).
e_subrc = 2.
RETURN.
ENDIF.
clase cl_abap_browser=>show_url
DATA: lv_title TYPE cl_abap_browser=>title,
lv_url TYPE string.
PARAMETERS p_url TYPE string OBLIGATORY LOWER CASE.
*--------------------------------------------------------------------*
INITIALIZATION.
*--------------------------------------------------------------------*
p_url = 'https://homer.sii.cl/'.
lv_title = 'example'.
START-OF-SELECTION.
CALL METHOD cl_abap_browser=>show_url
EXPORTING
url = p_url
title = lv_title
size = cl_abap_browser=>xlarge
* modal = iv_sapgui_show_in_dialog
buttons = cl_abap_browser=>navigate_off
format = cl_abap_browser=>landscape
position = cl_abap_browser=>topleft
context_menu = abap_true.
Notas PROXY
- SRT_UTIL tran. log de llamada proxy
- Tabla SPROXXSL : relación entre proxy & XSLT hay que concatenar /1SAI/TXS & NAME e ir a la XSLT_TOOL
- Si en llamada a proxy da error de deserialization, poner break en CL_SXMLP_DATA_ST==============CM004 línea 26
- RSSIDL_DESERIALIZE_DEMO verificar WSDL, ver nota Ver nota 1801866 - Proxy generation terminated: Incorrect value: Unknown Type Reference
- Test conexión HTML, reporte RSWF_TEST_HTTP
- LOG ICM : transacción SMICM, en menú: Pasar a -->Fichero trace-->Visualizar todo
- Configuración Proxy : transacción SICF
- Trn. STRUST Instalar certificados
- error failed: NIECONN_REFUSED(-10) - error de conexión al tratar de conectarse al servicio, se puede verificar con el programa
RSWF_TEST_HTTP o vía browser si se cuenta con vpn
The SAP error NIECONN_REFUSED(-10) indicates that the network layer (SAP NiLib) was unable to establish a connection to the target host and port. This is a "Connection Refused" error, typically occurring at the OS or network level before the SAP application can even begin the handshake
- Nota 2469949 - "ICF Error when creating HTTP client object by Config for URL" in Web Services ABAP
- Nota 2334940 - B2A: Troubleshooting HTTPS for communication with health insurance funds
- Nota 1714792 - Proxy generation terminated: Message must have exactly one part
- Nota 1817447 - Error "GET_BUSINESS_SYSTEM_ERROR" for Consumer Proxy calls
- Nota 2033184 - How to create Logical Port manually for a Service Consumer in SOAMANAGER [Video]
- Nota 1791729 - WDA FileUpload error: "Error when uploading; the file name is invalid or the file is too large"
- Nota 2322379 - How to create payload trace using SRT_UTIL in AS ABAP
- Nota 2368112 - Outgoing HTTPS connection does not work in AS ABAP
- Nota 2388992 - WSDL parsing error: Exception in library handler
- Nota 2508091 - Web Services ABAP: Error "Element is missing" CX_ST_GROUP_MISSING_CASE
- Nota 2553979 - SOAP Web Services ABAP - Guided Answers
Varios
clase CL_GUI_HTML_VIEWER método SHOW_URL para ver URL