Hace un tiempo publicamos dos artículos sobre cómo publicar un servicio web SAP. En esta ocasión, vamos a ver cómo consumir un servicio web SAP desde una plataforma completamente diferente como puede ser una aplicación web, concretamente cómo consumir un web service de SAP con PHP.
Realmente el método para consumir un servicio web con PHP es equivalente sea este un servicio web SAP o no. Tomamos el ejemplo de un servicio web SAP para dar continuidad a los artículos anteriores y ver cómo pasarle las credenciales de usuario.
Acceso al WSDL para consumir servicio web SAP
En primer lugar, a la hora de consumir un servicio web SAP o no SAP, debemos obtener los datos de este disponibles en su descriptor WSDL.
Tal y como vimos en el segundo artículo sobre publicar servicios web en SAP, desde la transacción SOAMANAGER se puede acceder al fichero WSDL del servicio web a consumir de donde es posible extraer las funciones disponibles desde ese servicio web y la manera en la que pueden ser accedidas.
Cliente SOAP para consumir servicio web SAP
Para consumir un web service SAP, php es una buena opción ya que definiendo unas pocas líneas de código podemos acceder y utilizar funciones SAP desde una aplicación web.
En primer lugar se debe crear un cliente SOAP a partir de la URL del fichero WSDL del servicio web SAP y de la localización del servicio que se va a consumir.
[php]
$location_URL = ‘https://ruta_sevicio_web.com/zlast_news2/100/zlast_news2/zb_last_news2’;
$wsdl = ‘https://ruta_servicio_web.com/wsdl/srvc_00505692214C1EE3B6D524ADE1ECD0F4/wsdl11/allinone/standard/document?sap-client=100?wsdl’;
[/php]
Para ello se crea una instancia de la clase SoapClient de PHP, indicando las opciones que correspondan en cada caso.
Según el nivel de autenticación indicado al crear el servicio web puede ser necesario la especificación de usuario y contraseña. Estos datos se han de pasar al crear el cliente SOAP y no al llamar a una acción. En realidad esta información se transfiere a través de la cabecera del mensaje SOAP. Por tanto, un ejemplo de cliente SOAP para consumir un web service SAP con PHP sería el siguiente:
[php]
$client = new SoapClient($wsdl, array(
‘location’ => $location_URL,
‘uri’ => «»,
‘trace’ => 1,
‘login’ => $usuario,
‘password’ => $pass
));
[/php]
Consumir web service SOAP de SAP con PHP
Una vez disponemos del cliente SOAP creado en PHP, hay que llevar a cabo una llamada a la acción del servicio web SAP que se desee. En PHP existe un método propio de SoapClient que devuelve la lista de funciones disponibles en el servicio web: __getFunctions.
Suponiendo que la función que deseemos consumir del servicio web SAP sea ZNEWS_FM_GET_ULTIMAS_NOTICIAS la forma de llamarla y pasarle los parámetros de entrada necesarios es la siguiente:
[php]
try{
$response = $client->ZNEWS_FM_GET_ULTIMAS_NOTICIAS(array(«IM_NUM_NOTICIAS» => «5»));
$xml = simplexml_load_string($order_return);
foreach( $xml->children() as $child ) {
echo $child->FECHA_CREACION;
}
}
catch (SoapFault $exception){
var_dump(get_class($exception));
var_dump($exception);
}
[/php]
En la variable $response obtendremos el resultado de la llamada a la función que tendrá el formato indicado en el WSDL como mensaje de respuesta.
Una vez disponemos de la respuesta en PHP podemos extraer de esta los datos que deseemos y formatearla como sea conveniente en cada caso. Como se puede comprobar una vez se dispone del descriptor WSDL, es muy sencillo consumir un servicio web con PHP.
Hola, estoy teniendo problemas al consumir un WSDL que me proporciono un consultor SAP PI:
http://192.111.111.111:50000/dir/wsdl?p=ic/c3cb6f32944c468fn42bq5573f1dcea2
(Cambie los datos pero la estructura es la misma)
Estoy intentando hacerlo con nuSoap, realmente no tendría porque tener complejidad el código, simplemente llamar la función y mandar un parámetro.
El tema es que obtengo este error:
Error
HTTP Error: Unsupported HTTP response status 400 Bad Request (soapclient->response has contents of the response)
Buscando por todos lados encontré esto, que me parece es algo parecido: https://answers.sap.com/questions/12333777/post-method-in-pi.html
Me gustaría saber si tiene algo que ver o que podría ser
De ante mano, gracias por tu foro, estaré atento !
Hola Edgar.
Según parece y viendo el código de error que recibes (400) el problema está en la petición que estás haciendo a PI desde nuSOAP, pero sin conocer más a fondo el tema no te podemos aclarar qué es lo que está incorrecto. Podría ser desde un tema de conectividad entre los servidores, autenticación… o formato de la petición HTTP entre otras cosas. https://developer.mozilla.org/es/docs/Web/HTTP/Status/400 Intenta simplificar la llamada al máximo y acceder desde el navegador para comprobar la conectividad y a ver si das con el problema. ¡Mucha suerte!
Un saludo y gracias por leer nuestro blog.
Hola, muy interesante el articulo, quería consultarles lo siguiente:
Al existir mas de un Webservice creado por distintos temas especificos y aun exigiendo usuario y password vemos con preocupacion que un usuario de cualquier webservice creado por otro tema puede ingresar y solicitar datos de este webservice, donde limitamos cual usuario para cual webservice ? Incluso las rfc son modulos y grupo de fun ciones diferentes. Gracias !!!
¡Hola Raúl! Gracias por tu comentario. Respecto a la duda que planteas de los usuarios por WS, la forma de controlar qué usuario puede acceder a qué WS es mediante el uso de roles SAP que limiten el acceso a un módulo/grupo de funciones o a otro. Esperamos que te haya servido de ayuda. Un saludo
Hola, muchas gracias por la información que compartiste. Estoy tratando de llamar a Sap Web Service con php. Pero de alguna manera no tuve éxito. ¿Necesito cambiar mi url wsdl? Mi URL Url = ‘http: // ****** / sap / bc / srt / wsdl / flv_10 *** / bndg_url / sap / bc / srt / rfc / sap / zws_organization / 100 / zws_organization / zws_organization? SAP-cliente = // ** WSDL? ‘;
Hola Selmin.
Gracias por leer nuestro blog. A priori no vemos nada extraño en la URL del WSDL. El error debe deberse a otro motivo, prueba a regenerar el servicio.
Un saludo.
Gracias, te deseo un éxito continuo:)
buenos dias
me sale el error protected ‘message’ => string ‘Wrong Version’ (length=13)
pero no encuentro como solucionarlo
te agradezco si me puedes dar alguna idea
¡Hola!
Sin saber más detalles sobre el WS que estás consumiendo es difícil saber qué puede estar pasando. No obstante, prueba a determinar la versión de SOAP del WS: para eso, en la creación del SoapClient, añade una variable de tipo array en la que previamente indiques esta versión. Te dejo un código de ejemplo:
$client = new SoapClient($wsdl, array(
'location' => $location_URL,
'uri' => "",
'trace' => 1,
‘soap_version” => ‘SOAP_1_2’,
'login' => $usuario,
'password' => $pass
));
Espero que te sirva de ayuda.
¡Un saludo!
Configurar saprfc en PHP?
Hola Manuel.
La idea en este artículo del blog era consumir un servicio web SAP sin el módulo PHP que comentas, utilizando las funciones SOAP de PHP. No obstante, saprfc es otra opción que tendremos en cuenta para futuros artículos.
¡Muchas gracias!
yo recibo este error 🙁
«object(SoapFault)#2 (9) { [«message»:protected]=> string(25) «Could not connect to host» [«string»:»Exception»:private]=> string(0) «» [«code»:protected]=> int(0) [«file»:protected]=> string(49) «/ws.php» [«line»:protected]=> int(36) [«trace»:»Exception»:private]=> array(3) { [0]=> array(4) { [«function»]=> string(11) «__doRequest» [«class»]=> string(10) «SoapClient» [«type»]=> string(2) «->» [«args»]=> array(5) { [0]=> string(292) » 16 » [1]=> string(84) «https://xxxxxxxxxx:8000/sap/bc/srt/rfc/sap/zec_articulos/300/zec_articulos/zec_articulos» [2]=> string(0) «» [3]=> int(1) [4]=> int(0) } } [1]=> array(6) { [«file»]=> string(49) «ws.php» [«line»]=> int(36) [«function»]=> string(6) «__call» [«class»]=> string(10) «SoapClient» [«type»]=> string(2) «->» [«args»]=> array(2) { [0]=> string(12) «ZecArticulos» [1]=> array(1) { [0]=> array(2) { [«Artic»]=> string(2) «16» [«Catal»]=> string(4) «TEST» } } } } [2]=> array(6) { [«file»]=> string(49) «ws.php» [«line»]=> int(36) [«function»]=> string(12) «ZecArticulos» [«class»]=> string(10) «SoapClient» [«type»]=> string(2) «->» [«args»]=> array(1) { [0]=> array(2) { [«Artic»]=> string(2) «16» [«Catal»]=> string(4) «TEST» } } } } [«previous»:»Exception»:private]=> NULL [«faultstring»]=> string(25) «Could not connect to host» [«faultcode»]=> string(4) «HTTP» }»
Esto es al enviar los parametros, si no los mando se conecta y me dice que requiere los parametros Artic y Catal
Qué tal, lograste resolverlo?
bueno, unos años despues me estoy dando con este mismo error
el tema viene cuando quiere ejecutar la llamada al metodo
aun no he podido resolverlo
me conecto al ws bien, me muestra la estructura, pero… ese error me sigue por todos lados
Hola, tendras algo parecido pero con Sap Businnes One
Hola Walter.
Lo siento. No disponemos de ningún ejemplo similar en SAP Business One. No obstante, si conoces el WSDL del servicio web publicado en B1, el proceso para consumirlo mediante PHP es equivalente al explicado en este artículo. Muchas gracias por tu pregunta.