Jump to content
bioshock

Webservices

Recommended Posts

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?

Share this post


Link to post
Share on other 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);

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.