2012-01-10 25 views
7

A pesar de ser un desarrollador de PHP por un tiempo, ahora estoy obteniendo mi primera experiencia con los servicios web. Esperaba obtener un poco de ayuda, ya que el libro que estoy usando no es de mucha ayuda. Una de las empresas con las que estamos haciendo negocios me dio un documento XML en el formato que necesita estar (publicaré una parte). Debido a mi inexperiencia en este tema en particular, no estoy muy seguro de qué hacer. Necesito saber cómo enviar este mensaje a su página POST en vivo, cómo recibir la respuesta, y ¿necesito crear algún tipo de página WSDL? Cualquier ayuda o dirección sería muy apreciada, y por favor, no solo envíe un enlace al manual php. Obviamente he estado allí, ya que normalmente es el lugar al que recurrir en busca de ayuda.PHP SOAP HTTP Request

POST /sample/order.asmx HTTP/1.1 
Host: orders.sample.com 
Content-Type: application/soap+xml; charset=utf-8 
Content-Length: length 

<?xml version="1.0" encoding="utf-8"?> 
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> 
    <soap12:Header> 
    <AuthenticationHeader xmlns="http://sample/"> 
     <Username>string</Username> 
     <Password>string</Password> 
    </AuthenticationHeader> 
    <DebugHeader xmlns="http://sample/"> 
     <Debug>boolean</Debug> 
     <Request>string</Request> 
    </DebugHeader> 
    </soap12:Header> 
    <soap12:Body> 
    <AddOrder xmlns="http://sample/"> 
     <order> 
     <Header> 
      <ID>string</ID> 
      <EntryDate>dateTime</EntryDate> 
      <OrderEntryView> 
      <SeqID>int</SeqID> 
      <Description>string</Description> 
      </OrderEntryView> 
      <ReferenceNumber>string</ReferenceNumber> 
      <PONumber>string</PONumber> 
      <Comments>string</Comments> 
      <IpAddress>string</IpAddress> 
     </Header> 
     </order> 
    </AddOrder> 
    </soap12:Body> 
</soap12:Envelope> 

está por encima del documento XML AddOrder se me dio (me quita la mayor parte del cuerpo). Por favor, hágame saber si es necesario más detalles, ya que quiero ser lo más específico posible para poder averiguar cómo enviar esto

Respuesta

7

Usted tiene un par de opciones! Puede usar objetos soap para crear la solicitud que, de acuerdo con un WSDL, sepa la forma correcta de hablar con el servidor remoto. Puede ver cómo hacerlo al PHP manual.

O bien, puede usar CURL para hacer el trabajo. Tendrá que saber dónde enviar los datos a (que parece que es en el ejemplo anterior), entonces usted puede hacer algo como esto:

$curlData = "<?xml version="1.0" encoding="utf-8"?>... etc"; 
$url='http://wherever.com/service/'; 
$curl = curl_init(); 

curl_setopt ($curl, CURLOPT_URL, $url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($curl,CURLOPT_TIMEOUT,120); 
curl_setopt($curl,CURLOPT_ENCODING,'gzip'); 

curl_setopt($curl,CURLOPT_HTTPHEADER,array (
    'SOAPAction:""', 
    'Content-Type: text/xml; charset=utf-8', 
)); 

curl_setopt ($curl, CURLOPT_POST, 1); 
curl_setopt ($curl, CURLOPT_POSTFIELDS, $curlData); 

$result = curl_exec($curl); 
curl_close ($curl); 

A continuación, debe tener el resultado en el $ result var. A continuación, puede tratar de convertirlo en un documento XML, aunque a veces me he encontrado, debido a que codifica esta no funciona:

$xml = new SimpleXMLElement($result); 
print_r($xml); 
+0

¿Cómo sé que la $ url aquí? Gracias. –

1

Como proveedor del servicio, la otra compañía debe proporcionarle un documento WSDL que describe el servicio en términos legibles por computadora. Normalmente se proporcionan a través de una url como http://their.service.url/wsdl o similar.

Una vez que lo tenga, debería poder crear una instancia SoapClient para interactuar con el servicio.

1

Bueno, esto es definitivamente una solicitud SOAP, por lo que tendrá que usar SOAP para trabajar correctamente con esto o para un gran dolor de cabeza.

He tenido varios encuentros con SOAP y PHP y cada vez que tenía que depender de una biblioteca externa. El más reciente que tuve que usar fue Zend_Soap_Client.

Pero, una vez más, ¿tiene el WSDL disponible? Necesita un WSDL para poder usar un servicio web SOAP utilizando una biblioteca de cliente.

http://framework.zend.com/manual/en/zend.soap.html

Y aquí es una muestra de mi código i utilizada, espero que va a ir abriendo boca

ini_set('soap.wsdl_cache_enabled', 0); 
set_include_path(dirname(__FILE__).'/../../libraries/:'.get_include_path()); 
require_once 'Zend/Loader/Autoloader.php'; 
Zend_Loader_Autoloader::getInstance(); 

//Include the classes for the webservice 
include('CatalogOrder.php'); 
include('CatalogOrderItem.php'); 
include('CatalogOrderWebservice.php'); 

//Check the mode 
if(isset($_GET['wsdl'])) { 

    $autodiscover = new Zend_Soap_AutoDiscover(array(
     'classmap' => array(
      'CatalogOrder' => "CatalogOrder", 
      'CatalogOrderItem' => "CatalogOrderItem" 
     ) 
    )); 
    $autodiscover->setComplexTypeStrategy(new Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex()); 
    $autodiscover->setClass('CatalogOrderWebService'); 
    $autodiscover->handle(); 

//Return the consume form and process the actions of the consumer 
} elseif(isset($_GET['consume'])) { 

    // pointing to the current file here 
    $soap = new Zend_Soap_Client("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array(
     'classmap' => array(
      'CatalogOrder' => "CatalogOrder", 
      'CatalogOrderItem' => "CatalogOrderItem" 
     ), 
     'encoding' => 'iso-8859-1' 
    )); 
    include('CatalogOrderWebserviceConsumer.php'); 

//Process SOAP requests 
} else { 

    // pointing to the current file here 
    $soap = new Zend_Soap_Server("http://".$_SERVER['HTTP_HOST']."/admin/export/WebService.php?wsdl", array(
     'classmap' => array(
      'CatalogOrder' => "CatalogOrder", 
      'CatalogOrderItem' => "CatalogOrderItem" 
     ), 
     'encoding' => 'iso-8859-1' 
    )); 
    $soap->setClass('CatalogOrderWebService'); 
    $soap->handle(); 

}