Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Filipe_Moraes

php + nusoap

Recommended Posts

Olá pessoal.

Estou fazendo um webservice com php + nusoap.

 

Primeiro, é uma escolha profissional? ou nusoap é muito básico e não é usado para um webservice que necessita ser de confiança?

 

Segundo, eu vi exemplos em que se faz o print do resultado em tela.

$result = $client->call('hello',array('filipe'));
print_r($result);

 

Eu gostaria de saber como faço para no servidor retornar mais de um parâmetro, passava o nome "filipe" e o servidor retornava o xml com o nome, idade, sexo, altura, peso, etc... no momento está assim o meu ficheiro php no servidor:

...
$server->register('hello');
function hello($name) {
return 'Hello '.$name;
}

e como no cliente faria para trabalhar como esses dados sem ser pelo print e sim no xml?

 

Terceira dúvida, tem como retornar em outros formatos, como JSON por exemplo?

 

Agradecia a vissa ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, é uma escolha profissional? ou nusoap é muito básico e não é usado para um webservice que necessita ser de confiança?

Por ser uma biblioteca criada para o PHP 4 (carece de fontes :pinch:) eu prefiro utilizar as bibliotecas de WebService nativas do PHP. Nusoap também possui conflito com SOAP do PHP.

 

A dificuldade da SOAP é a criação do WSDL, o qual deve ser feito no braço. Exceto se você utilizar um web service non-wsdl. A diferença entre eles é que, com WSDL funciona para qualquer linguagem de programação. O non-wsdl funciona somente para PHP.

 

No WSDL você pode definir o tipo de dados como complexo (complex type). Nele você pode definir o retorno de qualquer dado que não seja primitivo (como por exemplo objetos).

 

Aqui há boas explicação sobre o assunto:

Understanding W3C Schema Complex Types

Annotated WSDL Examples

 

Sobre esse assunto, você só vai encontrar bons materiais em inglês. Muitas traduções ruins estão por ai.

 

como JSON por exemplo?

Eu utilizaria um json_encode para retornar uma string, resolve boas dores de cabeça. Se não há essa possibilidade. Utilize complex type mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

Não entendi uma coisa, no exemplo que citei acima não foi configurado nenhum WSDL e mesmo assim consegui fazer print do resultado.

Como funcionou?

 

Agradeço a ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo o que eu entendo do nu-soap, ele cria automaticamente o XML do WSDL, por isso da sua facilidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço a sua ajuda até aqui. :)

Mas usando o nativo do php, imagina que eu quero retornar a idade, peso e altura mas sem usar o "json_encode", como seria? Não estou conseguindo chegar a um entendimento sobre isso.

Como seria o meu "server.php" e "cliente.php"?

Até agora só vi exemplos que se faz o print do resultado, se o retorno for algo mais complexo, o "result" (de acordo com o exemplo que postei acima) será um xml?

 

Agradecia a ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como já mencionado, você pode retornar tipos de dados primitivos:

 

- Int/Integer;

- Float/double;

- Char;

- String;

- Array;

 

No Stack Overflow, encontrei que para o retorno de classes, stdClass, você precisa "transformá-la" em um array. O que poderia ser útil é o serialize também.

http://stackoverflow.com/questions/3621603/how-to-encode-php-object-to-nusoap-response

 

 

Até agora só vi exemplos que se faz o print do resultado

É o exemplo mais básico de WebService. É como se fosse o nosso "Hello World".

 

 

Seguindo esse ponto, você pode retornar como um array.

http://www.koopman.me/2008/01/nusoap-wsdl-service-return-array-of-complex-data/

 

Declarando o ComplexType array (exemplo retirado do link acima):

$server->wsdl->addComplexType(
   'Contact',
   'complexType',
   'struct’,
   'all',
   '',
   array(
       'contact' => array('name' => 'contact', 'type' => 'xsd:string'),
       'email' => array('name' => 'email', 'type' => 'xsd:string'),
   )
);

 

Depois você registra o array com o método register e usa normalmente o WS.

 

Estou um tanto sem tempo para postar uma resposta mais completa, se tiveres dúvidas ainda, post aqui. Pela tarde terei mais tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gabriel Heming.

Talvez a origem de todas as duvidas está no WSDL.

Eu até consigo fazer os exemplos funcionarem, mas na hora de modifica-los da zebra.

Por exemplo, peguei um exemplo no qual a função não tinha parâmetros, tentei colocar parâmetros e já não funciona.

Talvez falte algo no WSDL...

 

Vou procurar mais informações sobre esse assunto, porque não estou conseguindo chegar lá.

 

Obrigado pela sua ajuda e pelo seu tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu aprendi WSDL em alguns tutoriais na internet e principalmente neste daqui:

http://www.phpeveryday.com/articles/Web-Services-WSDL-Testing-with-SOAP-Client-P477.html

 

Ele é bem básico, mas explica muita coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu aprendi WSDL em alguns tutoriais na internet e principalmente neste daqui:

http://www.phpeveryday.com/articles/Web-Services-WSDL-Testing-with-SOAP-Client-P477.html

 

Ele é bem básico, mas explica muita coisa.

 

Muito obrigado pela sua paciência e pelo seu tempo.

Vou dar uma estudada nesse link.

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

"Não tem por onde".

 

Entender sobre WSDL não é fácil na primeira vista, mas com o tempo pega-se o jeito da coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu li o que estava no link que você passou.

Será que podia me ajudar mais uma vez?

Comecei a compreender mas tenho uma dúvida de como adicionar mais de uma função no meu server.

veja, eu tenho o meu client.php da seguinte forma:

<?php
$sClient = new SoapClient('http://localhost:8080/webservice/service.wsdl');
$params = "teste";
$response = $sClient->doHello($params);
var_dump($response);
?>

 

O ficheiro server.php ficou da seguinte forma:

<?php
ini_set("soap.wsdl_cache_enabled","0");
$server = new SoapServer("service.wsdl");

function doHello($yourName){
return "Hello, ".$yourName;
}

$server->AddFunction("doHello");
$server->handle();
?>

 

O meu service.wsdl ficou da seguinte forma:

<?xml version="1.0"?>
<definitions name="HelloWorld" targetNamespace="urn:HelloWorld" xmlns:tns="urn:HelloWorld"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">

 <types>
   <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:Hello">
       <xsd:element name="getName" type="xsd:string" />
       <xsd:element name="HelloResponse" type="xsd:string" />                  
   </xsd:schema>                   
 </types>

 <message name="doHello">
   <part name="yourName" type="tns:getName" />
 </message>  
 <message name="doHelloResponse">
   <part name="return" type="tns:HelloResponse" />
 </message>  

 <portType name="HelloPort">
   <operation name="doHello">
       <input message="tns:doHello" />
       <output message="tns:doHelloResponse" />
   </operation>
 </portType>

 <binding name="HelloBinding" type="tns:HelloPort">
   <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
         <operation name="doHello">
           <soap:operation soapAction="urn:HelloAction" />
               <input>
                 <soap:body use="encoded" namespace="urn:Hello" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />             
               </input>
               <output>
                 <soap:body use="encoded" namespace="urn:Hello" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />             
               </output>
         </operation>
 </binding>

 <service name="HelloService">
   <port name="HelloPort" binding="tns:HelloBinding">
         <soap:address location="http://localhost:8080/webservice/server.php" />
       </port>
 </service>

</definitions>

 

Queria adicionar mais uma função no server.php, mas estou com dificuldades em configurar o service.wsdl. Como seria?

 

Muito obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.