Hola a todos, soy nuevo por aca.
Tengo una problema que no he podido resolver aún (he estado varios dias dandole vuelta por todas partes)
Estoy creando un WebService sin nusoap(y no pienso usarlo), usando directamente las clases que ofrece PHP. El problema esta cuando llamo una función usando un cliente de mi servicio (uso el WcfTestClient) este me lo rechaza diciendo que no puede deserializar la salida.
Este es el dato que quiero retornar.
<xsd:complexType name="Target">
<xsd:all>
<xsd:element name="id" type="xsd:int"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="contador" type="xsd:int"/>
<xsd:element name="max_contador" type="xsd:int"/>
</xsd:all>
</xsd:complexType>
Esta es la clase que deberia ser la clase del dato que envio
class Target{
var $id;
var $name;
var $contador;
var $max_contador;
function Target($id, $name, $contador, $max_contador)
{
$this->id= $id;
$this->name = $name;
$this->contador = $contador;
$this->max_contador = $max_contador;
}
}
La función previamente registrada por el server y describida por el WSDL
function achievements($session){
//aqui retorno un dato cualquiera, pero sin embargo me lo rechaza el cliente.
$struct = new Target(1, "LOL",1,10);
return $struct;
}
El servidor Soap en PHP.
$classmap = array('Target'=>'Target');
$param = array(
'encoding'=>'UTF-8',
'soap_version' => SOAP_1_2,
"classmap"=>$classmap
);
$server = new SoapServer("gameCommunity.wsdl",$param);
$server->addFunction('achievements');
$server->handle();
Realmente no se en donde puede estar el problema, siendo que sí uso los datos primitivos como int, string, boolean, etc... el cliente de prueba me los acepta bien sin embargo, sí defino un dato, este me lo rechaza.
Espero encontrar aqui la solución ya que he perdido mucho tiempo buscando la solución.
Les agradezco de antemano, muchas gracias Saludos a todos.
Hasta que porfín encontre el error (fue casualidad)
Tenia describido el mensaje de salida esta manera
<message name="AchievementsOutput">
<part name="return" type="xsd:Target" />
</message>
Y era
<message name="AchievementsOutput">
<part name="return" type="tns:Target" />
</message>
Se fijaron TRES LETRAS producia mi error!!!
Ya gracias por todos los que se dignaron por lo menos leer el tema.
Saludos a todos!
Nota al Moderador:
Sorry por el doublepost.
Hola! leyendo tu tema me intereso mucho, es que tengo un problema no se si me puedes decir cual de las funciones tienes descritas en el archivo WSDL es que me urgeeeeeeeeeee :huh:
Ya no recuerdo bien aqui está el WSDL xD
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://localhost/gameCommunity"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://localhost/gameCommunity">
<wsdl:types>
<xsd:schema targetNamespace="http://localhost/gameCommunity" elementFormDefault="qualified">
<xsd:complexType name="Target">
<xsd:sequence>
<xsd:element name="id" type="xsd:int"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="contador" type="xsd:int"/>
<xsd:element name="max_contador" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Achievement">
<xsd:sequence>
<xsd:element name="id" type="xsd:int"/>
<xsd:element name="name" type="xsd:string" />
<xsd:element name="targets" minOccurs="1" maxOccurs="10" type="tns:Target" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="ArrayOfAchievement">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1200" minOccurs="1" name="item" type="tns:Achievement"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="UnlockCode">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="unlock_false" />
<xsd:enumeration value="unlock_true" />
<xsd:enumeration value="unlock_complete" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="UnlockParam">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" name="session" type="xsd:string" />
<xsd:element minOccurs="1" name="logro" type="xsd:int" />
<xsd:element minOccurs="1" name="objetivo" type="xsd:int" />
<xsd:element minOccurs="1" name="veces" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<xsd:element name="Status">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="status_ok" />
<xsd:enumeration value="status_wrong_user" />
<xsd:enumeration value="status_enabled_server" />
<xsd:enumeration value="status_server_temporarily_disabled" />
<xsd:enumeration value="status_server_off" />
<xsd:enumeration value="status_irc_server_is_disabled" />
<xsd:enumeration value="status_requires_an_update" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="AuthParam">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOcurrs="1" name="username" type="xsd:string" />
<xsd:element minOcurrs="1" name="game" type="xsd:string" />
<xsd:element minOcurrs="1" name="ver" type="xsd:int" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Auth">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOcurrs="1" name="nonce" type="xsd:string" />
<xsd:element minOcurrs="1" name="info" type="xsd:string" />
<xsd:element minOcurrs="1" name="status" type="tns:Status" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="LoginParam">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" name="username" type="xsd:string"/>
<xsd:element minOccurs="1" name="password" type="xsd:string"/>
<xsd:element minOccurs="1" name="authcode" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Session">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" name="session_key" type="xsd:string"/>
<xsd:element minOccurs="1" name="time_expire" type="xsd:int"/>
<xsd:element minOccurs="1" name="time_last_login" type="xsd:int"/>
<xsd:element minOccurs="1" name="ip_last_login" type="xsd:string"/>
<xsd:element minOccurs="1" name="game_achievement_score" type="xsd:int"/>
<xsd:element minOccurs="1" name="total_achievement_score" type="xsd:int"/>
<xsd:element minOccurs="1" name="game_highscore" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</wsdl:types>
<wsdl:message name="AuthInput">
<wsdl:part name="parameters" element="tns:AuthParam" />
</wsdl:message>
<wsdl:message name="AuthOutput">
<wsdl:part name="parameters" element="tns:Auth" />
</wsdl:message>
<wsdl:message name="LoginInput">
<wsdl:part name="parameters" element="tns:LoginParam" />
</wsdl:message>
<wsdl:message name="LoginOutput">
<wsdl:part name="parameters" element="tns:Session" />
</wsdl:message>
<wsdl:message name="UnlockInput">
<wsdl:part name="parameters" element="tns:UnlockParam" />
</wsdl:message>
<wsdl:message name="UnlockOutput">
<wsdl:part name="parameters" element="tns:UnlockCode" />
</wsdl:message>
<wsdl:message name="AchievementsInput">
<wsdl:part name="parameters" element="tns:Session" />
</wsdl:message>
<wsdl:message name="AchievementsOutput">
<wsdl:part name="parameters" element="tns:ArrayOfAchievement" />
</wsdl:message>
<wsdl:message name="AchievementsImageInput">
<wsdl:part name="parameters" element="tns:AchievementsImageParam" />
</wsdl:message>
<wsdl:message name="AchievementsImageOutput">
<wsdl:part name="parameters" element="tns:ArrayOfData" />
</wsdl:message>
<wsdl:portType name="AuthPortType">
<wsdl:operation name="Auth">
<wsdl:input message="tns:AuthInput" wsaw:Action="http://localhost/gameCommunity/auth"/>
<wsdl:output message="tns:AuthOutput" wsaw:Action="http://localhost/gameCommunity/auth"/>
</wsdl:operation>
<wsdl:operation name="Login">
<wsdl:input message="tns:LoginInput" wsaw:Action="http://localhost/gameCommunity/login"/>
<wsdl:output message="tns:LoginOutput" wsaw:Action="http://localhost/gameCommunity/login"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:portType name="AchievementPortType">
<wsdl:operation name="Unlock">
<wsdl:input message="tns:UnlockInput" wsaw:Action="http://localhost/gameCommunity/unlock"/>
<wsdl:output message="tns:UnlockOutput" wsaw:Action="http://localhost/gameCommunity/unlock" />
</wsdl:operation>
<wsdl:operation name="Achievements">
<wsdl:input message="tns:AchievementsInput" wsaw:Action="http://localhost/gameCommunity/achievements"/>
<wsdl:output message="tns:AchievementsOutput" wsaw:Action="http://localhost/gameCommunity/achievements"/>
</wsdl:operation>
<wsdl:operation name="AchievementsImage">
<wsdl:input message="tns:AchievementsImageInput" wsaw:Action="http://localhost/gameCommunity/achievementsImage"/>
<wsdl:output message="tns:AchievementsImageOutput" wsaw:Action="http://localhost/gameCommunity/achievementsImage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AuthBinding" type="tns:AuthPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Auth">
<soap:operation soapAction="http://localhost/gameCommunity/auth" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="Login">
<soap:operation soapAction="http://localhost/gameCommunity/login" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="AchievementBinding" type="tns:AchievementPortType">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Unlock">
<soap:operation soapAction="http://localhost/gameCommunity/unlock" style="document"/>
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="Achievements">
<soap:operation soapAction="http://localhost/gameCommunity/achievements" style="document"/>
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="AchievementsImage">
<soap:operation soapAction="http://localhost/gameCommunity/achievementsImage" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="GameCommunity">
<wsdl:port name="AuthPort" binding="tns:AuthBinding">
<soap:address location="http://localhost/gameCommunity/Auth.php"/>
</wsdl:port>
<wsdl:port name="AchievementPort" binding="tns:AchievementBinding">
<soap:address location="http://localhost/gameCommunity/achievement.php"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Ahí está xD
Siempre que trabajo con web services, antes de realizar un cliente para que consuma el web services, utilizo SoapUI para verificar que todo este correctamente y asi descarto que cualquier problema futuro pueda ser con el web services.