XML
Hace un par de días estaba intentando consumir un WS(Webservice) desde PHP, ya lo había hecho en ocasiones anteriores, pero nunca me había topado con un nivel de complejidad elevado como el que tenia este WS, anteriormente cuando había consumido WS lo hice con la librería NuSoap la cual te brinda una manera sencilla de hacerlo, pero esta vez, leyendo me entero que PHP cuenta con una clase nativa que hace esto, para desarrollar un cliente, como para montar un WS, la clase para el cliente se llama SoapClient la realidad es que es una clase muy robusta, me puse a leer un poco sobre la misma, y me pareció buena, por lo cual decidí desarrollar mi cliente con la clase nativa de PHP.

Después de algunas horas, termine mi cliente, cuando lo empiezo a testear, me doy cuenta que el servidor remoto siempre me tiraba la misma respuesta, era un error, trataba de enviar un documento, y siempre me decía que el emisor del documento no estaba dado de alta en el sistema, cuando ya había revisado en reiteradas ocasiones que el usuario y el password correspondieran al que me habían dado, dure un par de horas realizando el mismo proceso y siempre recibía lo mismo, por lo cual me dispuse a regresar a mi viejo amigo NuSoap, la realidad es que las clases son muy similares, inclusive se llaman igual(esto a la larga me dio problemas), entonces me dispuse a migrar todo, y cuando realice la misma pruebas, o sorpresa con el NuSoap obtenía el esperado mensaje “Envió Exitoso”, me puse averiguar que era lo que provocaba esto, y pues era que el SoapClient nativo de PHP no enviaba una cabecera que el NuSoap si hacia, y el servidor esperaba esa cabecera, y con el Cliente Nativo la tenias que poner con un par de truquillos, lo cual me provoco cierto nivel de inconformidad, por lo cual me quede con NuSoap para desarrollar completamente mi cliente WS.

 

Activar el SoapClient nativo de PHP

Modificamos el archivo PHP.ini y quitamos el ; de la extensión “php_soap.dll”.

Activar Libreria SOAP en PHP
Activar Libreria SOAP en PHP

 

Reiniciamos nuestro servicio de Servidor Web(por ejemplo si es Apache, reiniciamos el servicio de Apache), y en un el archivo phpinfo nos mostrara la librería como activa, algo como esto.

PHPInfo
SOAP Activo en PHP

El problema viene cuando usamos el NuSoap y tenemos habilitados el Soap Client y el Soap Server de PHP, puesto que las clases del NuSoap y del Soap Client se llaman igual, por ahi leyendo, encontre que cuando pasa esto, basta con solo llamar la clase del NuSoap con otro nombre.

<?php 
require_once('/lib/nusoap.php');
// La dirección donde se aloja el Webservice
$url = 'http://ejemplo.com/service/enviar.php?wsdl';
//Creamos el Cliente Soap
$cliente = new soap_client($url, TRUE);
//Aqui radica la diferencia, en el NuSoap lo podemos llamar de las dos maneras, como la anterior o como esta
$cliente = new nusoap_client($url, TRUE);
?>

Cuando tenemos habilitado el Soap Client nativo de PHP, para que no nos cause conflicto llamamos a la clase NuSoap como:

$cliente = new nusoap_client($url, TRUE);

En lugar de:

$cliente = new soap_client($url, TRUE);

Si no tenemos habilitado el Cliente nativo, podemos llamarla de las dos maneras sin problemas.

Cualquiera de las dos clases son buenas opciones, aunque yo por el momento sigo casado con NuSoap.

  • GusKu

    Fijate que yo tengo que atacar de dos formas a un webservice.

    1.- Solicitar que me envie un XML, lo tengo implementado y perfecto con Soap nativo en php 5

    2.- Enviarle el resultado de procesar el XML anterior.. pues no consigo ni con Soap nativo , nuSoap ni con cURL que me acepte los datos.

    En el primero se solicita:
    string
    string
    string

    Y la diferencia con el segundo ademas de pasarle eso tengo que enviar:
    xml

    Con Soap nativo me devuelve false es como si el XML no se lo incluyera
    Con nuSoap y cURL me aparece error 400 Bad Request

    Y de ahí no salgo ni de broma -_-

    • GusKu

      vaya no se ven las etiquetas … que fallo quería decir que en el primero para solicitar el XML con los datos a procesar paso 3 variables en formato string USUARIO, CLAVE, CODIGO, y en el segundo paso indicarle el resultado de procesar esos datos que recogí tengo que pasarle esos tres mas una estructura XML.

      • luisaca

        Te mande un correo solicitándote mas información para poderte ayudar, revisalo

  • Israel Garcia Vasquez

    hermano, eres un genio, tenia el mismo problema y ya me funciono tenia dias quebrandome la cabeza con ese problema muchas gracias por el articulo

    saludos

  • No tienes idea de cuanto tiempo he buscado esta informacion.
    Me has ahorrado mucho trabajo. Gracias

  • Fernando Barrientos

    Hola
    Haber si ustedes pueden ayudarme, necesito consumir un wsdl de mi empresa y estoy usando nusoap, pero creo que tiene un arreglo de datos, la verdad soy novato en esto de los WS y nusoap espero me puedan ayudar aqui dejo mi codigo php el mensaje que me manda de error es
    Array
    (
    [servicioReturn] => 01Error al Generar xml de Retorno
    )

    getError();
    if ($err) {
    echo ‘Constructor error’ . $err . ”;
    }

    $param = array(‘datos’=>”,’nombreServicio’=>’serviciosAContratar’,’canal’=>’web’,’telefono’=>’8183970043′,’tipoServicio’=>’1L’,’tieneInfinitum’=>’
    0′,’familia’=>’PAQET’,’agrupador’=>’DOBLE’);

    $result = $client->call(‘servicio’,$param);

    if ($client->fault) {
    echo ‘Fault’;
    print_r($result);
    echo ”;
    } else {
    // Check for errors
    $err = $client->getError();
    if ($err) {
    // Display the error
    echo ‘Error’ . $err . ”;
    } else {
    // Display the result
    echo ‘Result’;
    print_r($result);
    echo ”;
    }
    }

    echo ‘Debug’ . htmlspecialchars($client->debug_str, ENT_QUOTES) . ”;
    ?>

  • Jose

    Mmm Interesante…
    Por cierto, aceptas críticas constructivas? Por favor, usa algún punto de vez en cuando! Es la primera vez que veo una frase de 13 líneas xD

    • luisaca

      Las criticas constructivas son siempre bienvenidas, muchas gracias.

  • Jose Alfredo Flores Plata

    Buen día. Mira estoy tratando de consumir un WS. Y pues ya investigue en muchos foros. Y pues la verdad no encuentro una respuesta a mi problema. El mensaje que me genera, al correr mi pagina es: Error
    HTTP Error: Unsupported HTTP response status 404 No Encontrado (soapclient->response has contents of the response).

    Y en mi web service tengo este metodo:

    Quisiera saber si es desde mi WS, o mi Codigo en PHP.

    De ante mano te agradezco mucho por tu tiempo!!!!

    • luisaca

      Hola.

      No se si lograste resolver tu problema, pero pareciera que es un error con las librerías.

      Saludos.

  • Overlord

    Amigo tengo un problema con el SOAP de un web service, quisiera saber si me prodrias ayudar, envíame un correo si puedes o si tienes tiempo, te agradezco de antemano

    • luisaca

      Hola Estimado.

      ¿Lograste solucionar tu problema?

      Saludos.

  • Fabian

    Buenos días amigo. tengo un problema, no se si es con la librería de nusoap(v 1.123) o el servidor web, lo raro es que en modo local, funciona a la perfección, pero cuando lo pruebo en el servidor, no funciona.

    Me estoy quebrando la cabeza y no doy! he probado en godaddy y en hostinger

    Dame una luz, te dejo mi email haber si me devuelves el mensaje y te envió mi código

    Gracias! Bendiciones

    • luisaca

      Buenas tardes estimado Fabian,
      Perdón por no haberte podido contestar antes, lo que podría ser es que no tienes instalado el Nusoap.
      Si quieres enviame tu código a luisaca87 @ gmail.com

      Saludos.

  • Omar

    Buenos Días

    Me podrías por favor colaborar con este error

    Error

    HTTP Error: Unsupported HTTP response status 400 Bad Request (soapclient->response has contents of the response)

    estoy usando la librería nusoap

    • luisaca

      Eso es un error del Server.

  • Rene Calderon

    Tengo un problema con SoapClient. Hago alrededor de 500 consultas a un wsdl pero en ocasiones me responde sin problemas y en otras me genera un error consultando los mismos registros. El error que me genera es el siguiente y se termina el script, estoy intentando encontrar información para que el script continue.

    [Tue Jan 06 16:03:44 2015] [error] [client 187.151.142.203] PHP Fatal error: Uncaught SoapFault exception: [HTTP] Could not connect to host in /var/www/html/demo/funciones.php:87\nStack trace:\n#0 [internal function]: SoapClient->__doRequest(‘__call(‘Consulta’, Array)\n#2 /var/www/html/demo/funciones.php(87): SoapClient->Consulta(Array)\n#3 /var/www/html/demo/validar.php(212): ConsultaSAT(Array)\n#4 {main}\n thrown in /var/www/html/demo/funciones.php on line 87, referer: http://pagina.com/demo/emitidas.php

    • luisaca

      Perdón, apenas lei tu comentario. ¿Lo pudiste solucionar? Veo que tiene algo que ver con el SAT, en eso medio soy bueno 😛

  • ANTO S

    mira amigo tengo un problema con el soapclient. cuando ejecuto la funcion que quiero consumir siempre me regresa error could not connect server exception http pero el detalle que cuando lo ejecuto en el software soapui sin problemas me deja consumirlo ya estuve intentando varias soluciones y ninguna me funciona no se si me haga falta instalar algo en mi php uso codigniter y ya eh usado soapclient pero nunca me habia pasado esto.

    • Me puedes mandar un ejemplo a mi correo, por favor.

      • ANTO S

        enviado amigo

  • Matias Donnet

    Hola, tengo un problema. Estoy usando nusoap(v 1.123) e hice un cliente para consumir un ws con todas las especificaciones de seguridad que me han pasado (certificado – usuario y contraseña para los headers) y asi y todo cuando consumo el ws me retorna esto:

    Error: array(2) {
    [“faultcode”]=>
    string(24) “ns1:FailedAuthentication”
    [“faultstring”]=>
    string(59) “The security token could not be authenticated or authorized”
    }

    Lo raro es que con soapUI con los mismos datos que uso en el cliente, el ws me responde lo que deberia.
    Gracias de ante mano.
    Saludos