Foros del Web » Programando para Internet » PHP »

Webservice SOAP php

Estas en el tema de Webservice SOAP php en el foro de PHP en Foros del Web. Hola a todos, necesito vuestras ayuda Espero que sea el lugar correcto El caso es que tengo que conectar a un webservice SOAP, usando PHP, ...
  #1 (permalink)  
Antiguo 10/08/2017, 02:26
 
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 0
Webservice SOAP php

Hola a todos, necesito vuestras ayuda
Espero que sea el lugar correcto

El caso es que tengo que conectar a un webservice SOAP, usando PHP, y no hay manera... :(

Me han dado la ubicación, que es algo como esto:
http://xxx/xxx/Servicios?wsdl (pongo las xxx por omitir la url real), de la cual tengo un usuario y una contraseña.

Han implementado un método, llamado selectLectores y me dicen que las request son de este tipo:

Código:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:impl="http://xxxxxxxxx">
        <soapenv:Header>
         <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
           <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
             <wsse:Username>miusuario</wsse:Username>
             <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mipassword</wsse:Password>
           </wsse:UsernameToken>
         </wsse:Security>
       </soapenv:Header>
   <soapenv:Body>
      <impl:selectLectores>
         <arg0>
            <!--Obligatorio:-->
            <centro>51000286</centro>
            <!--Optional:-->
            <codigoLector>14103</codigoLector>
         </arg0>
      </impl:selectLectores>
   </soapenv:Body>
</soapenv:Envelope>
El caso es que me intento conectar con php con el siguiente código:

Cita:
$servicio="http://xxx/xxx/Servicios?wsdl";
$parametros=array();
$parametros['centro']=51000286;
$validacion = array(
'Username' => 'miusuario',
'Password' => 'mipassword'
);

$client = new SoapClient($servicio,$validacion);
$result = $client->selectLectores($parametros);
Pero no me funciona, me devuelve el siguiente error:
500 | Internal Server Error | SoapFault
java.lang.NullPointerException

¿Alguien sabría decirme que estoy haciendo mal, o como debo hacerlo?

Muchas gracias
Un saludo
  #2 (permalink)  
Antiguo 10/08/2017, 10:45
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 2 meses
Puntos: 11
Respuesta: Webservice SOAP php

Según yo, las credenciales deberían ir así para soap
Código PHP:
Ver original
  1. $cliente= new SoapClient("http://xxx/xxx/Servicios?wsdl",array('trace' => 1,'soap_version' => SOAP_1_1, 'login'=>'miusuario','password' => 'mipassword').
pero tal vez no sea así ya que al parecer te piden esos datos dentro del XML(tengo dudas en este punto).

Pero en lo que si estoy seguro es en esto:
En vez de
Código PHP:
Ver original
  1. $result = $client->selectLectores($parametros);
debe ir
Código PHP:
Ver original
  1. $result = $client->__soapCall('selectLectores',array($parametros));//Si doble array
creo que con eso debería funcionar
  #3 (permalink)  
Antiguo 11/08/2017, 01:24
 
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Webservice SOAP php

Hola,
Gracias por tu ayuda, pero me temo que sigue sin funcionar

He cambiado las dos líneas que comentas y muestra el mismo error "java.lang.NullPointerException"

Como no estabas seguro de la primera línea, también he probado a dejar la primera línea como yo la tenía, y falla igualmente... :(
  #4 (permalink)  
Antiguo 11/08/2017, 01:43
 
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Webservice SOAP php

Me acaban de decir, los que llevan ese servicio, que le está llegando la cabecera vacía, es decir <soapenv:Header>sin datos
Por eso da ese error, ya que no puede llegar el campo de usuario o contraseña vacíos

La cuestión es, ¿cómo hago para mandar esa cabecera?
  #5 (permalink)  
Antiguo 11/08/2017, 14:42
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Webservice SOAP php

Saludo

Bueno, pues viendo la estructura del ws se visualiza esta estructura:

- Security
- UsernameToken
- User
- Password

Imagino que tal vez eso tenga algo que ver.

Yo intentaría enviar esa estructura como un array en el header,
es decir, una colección de arrays llevando el mismo orden indicado arriba,
o incluso hacer uso de varios objetos, como puedes observar aquí.

Otra pregunta, es un ws imagino de pruebas, es público?
Podriamos hacer pruebas con el?
O es de manejo interno en un server de empresa?

Lo digo para poder echarte una mano haciendo pruebas
sobre el ws, bueno, ya nos dirás.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #6 (permalink)  
Antiguo 11/08/2017, 17:37
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 2 meses
Puntos: 11
Respuesta: Webservice SOAP php

Esa cabecera la arman las funciones que te envié automáticamente. Si eso esta fallando tal vez sea un problema de configuración de php. Porque no pruebas con soap-ui, no se si lo conozcas, es un software para probar WS. Y ellos estan mal, la cabecera <soapenv:Header> puede ir vacia,
la que no puede ir vacia es <soapenv:Body>. Prueba con soap-ui y te daras cuenta
  #7 (permalink)  
Antiguo 14/08/2017, 03:40
 
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Webservice SOAP php

Me temo que el ws es privado, no se pueden hacer pruebas :(
Por otro lado, no comprendo lo que comentas, ¿mandar un array con todo eso?
¿No sé supone que espera un xml con la cabecera y lo que menciona?
No comprendo muy bien lo que me has mandado, ¿me podrías poner un ejemplo?

Es que lo que me han dicho los de ws, es que esperan un xml, pero no les llega
  #8 (permalink)  
Antiguo 14/08/2017, 08:23
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Webservice SOAP php

Saludo.

Bueno, un web service tipo soap normalmente se expone como xml,
y es cierto que también puede ser consumido con un xml como tal,
pero hay librerías como nusoap (que es de terceros)
o soapclient (que es propia de php) con las cuales se pueden hacer
consumos de webservices sin tener que generar toda la estructura xml a 'mano',
sino que se arma dicha estructura a partir de arrays, o incluso, objetos.

Entonces, en tu caso, por ej podrías armar ya sea una colección de arrays
u objetos teniendo en cuenta la estructura del ws.

Código PHP:
Ver original
  1. Ej:
  2. $headers = array('Security'=>array('UsernameToken'=>array('Username'=>'yyyy','Password'=>'zzzz')))


El ejemplo como objetos lo encuentras en el link que te pase.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #9 (permalink)  
Antiguo 16/08/2017, 15:23
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Webservice SOAP php

Saludo.

Volviendo a revisar lo que se tiene hasta el momento,
yo propongo esta estructura.

Código PHP:
Ver original
  1. class WsseAuthHeader extends SoapHeader
  2. {
  3.     private $wss_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
  4.     private $wsp_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText';
  5.     private $wsu_ns = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
  6.  
  7.     function __construct($user, $pass)
  8.     {
  9.  
  10.         $auth = new stdClass();
  11.         $auth->Username = new SoapVar($user, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wss_ns);
  12.         $auth->Password = new SoapVar($pass, XSD_STRING, NULL, $this->wss_ns, NULL, $this->wsp_ns);
  13.  
  14.         $username_token = new stdClass();
  15.         $username_token->UsernameToken = new SoapVar($auth, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wsu_ns);
  16.  
  17.         $security_sv = new SoapVar(
  18.             new SoapVar($username_token, SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'UsernameToken', $this->wss_ns),
  19.             SOAP_ENC_OBJECT, NULL, $this->wss_ns, 'Security', $this->wss_ns);
  20.         parent::__construct($this->wss_ns, 'Security', $security_sv, true);
  21.     }
  22. }
  23.  
  24. $client = new SoapClient("http://xxx/xxx/Servicios?wsdl");
  25. $client->__setSoapHeaders(Array(new WsseAuthHeader("user", "pass")));


Prueba hasta ese punto con los datos correctos de user y pass
a ver que te dicen las personas que manejan el ws respecto a la llegada del header.

Y de paso, preguntales si la estructura de los parámetros de la función selectLectoresAbiesByExample
esta disponible para usarla (con los xsd y todo) pues tal vez haya que hacer algo similar.
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Última edición por mortiprogramador; 16/08/2017 a las 15:32
  #10 (permalink)  
Antiguo 17/08/2017, 01:59
 
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Webservice SOAP php

Nada, me dicen que no funciona, que sigue esperando un username que le llega vacío :(

¿Existe alguna manera de ver que xml genera esto?
He mirado en el manual de php y he intentado esto:

Código:
$client = new SoapClient("some.wsdl", array('trace' => 1));
$result = $client->SomeFunction();
echo "REQUEST:\n" . $client->__getLastRequest() . "\n";
Pero no muestra nada, ¿se puede sacar de otra forma?
  #11 (permalink)  
Antiguo 18/08/2017, 04:24
 
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Webservice SOAP php

Ya he podido sacar el xml.
Es el siguiente:
Código:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://xxxxxxx/" 
xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText" 
xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<SOAP-ENV:Header>
	<ns2:Security SOAP-ENV:mustUnderstand="1">
		<ns4:UsernameToken>
			<ns2:username>miusuer</ns2:username>
			<ns3:password>mipass</ns3:password>
		</ns4:UsernameToken>
	</ns2:Security>
</SOAP-ENV:Header>

Y yo creo que no funciona por los ns1, ns2, etc, porque espera esto:

Código:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:impl="http://xxxxxxx/">
        <soapenv:Header>
         <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
           <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
             <wsse:Username>miuser</wsse:Username>
             <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mipass</wsse:Password>
           </wsse:UsernameToken>
         </wsse:Security>
       </soapenv:Header>

¿Como hago para que en vez de:
xmlns:ns1 ponga xmlns:impl
ns2:Security ponga wsse:Security
ns4:UsernameToken ponga wsse:UsernameToken
ns3:password ponga wsse:Password?

Última edición por juliana2812; 18/08/2017 a las 04:32
  #12 (permalink)  
Antiguo 21/08/2017, 13:52
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 2 meses
Puntos: 11
Respuesta: Webservice SOAP php

Para que te devuelva el xml intentalo de esta manera:

Código PHP:
Ver original
  1. $client = new SoapClient("some.wsdl", array('trace' => 1));
  2. $strResp = $client->__soapCall('SomeFunction',$arrayParametros);
  3. echo "REQUEST:\n" . $client->__getLastRequest() . "\n";

Si aún así no manda nada, o estas mandando mal los parámetros o ellos tienen un error.
Pero lo mas probable es que sean los parámetros que mandas. Te recomiendo probar con soapui ahi puedes ver el armado del xml mas fácilmente. Y haz la clase que te indico mortiprogramador class WsseAuthHeader extends SoapHeader. Esa clase pone los headers como quieres.

Última edición por abrahamhs; 21/08/2017 a las 13:55 Razón: correcion
  #13 (permalink)  
Antiguo 22/08/2017, 06:38
 
Fecha de Ingreso: mayo-2014
Mensajes: 28
Antigüedad: 9 años, 11 meses
Puntos: 0
Respuesta: Webservice SOAP php

Ya dije que había conseguido sacar el xml, y como era respecto al que se esperaba
Lo que no sé es como hacer para que sean iguales

Etiquetas: select, soap, url, webservice
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:00.