Foros del Web » Programando para Internet » PHP »

SOAP, PHP sin nusoap

Estas en el tema de SOAP, PHP sin nusoap en el foro de PHP en Foros del Web. Hola! Llevo un par de días peleando con unos ejemplos de PHP que usan un servicio web. Estos ejemplos provienen de la página de Zend. ...
  #1 (permalink)  
Antiguo 30/07/2008, 02:25
a7o
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 8 meses
Puntos: 0
SOAP, PHP sin nusoap

Hola!

Llevo un par de días peleando con unos ejemplos de PHP que usan un servicio web. Estos ejemplos provienen de la página de Zend.

El problema radica en que el cliente no consigue invocar a las funciones del servidor, pese a que se crea correctamente el SoapClient y se muestran correctamente las funciones con getFunctions(): visualizamos: array(2) { [0]=> string(30) "float getQuote(string $symbol)" [1]=> string(31) "string getPrice(string $symbol)" }. Es posible que el fichero no sea accesible desde otros ficheros por estar en una intranet, que requiere estar validado.

El error que da al llamar a la función es:
Fatal error: Uncaught SoapFault exception: [HTTP] Unauthorized in C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php:5 Stack trace: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://virtual01...', 'urn:xmethods-de...', 1, 0) #1 [internal function]: SoapClient->__call('getPrice', Array) #2 C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php(5): SoapClient->getPrice('hola') #3 {main} thrown in C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php on line 5

El codigo que tengo es:

client3.php
Código PHP:
 <?php
  $client 
= new SoapClient("stockquote.wsdl");
  
var_dump($client->__getFunctions());
  echo 
"<br>resultado: ".$client->getQuote("ibm");
?>

server1.php

Código PHP:
<?php
class QuoteService {

private 
$quotes = array("ibm" => 198.42);

function 
getQuote($symbol) {
if (isset(
$this->quotes[$symbol])) {
return 
$this->quotes[$symbol];
} else {
throw new 
SoapFault("Server","Unknown Symbol '$symbol'.");
}
}

function 
getPrice($str) {
$result"dame el precio";
return 
$result;
}
}

ini_set("soap.wsdl_cache_enabled","0");

$server = new SoapServer("stockquote.wsdl");
$server->setClass("QuoteService");
echo 
"iniciamos handle";
$server->handle();
?>
y finalmente stockquote.wsdl

Código:
<?xml version="1.0" encoding="UTF-8"?>
<definitions 	xmlns:tns="http://virtual01/XML_PHP/a7o1/" 
			xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
			xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
			xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
			xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
			xmlns="http://schemas.xmlsoap.org/wsdl/" 
			name="StockQuote" 
			targetNamespace="http://virtual01/XML_PHP/a7o1/">
	<message name="getQuoteRequest">
		<part name="symbol" type="xsd:string"/>
	</message>
	<message name="getQuoteResponse">
		<part name="result" type="xsd:float"/>
	</message>
	<message name="getPriceRequest">
		<part name="symbol" type="xsd:string"/>
	</message>
	<message name="getPriceResponse">
		<part name="result" type="xsd:string"/>
	</message>
	<portType name="StockQuotePortType">
		<operation name="getQuote">
			<input message="tns:getQuoteRequest"/>
			<output message="tns:getQuoteResponse"/>
		</operation>
	</portType>
	<portType name="StockPricePortType">
		<operation name="getPrice">
			<input message="tns:getPriceRequest"/>
			<output message="tns:getPriceResponse"/>
		</operation>
	</portType>
	<binding name="StockQuoteBinding" type="tns:StockQuotePortType">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="getQuote">
			<soap:operation soapAction="urn:xmethods-delayed-quotes#getQuote"/>
			<input>
				<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://virtual01/XML_PHP/a7o1/"/>
			</input>
			<output>
				<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://virtual01/XML_PHP/a7o1/"/>
			</output>
		</operation>
	</binding>
	<binding name="StockPriceBinding" type="tns:StockPricePortType">
		<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
		<operation name="getPrice">
			<soap:operation soapAction="urn:xmethods-delayed-quotes#getPrice"/>
			<input>
				<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://virtual01/XML_PHP/a7o1/"/>
			</input>
			<output>
				<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://virtual01/XML_PHP/a7o1/"/>
			</output>
		</operation>
	</binding>
	<service name="StockQuoteService">
		<port name="StockQuotePort" binding="tns:StockQuoteBinding">
			<soap:address location="http://virtual01/XML_PHP/a7o1/server1.php"/>
		</port>
	</service>
	<service name="StockPriceService">
		<port name="StockPricePort" binding="tns:StockPriceBinding">
			<soap:address location="http://virtual01/XML_PHP/a7o1/server1.php"/>
		</port>
	</service>
</definitions>
Es una pregunta para nota. A ver si alguien puede ayudarme o darme una pista.

Salu2 y gracias.
  #2 (permalink)  
Antiguo 30/07/2008, 03:17
Avatar de Marvin
Colaborador
 
Fecha de Ingreso: febrero-2005
Ubicación: global $Chile->Santiago;
Mensajes: 1.991
Antigüedad: 19 años, 2 meses
Puntos: 81
Respuesta: SOAP, PHP sin nusoap

Si traduces el error al castellano:
Fatal error: Uncaught SoapFault exception: [HTTP] Unauthorized in C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php:5 Stack trace: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://virtual01...', 'urn:xmethods-de...', 1, 0) #1 [internal function]: SoapClient->__call('getPrice', Array) #2 C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php(5): SoapClient->getPrice('hola') #3 {main} thrown in C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php on line 5

Queda algo como esto:
Error Fatal: Excepcion SoapFault no rescatada: [HTTP] Sin autorizacion en C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php:5 Trazo estancado: #0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'http://virtual01...', 'urn:xmethods-de...', 1, 0) #1 [internal function]: SoapClient->__call('getPrice', Array) #2 C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php(5): SoapClient->getPrice('hola') #3 {main} thrown in C:\Inetpub\wwwroot\XML_PHP\a7o1\client3.php on line 5

Al parecer sucede porque no tienes autorizacion para hacer el request de los datos, por lo tanto podria ser un tema de permisos a virtual01.

Agregando otra observacion, cuando sucede esto, en tu codigo no tienes un try - catch al hacer la llamada desde client3.php, por lo tanto el error fatal que te tira es que no estas haciendo el rescate de los datos a traves de esta sentencia.

Suerte!
__________________
El que dice "Solo sé que nada sé", esta asumiendo que sabe algo.
Lea las FAQ's!
  #3 (permalink)  
Antiguo 31/07/2008, 01:30
a7o
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: SOAP, PHP sin nusoap

Hola,

En efecto, el problema viene de los permisos en el iis que no deja acceder al fichero por su ruta http://virtual01/.../stockquote.wsdl.

Probe ese mismo ejemplo en otra maquina, en un apache de xampp y funcionaba correctamente. Entonces puse el fichero stockquote.wsdl en mi ordenador, junto al fichero servidor, y el cliente situado en la otra máquina (virtual01) hace las llamadas correctamente y funciona.

Por tanto ahora mi problema es conseguir que virtual01 permita el acceso con http://virtual01/.... y así funcione el fichero en ese servidor, que es el objetivo. Supongo que la pelea sea con el IIS 6 que tiene instalado.

Salu2.
  #4 (permalink)  
Antiguo 31/07/2008, 04:42
a7o
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: SOAP, PHP sin nusoap

Resuelto permitiendo el acceso anonimo a la carpeta donde esta el fichero wsdl.

Salu2.
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 18:59.