Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

php , xml, soap

Estas en el tema de php , xml, soap en el foro de Frameworks y PHP orientado a objetos en Foros del Web. hola tengo dudas acerca de como es el proceso de comunicacion con un web service necesito comunicarme con servidor mediante xml, tengo los documentos xml, ...
  #1 (permalink)  
Antiguo 21/03/2007, 11:05
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
php , xml, soap

hola
tengo dudas acerca de como es el proceso de comunicacion con un web service
necesito comunicarme con servidor mediante xml, tengo los documentos xml, buscando en la web encontre que la comunicacion debe hacerse mediante algun protocolo, p.e. SOAP, para php existe una libreria nuSOAP, en los ejemplos se hace la comunicacion pero no utilizan los archivos XML:
Código PHP:
require_once('../lib/nusoap.php');
$proxyhost = isset($_POST['proxyhost']) ? $_POST['proxyhost'] : '';
$proxyport = isset($_POST['proxyport']) ? $_POST['proxyport'] : '';
$proxyusername = isset($_POST['proxyusername']) ? $_POST['proxyusername'] : '';
$proxypassword = isset($_POST['proxypassword']) ? $_POST['proxypassword'] : '';
$client = new soapclient("http://soap.amazon.com/onca/soap2"false,
                        
$proxyhost$proxyport$proxyusername$proxypassword);
$err $client->getError();
if (
$err) {
    echo 
'<h2>Constructor error</h2><pre>' $err '</pre>';
}
// This is an archaic parameter list
$params = array(
    
'manufacturer' => "O'Reilly",
    
'page'         => '1',
    
'mode'         => 'books',
    
'tag'          => 'trachtenberg-20',
    
'type'         => 'lite',
    
'devtag'       => 'D35PWRR0R0URC3',
    
'sort'         => '+title'
);
$result $client->call('ManufacturerSearchRequest'$params'http://soap.amazon.com''http://soap.amazon.com');
if (
$client->fault) {
    echo 
'<h2>Fault (This is expected)</h2><pre>'print_r($result); echo '</pre>';
} else {
    
$err $client->getError();
    if (
$err) {
        echo 
'<h2>Error</h2><pre>' $err '</pre>';
    } else {
        echo 
'<h2>Result</h2><pre>'print_r($result); echo '</pre>';
    }
}
echo 
'<h2>Request</h2><pre>' htmlspecialchars($client->requestENT_QUOTES) . '</pre>';
echo 
'<h2>Response</h2><pre>' htmlspecialchars($client->responseENT_QUOTES) . '</pre>';
echo 
'<h2>Debug</h2><pre>' htmlspecialchars($client->debug_strENT_QUOTES) . '</pre>'
podrian decirme como integrar los archivos xml, y si voy por buen camino o no ??
gracias
  #2 (permalink)  
Antiguo 21/03/2007, 15:31
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: php , xml, soap

bueno poco a poco voy aclarando mis dudas, pongo aqui lo que voy encontrando para que me digan si en algo me equivoco o para que pueda ayudar a alguien as

primero la estructura, proceso de comunicacion con un web service, una imagen vale mas que mil palabras
http://www.revista.unam.mx/vol.3/num1/art3/img01.html
y el articulo: http://www.revista.unam.mx/vol.3/num1/art3/

ahora quisiera saber cual es la diferencia entre un archivo xml y wsdl y como puedo desde php sacar los datos del archivo xml para poder enviarlos mediante el array al webservice
  #3 (permalink)  
Antiguo 21/03/2007, 16:25
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: php , xml, soap

por lo que voy viendo los documentos WSDL tienen una estructura definida, teniendo los siguientes elementos:
* Types
* Message
* Operation
* Port Type
* Binding
* Port
* Service
y para mi caso me han dado tags definidos por el servidor, por lo tanto no aplicaria los WSDL

si ven que me equivoco les agradeceria me lo digan, gracias
  #4 (permalink)  
Antiguo 21/03/2007, 16:42
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: php , xml, soap

cuando tenga mis parametros en array, podre enviarlo mediante:
$client->call(nombre_funcion_en_el_servidor, array_de_parametros)
solo que no logro obtener el array de un archivo xml, quiero usar el domxml pero solo esta habiltada para la version 4 de php, es con la que cuento, pero proximamente se hara la migracion y ya probe y en php5 no funciona, asi que estoy buscando un parser para ambas versiones de php, si saben de algun parser, si estuviera integrado en php mucho mejor, agradeceria me lo digan

el siguiente codigo fue sacado de
http://developer.apple.com/internet/...s/soapphp.html
Código PHP:
// include the SOAP classes
require_once('nusoap.php');
// define parameter array (ISBN number)
$param = array('isbn'=>'0385503954');
// define path to server application
$serverpath ='http://services.xmethods.net:80/soap/servlet/rpcrouter';
//define method namespace
$namespace="urn:xmethods-BNPriceCheck";
// create client object
$client = new soapclient($serverpath);
// make the call
$price $client->call('getPrice',$param,$namespace);
// if a fault occurred, output error info
if (isset($fault)) {
        print 
"Error: "$fault;
        }
else if (
$price == -1) {
        print 
"The book is not in the database.";
} else {
        
// otherwise output the result
        
print "The price of book number "$param[isbn] ." is $"$price;
        }
// kill object
unset($client); 
  #5 (permalink)  
Antiguo 22/03/2007, 13:47
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: php , xml, soap

resulta que el servidor remoto me permite enviar una cadena en vez de array de parametros, esto es puedo enviarle un string asi:
Código PHP:
include_once('lib/nusoap.php');
$client = new soapclient("http://services.xmethods.net:80/soap/servlet/rpcrouter");
$err $client->getError();
if (
$err) {
    echo 
'<h2>Constructor error</h2><pre>' $err '</pre>';
    exit();
}
$xml file_get_contents('archivo.xml');
$result $client->call('funcion_del_servidor_demoto'$xml); 
si todo va bien result sera la respuesta tambien en xml
ahora me surgio una nueva duda, es posible hacer la llamada al servidor sin usar soap?
en el manual que me proporcionaron sugieren:
Código:
<?xml version="1.0.1" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<!-- aqui los tags de xml->
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
pero dice que no es necesario SOAP, puede ser que se pueda llamar al servidor sin utilizar SOAP??
y otra duda, logre almacenar en un array los tags y valores del archivo xml, pero, segun vi en los codigos que hay en la red, existen varias formas de representar el arbol correspondiente al xml, y aqui va mi pregunta, existe un estandar para enviar a un servidor externo como este caso?, por que utilice los arrays que logre almacenar pero me devolvia error en todos
  #6 (permalink)  
Antiguo 23/03/2007, 09:59
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: php , xml, soap

chispas, me he quedado atorada aqui, ya tengo la conexion se realiza bien, envio xml y me devuelve xml pero me falta la transicion a php y viceversa, hay funciones que sirven solo en php 4, alguna experiencia en los parser que me acorte el camino??, necesito pasar de php a xml y de xml a php respetando la esctructura de arbol de xml
  #7 (permalink)  
Antiguo 23/03/2007, 11:20
 
Fecha de Ingreso: agosto-2004
Mensajes: 10
Antigüedad: 19 años, 8 meses
Puntos: 0
Sonrisa Re: php , xml, soap

Alguna vez hice eso para pearsear el xml que recibía del RSS feed de Yahoo! Buscando en internet encontré esta información:

www . sitepoint . com/print/php-xml-parsing-rss-1-0

Si bien es medio complejillo el código una vez que entiendes el concepto el resto es cuesta abajo, o sea muy facil de aplicar. Si necesitas ayuda me avisas por este mismo medio
PD: antes de entrar al link quita los espacios antes y despues de los puntos en www . y . com que no me permiten publicar links externos
  #8 (permalink)  
Antiguo 23/03/2007, 12:05
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: php , xml, soap

gracias por la respuesta, justo estaba revisando a profundidad las DOM Functions para manejo de documentos XML y lei el comentario del autor que mencionas
Cita:
There are two widely-used methods for programming languages to read XML documents: event-based APIs and Document Object Model (DOM [11]) APIs. In the latter class of APIs, XML documents are read into memory in their entirety and can then be manipulated through a set of functions that provide access to an object oriented model of the document (the DOM) in memory. DOM APIs are generally considered to be more powerful; however, they suffer from one serious drawback: they are ill-suited to processing large XML documents, which would take too much memory to build the model of the document.
y bueno me surgio otra duda, cual es la definicion de un documento xml grande, o largo, de cuantas lineas, o peso, estamos hablando, haciendo un calculo aproximado veo que los archivos xml que me devuelven tendran un maximo aproximado de 400 lineas, sera esto mucho para una pc comun?, digamos de 128 de RAM
  #9 (permalink)  
Antiguo 24/07/2007, 06:07
 
Fecha de Ingreso: julio-2007
Mensajes: 2
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: php , xml, soap

Hola!
Yo tengo mas dudas sobre el Soap, y es que me he quedado atascada en una parte sobre el Encoding, realmente es necesario ponerlo en el condigo? siempre me resulta el mismo error.

SoapFault exception: [Client] SOAP-ERROR: Encoding: object hasn't 'request' property in C:\xampp2\xampp\htdocs\soap.php:53 Stack trace: #0 [internal function]: SoapClient->__call('GetSubscribers', Array) #1 C:\xampp2\xampp\htdocs\soap.php(53): SoapClient->GetSubscribers(Array) #2 {main}
Request :
NULL
Response :
NULL

La forma de programar es exactamente la misma que hemos estado realizando es la misma, alguien me puede decir como solucionar este tipo de problema??? Gracias ;)
  #10 (permalink)  
Antiguo 26/10/2007, 06:40
 
Fecha de Ingreso: febrero-2004
Mensajes: 7
Antigüedad: 20 años, 2 meses
Puntos: 0
Re: php , xml, soap

estoy con el mismo problema que luz506, es decir necesito enviar un XML al webservice a través de SOAP, no creo que haya que parsearlo a array ya que el metodo call de la libreria nuSOAP en su 4to parametro permite enviar la cadena en este caso el XML
es decir,por un lado tengo el xml de la forma:

<?xml version="1.0.1" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<!-- aqui los tags de xml->
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

A eso lo guardo en una variable $parametros

y lo envio al cliente de la forma

$respuesta->$cliente->call("nombre_del_metodo","","espacio_de_dominio", $params);

Es correcta esta forma? por que obtengo error en la salida (java.lang.NullPointerException)
  #11 (permalink)  
Antiguo 26/10/2007, 07:59
 
Fecha de Ingreso: junio-2006
Ubicación: Lima, mi trabajo
Mensajes: 100
Antigüedad: 17 años, 10 meses
Puntos: 0
Re: php , xml, soap

hola
yo solucione mi problema asi:
Código PHP:
$client = new soapclient($direccion_servidor);
$resultados $client->call(''$texto_xml); 
entonces el $texto_xml es el texto en xml y obviamente $direccion_servidor es la direccion del que te brinda el servicio
luego lo que me devuelven a mi es un array, no estoy segura si eso es para todos los servidores, pero eso lo averguas imprimiendo $resultados, si es un array es manejable en php

saludos
pd. en mi caso el nombre del metodo iba dentro del xml, el formato me lo da el proveedor de servicio, y no utilice las etiquetas de soap como:

<SOAP-ENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> .....




Cita:
Iniciado por palermi Ver Mensaje
estoy con el mismo problema que luz506, es decir necesito enviar un XML al webservice a través de SOAP, no creo que haya que parsearlo a array ya que el metodo call de la libreria nuSOAP en su 4to parametro permite enviar la cadena en este caso el XML
es decir,por un lado tengo el xml de la forma:

<?xml version="1.0.1" encoding="UTF-8" ?>
<SOAP-ENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/" SOAPENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<!-- aqui los tags de xml->
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

A eso lo guardo en una variable $parametros

y lo envio al cliente de la forma

$respuesta->$cliente->call("nombre_del_metodo","","espacio_de_dominio", $params);

Es correcta esta forma? por que obtengo error en la salida (java.lang.NullPointerException)

Última edición por luz506; 26/10/2007 a las 08:16
  #12 (permalink)  
Antiguo 28/10/2007, 21:35
Avatar de Albertuxmty  
Fecha de Ingreso: octubre-2007
Mensajes: 34
Antigüedad: 16 años, 6 meses
Puntos: 1
Re: php , xml, soap

php5 ya tiene nativamente funciones de soap es mas practico y mas sencillo de usar que el nusoap ademas php4 ya esta descontinuado

http://www.php.net/soap

Saludos
  #13 (permalink)  
Antiguo 29/10/2007, 13:04
 
Fecha de Ingreso: febrero-2004
Mensajes: 7
Antigüedad: 20 años, 2 meses
Puntos: 0
Re: php , xml, soap

gracias funcionó, estaba equivocandome en el link al webservice. Y ademas

$salida=$cliente->call(...................)

no devuelve nada, la respuesta esta en $cliente->response

pero esta respuesta es un mensaje SOAP, como hago para parsearlo?

se me complica por que comienza con la cabecera http:


"HTTP/1.1 200 OK
Date: Mon, 29 Oct 2007 18:58:59 GMT
Server: Resin/2.1.17
Content-Type: text/xml; charset=iso-8859-1
Vary: Accept-Encoding
Connection: close

<?xml version="1.0" encoding="ISO-8859-1"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xm...."
  #14 (permalink)  
Antiguo 29/10/2007, 15:01
 
Fecha de Ingreso: febrero-2004
Mensajes: 7
Antigüedad: 20 años, 2 meses
Puntos: 0
Re: php , xml, soap

y tengo otra GRAN duda como hago para enviar el request sin usar HTTP, sino utilizando el protocolo SOAP. ?

Por que según la documentacion de nusoap, utilizando send se envia el mensaje a través de HTTP. como se hace para evitar eso? borrando los headers? :s

Pregunto eso por que el webservice, me devuelve un respuesta con header HTTP si le envio el request por ese protocolo, y devuelve un xml soap puro si le envio el request sin la cabecera.
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.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 14:42.