bioshock Posted March 30, 2013 at 09:43 PM Report #500949 Posted March 30, 2013 at 09:43 PM Boas. Pediram-me que fosse feito um webservice de modos a comunicar com uma aplicação externa. Isto é totalmente novo para mim, pelo que me estou a ver um bocado à rasca. Ora, eu tenho que desenhar o ficheiro 'wsdl' aquando uma inscrição. Sei que para o desenhar, utilizo o server e que para ler utilizo o client. Neste momento o "ficheiro wsdl", encontra-se da seguinte forma: <xsd:complexType name="person"> <xsd:all> <xsd:element name="id" type="xsd:int" value="1"/> <xsd:element name="nome" type="xsd:string" value="João"/> <xsd:element name="nacionalidade" type="xsd:string" value="portuguesa"/> </xsd:all> </xsd:complexType> Isto é gerado pelo nusoap.server, sem problemas. O meu problema encontra-se agora em ler esta informação, ou seja ler o conteúdo do campo "value", seja pelo 'Soap' ou pelo 'Nusoap'. Pelo que tenho visto pela net, supostamente eu teria que ter uma função no servidor. $server->register('hello', // method name array('person' => 'tns:Person'), // input parameters array('return' => 'tns:SweepstakesGreeting'), // output parameters 'urn:hellowsdl2', // namespace 'urn:hellowsdl2#hello', // soapaction 'rpc', // style 'encoded', // use 'Greet a person entering the sweepstakes' // documentation ); // Define the method as a PHP function function hello($person) { return array($person['id'], $person['nome'], $person['nacionalidade']); } Mas esta função (hello) pelo que percebo apenas me devolve uma única pessoa..e eu queria ler todos os conteúdos que estão no ficheiro Porque o documento, no final, vai ficar assim: <xsd:complexType name="person 1"> <xsd:all> <xsd:element name="id" type="xsd:int" value="1"/> <xsd:element name="nome" type="xsd:string" value="João"/> <xsd:element name="nacionalidade" type="xsd:string" value="portuguesa"/> </xsd:all> </xsd:complexType> <xsd:complexType name="person 2"> <xsd:all> <xsd:element name="id" type="xsd:int" value="1"/> <xsd:element name="nome" type="xsd:string" value="João"/> <xsd:element name="nacionalidade" type="xsd:string" value="portuguesa"/> </xsd:all> </xsd:complexType> Então, no ficheiro cliente tenho algo do género: require_once('nusoap/lib/nusoap.php'); $namespace = 'http://localhost/exemplo/servidor.php?wsdl'; $client = new nusoap_client($namespace, 'wsdl'); $result = $client->call('hello', array('person' => 'jaqim')); print_r($result); Que não funciona. E eu compreendo porquê, tenho é tentado adaptar o que vejo na net ao que preciso. Ideias?
HappyHippyHippo Posted March 30, 2013 at 10:26 PM Report #500957 Posted March 30, 2013 at 10:26 PM http://stackoverflow.com/questions/4774555/how-the-nusoap-return-array como podes ver, deverás criar um tipo de dados complexo que seja do tipo array IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bioshock Posted March 31, 2013 at 01:12 PM Author Report #501001 Posted March 31, 2013 at 01:12 PM Até que ponto é que isto se adapta ao que eu quero? A estrutura como disse, será esta: <xsd:complexType name="person"> <xsd:all> <xsd:element name="id" type="xsd:int" value="1"/> <xsd:element name="nome" type="xsd:string" value="João"/> <xsd:element name="nacionalidade" type="xsd:string" value="portuguesa"/> </xsd:all> </xsd:complexType> Multiplicada por várias vezes. O que eu preciso é ir buscar o nome do elemento + o valor do mesmo. Neste momento, estou a desenhar esta estrutura desta forma (exemplo): $server->wsdl->addComplexType( 'person', 'complexType', 'array', 'all', '', array( 'id' => array('name' => 'id', 'type' => 'xsd:int', 'value' => 1), 'nome' => array('name' => 'nome', 'type' => 'xsd:string', 'value' => 'João'), 'nacionalidade' => array('name' => 'nacionalidade', 'type' => 'xsd:string', 'value' => 'portuguesa') ) ); Atendendo ao link que me deste, fiz as devidas alterações do método register para: $server->register('gamelist', array(), array('return' => 'tns:ListArray'), 'urn:RM', 'urn:RM#gamelist', 'rpc', 'encoded', 'Greet a person entering the sweepstakes' ); Ora, isto teria de levar agora a função gamelist(). Não compreendo é o que ela devolve. Sei que é um array, mas de que dados? function gamelist(){ return array(??); } De salientar, que o WSDL está configurado da seguinte forma: $server->configureWSDL('server', 'urn:RM'); Ora, no cliente, haverá algo do género: $client = new nusoap_client($namespace, 'wsdl'); $result = $client->call('gamelist'); print_r($result);
bioshock Posted March 31, 2013 at 05:54 PM Author Report #501021 Posted March 31, 2013 at 05:54 PM Acho que já resolvi o problema. Pelo menos tenho uma ideia um pouco diferente sobre como implementar como quero. Se chegar a uma conclusão, eu apito. 👍
HappyHippyHippo Posted March 31, 2013 at 10:20 PM Report #501040 Posted March 31, 2013 at 10:20 PM experimenta isto : $this->wsdl->addComplexType( 'person', 'complexType', 'struct', 'all', '', array( 'id' => array('name' => 'id', 'type' => 'xsd:int'), 'nome' => array('name' => 'nome', 'type' => 'xsd:string'), 'nacionalidade' => array('name' => 'nacionalidade', 'type' => 'xsd:string') ) ); $this->wsdl->addComplexType( 'personList', 'complexType', 'array', '', 'SOAP-ENC:Array', array(), array( array('ref'=>'SOAP-ENC:arrayType', 'wsdl:arrayType'=>'tns:person[]') ), 'tns:person' ); $this->register( 'gamelist', array(), array('response' => 'tns:cientList'), 'urn:RM', 'urn:RM#gamelist', 'rpc', 'encoded' ); IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bioshock Posted April 1, 2013 at 04:20 PM Author Report #501095 Posted April 1, 2013 at 04:20 PM Antes de mais obrigado. Mas estou a resolver o problema de outra forma e ainda mais simples. Assim que tiver a certeza da implementação, venho cá dar a minha solução.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now