Consumo Web Service (WS) desde SAP ABAP (Gateway)

sap-abap
Etiquetas: #<Tag:0x00007f43548814d8>

#1

Buenas tardes a todos,

estoy investigando acerca de los WS y tengo un par de dudas, a ver si me podéis ayudar, :smile:

Resulta que tengo la URL (wsdl) de un WS (Este web service se ha realizado con JAVA) y quiero consumir dicho servicio en SAP GATEWAY

He estado buscando posibles opciones para su consumo y he encontrado varias soluciones:

OPCIÓN 1.- Creando un Service Consumer (cliente proxy): Esta opción la he probado y funciona siguiendo estos pasos:
ht_tp://www.sapdev.co.uk/sap-webapps/sap-webservices/ws_abapproxy.htm

Duda acerca de esta opción: En el paso de crear un puerto Logico, nos dice que pongamos como “logical port” uno definido por nosotros o introducir “CURR_CONV_XMETHODS” por defecto. En mi caso he introducido “CURR_CONV_XMETHODS” y todo ok…mi duda es si se puede usar este puerto lógico para cualquier caso o es mejor crear uno personalizado.

Adjunto captura del paso concreto:

OPCIÓN 2.- Creando una clase pública con la superclase CL_PROXY_CLIENT. Esta opción no la he investigado a fondo.

OPCIÓN 3.- Usar método lo_http_client para llamar al WSDL: Tampoco he investigado a fondo esta opción.

Bueno, me gustaría saber cual sería la opción recomendada y también saber un poco más acerca de la duda del Puerto Lógico (si se puede usar uno por defecto o crear uno personalizado).

Muchas gracias!!

Un saludo,
Rafa.


#2

Hola @rafbercar,
Nosotros nos hemos tenido que pelear bastante con ws y el link (que por cierto creo que no deberías hacerlo navegable por problemas con robots etc, pon mejor ht_p o algo así) que mencionas era la forma antigua de crear un proxy para consumir un ws.

Puedes hacer los pasos 1 y 2 del link.
3. Pero en el paso 3 debes ir a la transacción SOAMANAGER
4. Después de logarte, ves a la segunda pestaña (Business Administration)
5. Pinchar en link Web Service Administration
6. Para buscar el proxy que ya has definido en la SE80, puedes poner en search by “Cosumer proxy” y en el search pattern algo así como Z*currency_convert y das al "go"
7. Seleccionas en la primera columna tu proxy y pinchas en botón "Apply selection"
8. Por defecto aparece seleccionada abajo la pestaña “Overview”. Vas a la segunda pestaña Configurations.
9. Pulsa botón "Create logic port"
10. Pon el nombre de tu puerta lógica, por ejemplo: ZLP_Currency_convert y pincha por defecto “Logic port y default” porque luego en el código te va a facilitar la vida porque no te hará falta recordar el nombre que le habías dado. Asegurate de tener pinchado WSDL based configuration, Via HTTP Access y pon la url que te han pasado (acabada en ?wsdl)
11. Si todo está bien se creará una puerta lógica.
12. En tu código debes definir una data lv_lp type ref to "nombre de ws"
13. créate object lv_lp (entre try end try). Si no le hubieras puesto puerta lógica por defecto ahora le tendrías que pasar al constructor el nombre de tu puerta lógica entre comillas.
14. Para usar el proxy (invocar al ws externo) solo debes ahora hacer un call method a lv_lp->“método del ws” (Recuerda haber creado los parámetros input y output para el call method)

Espero que te sirva. Cualquier cosa me dices.


#3

Muchas gracias @Salco!!

Esta todo muy bien explicado, :smiley:. Mañana seguiré los pasos a ver si hay suerte.

En el caso de la Tx: SOAMANAGER, en uno de los sistemas tengo problemas porque no puedo acceder a ella (de ahí que tenga que utilizar la Tx. obsoleta PLCONFIG para crear el puerto lógico).

Ya te diré si todo va bien…de todas formas muchas gracias por la ayuda!

Un saludo,
Rafa.


#4

¿sabes quien tiene acceso de tus compañeros? Si no tienes y no te van a dar acceso, pues que la puerta la configure el encargado de ello, así menos trabajo para ti :slight_smile:


#5

jejeje, pues lo preguntare @Salco, :smile:

Gracias de nuevo!!

Un saludo,
Rafa.


#6

Buenas tardes,

me gustaría actualizar el estado del post para futuros casos, :). Al final, despues de esperar al Dpto. de Ingeniería para que creara la Puerta Lógica y, gracias a los consejos de @Salco, todo ha ido sobre ruedas,jeje. Actualizo los datos seguidos en SAP Gateway:

  • Creación de un Cliente Proxy (Service Consumer): Tx: SPROXY -> New Object -> Service Consumer…
  • Creación de puerta Lógica para cliente Proxy: Tx: SOAMANAGER -> Web Service Configuration:
    * Buscamos nuestro Cliente Proxy y pulsamos sobre él.
    * Creamos puerta lógica, con los siguientes datos:
    • El nombre del Proxy: “nombreElegidoClienteProxy”
    • El nombre del puerto que hay que añadir: “ZLP_NOMBRE_PUERTO”
    • La descripción del puerto: “descripcion”
    • El sistema: “sistema_gateway”
    • La URL: “URL del servicio terminado en ?wsdl”
    • Puerto por defecto (Si/No): Si
  • Implementación del codigo en proyecto Gateway: En mi caso, al tratarse de una llamada a un servicio web externo (Gateway sirve de conexion puente entre aplicación SAPUI5 y componente EJB JAVA) he implementado la llamada al Web Service en una “Function Import”.

OBSERVACIONES:
Entrando un poco en detalles técnicos de Gateway, al ser una “function import”, se ejecuta el método /IWBEP/IF_MGW_APPL_SRV_RUNTIME~EXECUTE_ACTION de la clase NOMBRE_CLASE_DPC_EXT.
Dentro de este método tengo implementada la lógica y funcionalidad.

Pongo el código fuente resumido:


    DATA: proxy           TYPE REF TO " Nombre de proxy creado"
              p_port          TYPE prx_logical_port_name VALUE 'Puerto logico"
              lw_input        TYPE "Parametro entrada WS" (EN CASO DE TENER)
              lw_output       TYPE "Parametro salida WS"  (EN CASO DE TENER)

Recogemos parametro de entrada de servicio invocado en Gateway (EN CASO DE TENER PARAMETROS DE ENTRADA)

READ TABLE it_parameter INTO ls_parameter WITH KEY name = "nombreParam".

    IF sy-subrc = 0.
      parametro_entrada_1 = ls_parameter-value.
    ENDIF.

Creamos instancia de proxy

TRY.
    CREATE OBJECT proxy
      EXPORTING
        logical_port_name = p_port.
  CATCH cx_ai_system_fault.
    lv_msg_error = 'MENSAJE_ERROR'.

ENDTRY.
  • Preparamos parametro de entrada para llamada a Web Service (EN CASO DE TENER)
    lw_input-parameters-… = …

  • llamada al Web Service
    
    TRY.
        CALL METHOD proxy->"OPERACION_WEB_SERVICE"
          EXPORTING
            input  = lw_input
          IMPORTING
            output = lw_output.

      CATCH cx_ai_system_fault.
        lv_msg_error = 'MENSAJE_ERROR.

    ENDTRY.
  • Devolvemos resultados (EN CASO DE TENERLOS)

      resultados = lw_output-.......
    

Bueno, a grandes rasgos creo que eso todo, :smiley:. Espero que os pueda servir de ayuda.
Aprovecho de nuevo a @Salco por su ayuda.

Un saludo,
Rafael.


#7

Gracias por toda la info, esta buenisima


#8

Sólo dos cosillas @rafbercar:

  1. Si has creado con soamanager la puerta lógica con puerto por defecto, a la hora de crear la instancia de proxy no debería hacer falta poner el parámetro exporting, únicamente la sentencia create object proxy. ¿lo has podido comprobar?
  2. ¿Podrías marcar la respuesta más adecuada como “Solución”?

#9

Buenas @Salco,

pues no he podido comprobarlo…de todas formas cuando pueda hacerlo os lo digo por aquí, :).

Ok , marco la respuesta como solución.

Saludos!


#10

Buenas de nuevo, he estado en un proceso de cambiado de empresa y no he podido comprobar por mis propios medios el funcionamiento del WS. Sin embargo, he preguntado al compañero que se ha puesto con ello y me ha confirmado que las pruebas son satisfactorias, :blush:

Lo único que ha faltado sería confirmar el punto 1 de @Salco expuesto en su última respuesta…pero lo tendré en cuenta para futuros desarrollos, jejeje.

Saludos!


#11

Gracias por la confirmación. Muy útil este hilo.


#12

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.