Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

bioshock

Webservices

Mensagens Recomendadas

bioshock

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

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);

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

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. :thumbsup:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bioshock

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.