Cómo enviar XML a un WebService con PHP

Inicio / Cómo hacer para... / Cómo enviar XML a un WebService con PHP

Para empezar, debemos responder una pregunta escencial: ¿se trata de un WebService de tipo SOAP o uno de tipo REST?

¡La forma de enviarlo en uno u otro caso será muy diferente!

Otra historia es cómo recibir XML a través de WebServices desarrollados usando PHP… tema para otro post 🙂

Cómo enviar XML a un WebService SOAP con PHP

Como siempre, para el caso de que se trate de un webservice de tipo SOAP, usaremos la clase SOAPClient

Tomemos como ejemplo este Servicio Web que tiene un solo método disponible (CustomerSearch), el cual recibe XML y devuelve XML.

Tenemos dos alternativas para generar el XML que queremos enviar:

  1. Escribirlo explícitamente (o “a mano”)
  2. Usar la clase SimpleXMLElement

Si aún estás en dudas, no dudes más: usa la clase, te ahorrará una gran cantidad de dolores de cabeza.

Con lo que la llamada se vería algo así como:

<?php

$url = 'https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL';
$client = new SoapClient($url);

$xmlr = new SimpleXMLElement("<CustomerSearch></CustomerSearch>");
$xmlr->addChild('AuthorID', 1);
$xmlr->addChild('UserID', 'mchojrin');
$xmlr->addChild('UserPassword', '1234');
$xmlr->addChild('Email', 'mauro.chojrin@leewayweb.com');

$params = new stdClass();
$params->xml = $xmlr->asXML();

$result = $client->CustomerSearchS($params);

print_r($result);

echo PHP_EOL;

Si ejecutas este código te encontrarás con algo como:

stdClass Object
(
    [CustomerSearchSResult] => stdClass Object
        (
            [any] => <Customers xmlns=""><ResultCode>-1</ResultCode><ErrorMessage>Invalid Login</ErrorMessage></Customers>
        )

)

Lo que seguramente te interese es lo que está dentro de la clave any, con lo cual, para obtenerlo podrías usar echo $result->CustomerSearchSResult->any; en lugar de print_r($result);. Aunque probablemente lo que quieras no sea mostrar el resultado explícitamente, si no procesarlo de alguna manera… ¿qué mejor que recurrir nuevamente a SimpleXMLElement?

<?php

$url = 'https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL';
$client = new SoapClient($url);

$xmlr = new SimpleXMLElement("<CustomerSearch></CustomerSearch>");
$xmlr->addChild('AuthorID', 1);
$xmlr->addChild('UserID', 'mchojrin');
$xmlr->addChild('UserPassword', '1234');
$xmlr->addChild('Email', 'mauro.chojrin@leewayweb.com');

$params = new stdClass();
$params->xml = $xmlr->asXML();

$result = new SimpleXMLElement($client->CustomerSearchS($params)->CustomerSearchSResult->any);

$r = current($result->xpath('/Customers/ResultCode'));

if ( $r == '-1' ) {
        echo 'Fallo: '.$result->xpath('/Customers/ErrorMessage')[0];
} else {
        echo 'Exito!';
}

echo PHP_EOL;

Cómo enviar XML a un WebService REST con PHP

En el caso de tratarse de un Servicio Web basado en REST todo es más fácil.

Puedes usar cURL:

<?php

$server = 'http://www.leewayweb.com/miaplicacion';
$headers = [
    "Content-type: text/xml",
    "Content-length: " . strlen($requestXML), "Connection: close",
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $server);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $requestXML);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec($ch);

if (curl_errno($ch)) {
    print curl_error($ch);
    echo "Algo fallo";
} else {
    curl_close($ch);
}

O bien algo un poco más elaborado como Guzzle:

<?php

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;

$client = new Client();
$request = new Request(
    'POST',
    $uri,
    [
        'Content-Type' => 'text/xml; charset=UTF8'
    ],
    $xml
);

echo $response->getBody();

(Para que funcione este ejemplo hay que tener instalada la librería o incluirla, por ejemplo, usando composer.).

Conclusión

El intercambio de XML usando PHP no es en sí mismo complejo, lo único con lo que debes tener cuidado es que el texto que estés enviando sea efectivamente XML… y para ello, nada mejor que SimpleXMLElement 🙂

¿Te quedó alguna duda? ¡Deja un comentario!

mchojrin

Hola! Soy Mauro Chojrin, estudié la Lic. en Ciencias de la Computación en la UBA.

Me desempeño como docente de programación desde el año 1997.

Pasé por diferentes instituciones (Escuela Técnica ORT, Digital House, EducacionIT, ITMaster, Escuela DaVinci entre otros).

Actualmente coordino el desarrollo de proyectos web en https://leewayweb.com y los cursos dictados en Leeway Academy

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.