Inicio > Abap > Consumir Webservice con SAP / ABAP

Consumir Webservice con SAP / ABAP

Miércoles, 18 de marzo de 2009 Nessy Dejar un comentario Ir a comentarios

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'.

Share and Enjoy:
  • email
  • Google Bookmarks
  • Live
  • Facebook
  • Technorati
  • TwitThis
  • Pownce
  1. Daniel
    Domingo, 18 de octubre de 2009 a las 15:49 | #1

    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

  2. Lunes, 19 de octubre de 2009 a las 20:20 | #2

    @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 …’.

  3. juanca
    Miércoles, 6 de enero de 2010 a las 09:44 | #3

    Si quiere consumir un webservice hecho en SAP, sería igual?

  4. Mario
    Lunes, 29 de marzo de 2010 a las 15:26 | #4

    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!

  5. Miércoles, 31 de marzo de 2010 a las 14:32 | #5

    No conozco el consumo de un Webservice del lado de SAP. Pero si este respesta los estandares de SOAP, seria lo mismo.

  6. Miércoles, 31 de marzo de 2010 a las 14:45 | #6

    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.

  7. anpiz
    Domingo, 29 de agosto de 2010 a las 22:41 | #7

    Hola:
    ¿Como puedo enviar el SOAP ENVELOPE desde ABAP?

  8. RAfa
    Jueves, 28 de octubre de 2010 a las 13:59 | #8

    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.

  9. Miguel
    Jueves, 3 de noviembre de 2011 a las 12:35 | #9

    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??

  10. vertiz
    Miércoles, 16 de noviembre de 2011 a las 16:23 | #10

    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.

  11. Miércoles, 16 de noviembre de 2011 a las 16:28 | #11

    Hola Miguel,

    Efectivamente, puede ser WS o solo información con POST y GET.

  12. vertiz
    Miércoles, 16 de noviembre de 2011 a las 20:05 | #12

    alguien tendra alguna solucion o podría explicarme por favor llevo unos dias investigando i nada :(

  13. Lecto
    Viernes, 13 de enero de 2012 a las 14:04 | #13

    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.

  14. zenytt
    Viernes, 9 de marzo de 2012 a las 12:08 | #14

    Una pregunta sobre este tema… construi un ws en genexus X y quiero consumirlo en SAP de esta manera (no con los objetos proxy y eso, puesto que la informacion de ip y aplicacion donde lo voy a consumir en genexus lo saco de unas tablas, o sea que a priori no los puedo saber) … este WS graba algunas cosas en las tablas de la aplicacion genexus y devuelve a ABAP un codigo de error, un mensaje y alguna cosa mas

    para hacerlo con metodo POST, como tengo que configurar GX y/o ABAP? hasta ahora no logre que llegue o devuelva nada

    para hacerlo con metodo GET, logre que llegaran las cosas a GX y las grabe, pero no logro devolver nada…

    alguien tiene idea como realizar estas cosas???

    saludos y gracias!

  1. Sin trackbacks aún.