Consumir Webservice con SAP / ABAP
Un ejemplo simple de como consumir Webservice (hecho en .NET) con SAP / ABAP, ya que los ejemplos encontrados en la web en general no me resultaron muy didáctico.
El Webservice a titulo de ejemplo tiene los sigientes parametros: title y details.
REPORT zwebconsume.
DATA: http_client TYPE REF TO if_http_client .
DATA: w_string TYPE string ,
w_result TYPE string ,
r_str TYPE string .
DATA: result_tab TYPE TABLE OF string.
START-OF-SELECTION .
CLEAR w_string .
w_string = 'http://urlhost/Logs/main.asmx/SetLog'.
CALL METHOD cl_http_client=>create_by_url
EXPORTING
url = w_string
IMPORTING
client = http_client
EXCEPTIONS
argument_not_found = 1
plugin_not_active = 2
internal_error = 3
OTHERS = 4.
CALL METHOD HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = '~request_method'
VALUE = 'POST'.
CALL METHOD http_client->REQUEST->SET_FORM_FIELD
EXPORTING
NAME = 'title'
VALUE = 'Mail sistema'.
CALL METHOD http_client->REQUEST->SET_FORM_FIELD
EXPORTING
NAME = 'details'
VALUE = 'Funcion 1234'.
CALL METHOD http_client->send
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2.
CALL METHOD http_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
CLEAR w_result .
w_result = http_client->response->get_cdata( ).
REFRESH result_tab .
SPLIT w_result AT cl_abap_char_utilities=>cr_lf INTO TABLE
result_tab .
READ TABLE result_tab INTO r_str INDEX 2.
Lo que hay que tener en cuenta es que el envio de parametros se efectua con REQUEST->SET_FORM_FIELD y no con REQUEST->SET_DATA ya que este es para enviar todo el encabezado.
Tambien la invocación siguiente es para pasar los parametros por el metodo POST:
CALL METHOD HTTP_CLIENT->REQUEST->SET_HEADER_FIELD
EXPORTING
NAME = '~request_method'
VALUE = 'POST'.
Hola Francisco,
Gracias por el articulo.
El web service al que haces referncia esta construido en .NET y tiene 2 parametros de entrada claros.
El web service al que quiero llamar tiene la siguiente URL
http://sas-d.sermepa.es/TPV_PC/services/SerClsWSPeticionSOAP
y el XML que quiero enviar a esta URL es el siguiente
<![CDATA[
5410080008888005
1212
123
840
0.50
309571370
1
FAC-0001
PAGO
20091016 140000
0a355912412f858ec52cfb5634967146c2c7a8e0
]]>
Como lo pasaria segun tus llamadas??
Muchas gracias
Daniel
@Daniel Hola Daniel, gracias por tu comentario, no veo el XML en tu comentario porque seguro que el WordPress lo saco. En mi caso yo no enviaría XML como parámetros sino simple valores texto o en de ultima en formato JSON.
En todo caso si puedo ayudar con indicarte en tu caso que reemplaze la linea:
w_string = ‘http://urlhost/Logs/main.asmx/SetLog'.
por
w_string = ‘http://sas-d.sermepa.es/TPV_PC/services/SerClsWSPeticionSOAP'.
El parametros en cuestion seria el XML como un parametro texto llamado “xmlData” de la siguiente forma:
CALL METHOD http_client->REQUEST->SET_FORM_FIELD
EXPORTING
NAME = ‘xmlData’
VALUE = ‘… aca iria el xml en formato texto …’.
Si quiere consumir un webservice hecho en SAP, sería igual?
Hola Francisco, si yo quiero consumir un webservice al momento de grabar una factura, y enviar como parametro el folio que se acaba de grabar, como podría hacerlo? muchas gracias!
No conozco el consumo de un Webservice del lado de SAP. Pero si este respesta los estandares de SOAP, seria lo mismo.
Hola Mario, para enviar una imagen, conviene que el cliente que consume el Webservice envie ese parámetro en un Array de Bytes para eso te sugiero que el cliente sea una aplicación ejecutable.
Hola:
¿Como puedo enviar el SOAP ENVELOPE desde ABAP?
Hola.
Consulta: todos los web services mencionados como ejemplo me han venido funcionando pues tiene declarado en el web.config, u otro similar, que hagan uso de protocolos get y post.
Pero cuando se trata de un WS que no tiene declarado uno de éstos modos, entonces no me funciona tu código.
Cómo podría resolverse esto?
Quizá esté omitiendo algo
Gracias.
Hola,
Muy interesante tu publicación, mas tengo una duda, tengo un sistema legacy el cual me pregunta si es necesario crear el WS o si solo puede enviarme la información usando POST y GET, esto es posible??
Hola Francisco fijate que he estado usando tu ejemplo para consumir un Web service, sin embargo en la funcion
*Obtiene Respuesta del WebService
CALL METHOD v_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3.
Me regresa un Erro de Comunicación que es el siguiente
HTTPIO_PLG_CANCELED
110
Podras ayudarme como corregir este error o a que se deba :(
te lo agradezco muchisimo por tu atención.
Hola Miguel,
Efectivamente, puede ser WS o solo información con POST y GET.
alguien tendra alguna solucion o podría explicarme por favor llevo unos dias investigando i nada :(
Hola.
Recuerden que SOAP es un protocolo, que para funcionar es necesario el intercambio estándar de mensajes XML. Esto que significa, que para consumir un servicio web bastará con enviar una petición POST HTTP con el mensaje SOAP, que es lo que conocemos como envoltura, el formato es estandar y definirá el proxy, la operación y los parámetros de la misma. El servidor WSDL nos retornará otro mensaje XML, será este el que nosotros debemos interpretar.
Lo que el autor expone aquí trata de un método RAW, si así lo quieren llamar, la idea es que ustedes construyan todo el mensaje y lo lean manualmente. Funciona. Pero si quieren algo más al estilo SAP y estandar, pueden usar la transacción SOAMANAGER para generar la clase proxy que podrán usar en su código ABAP directamente.