Jump to content

Webservices


bioshock

Recommended Posts

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?

Link to comment
Share on other sites

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

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.