Ir para conteúdo

POWERED BY:

Arquivado

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

TomCamara

[Resolvido] Consumindo WebService

Recommended Posts

Olá Pessoal, bom dia a todos.

Tenho a seguinte dúvida:

Atualmente para consumir um webservice q eu utilizo no meu sistema, estou usando NuSOAP, ou seja eu crio um XML de requisição envio a requisição via NuSoap e em seguida obtenho a resposta do webservice.

 

Gostaria de saber se o cake já possui algum componente nativo para suporte a webservice. Alguem poderia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, estou tendo problemas para definir o serviço de envio da nota, no seguinte trecho do código

 

javax.xml.ws.Service service = javax.xml.ws.Service.create(new java.net.URL(url), new javax.xml.namespace.QName(namespace, serviceName));

 

apresenta o erro:

javax.xml.ws.WebServiceException: The following WSDL exception occurred: WSDLException: faultCode=WSDL4JWrapper : : WSDLException: faultCode=WSDL4JWrapper : : Received fatal alert: handshake_failure

 

alguém já passou por isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá comunidade,

 

Estou enfrentando dificuldades por não saber usar o nuSOAP no cakePHP. Por exemplo, como fazer o exercício do Mauricio Reckziegel funcionar no cake? Ele postou um tutorial básico sobre soap e nusoap com PHP aqui no iMasters: http://imasters.com.br/artigo/4535/php/construindo_web_services_em_php/ (Construindo Web Services em PHP)

 

Qualquer ajuda ou dica será bem vinda...

 

Grato!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá comunidade,

 

Estou enfrentando dificuldades por não saber usar o nuSOAP no cakePHP. Por exemplo, como fazer o exercício do Mauricio Reckziegel funcionar no cake? Ele postou um tutorial básico sobre soap e nusoap com PHP aqui no iMasters: http://imasters.com.br/artigo/4535/php/construindo_web_services_em_php/ (Construindo Web Services em PHP)

 

Qualquer ajuda ou dica será bem vinda...

 

Grato!

 

Cara, recentemente eu estava na mesma situação sua, nuSoap é atraso de vida cara. Dá uma olhada nisso:

 

http://bakery.cakephp.org/articles/char101/2009/06/05/a-component-to-help-creating-soap-services

 

LEMBRANDO QUE APÓS TERMINAR DE COPIAR TUDO CORRETAMENTE, LEIA OS COMMENTS EM BAIXO QUE VÃO EXPLICAR OS ERROS QUE VÃO APARECER, ARRUMANDO CERTINHO VOCÊ VAI TER SEUS MODELS RESPONDENDO O WSDL AUTOMATICAMENTE.

 

QQ DUVIDA POSTA AI

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá elias_farah!

 

Obrigado pelas dicas. Eu vou ler, testar e estudar aquelas configurações. Mas, por ora, informo que consegui fazer o exercício do Mauricio Reckziegel - o que usa o SOAP nativo do PHP - funcionar no cakePHP. Vejam:

 

:::::: A - Controler que faz o papel de cliente do serviço:

class ClientesController extends AppController {

var $name = 'Clientes';

var $uses = array();
       function index() 
{
		$this->layout = '';
		$caminho = "http://localhost/LABORATORIO/WEBSERVICE/cake_1.2.5/servidores/"; # Localização do arquivo do servidor de serviço
		$uri = "http://localhost/LABORATORIO/WEBSERVICE/cake_1.2.5/"; # Endereço do servidor de serviço
		$client = new SoapClient(null, 
			array
			(
				'location' => $caminho,
				'uri' => $uri,  		 	
				'trace' => 1
			)
		);
		$nome = array(); $nome[] = 'Christiano'; $nome[] = 'Araújo';
		$result = $client->ola($nome[1]); 
		if (is_soap_fault($result))
		{
			trigger_error("SOAP Fault: (faultcode: {$result->faultcode},
			faultstring: {$result->faulstring})", E_ERROR);
		}
		else
		{
			echo "Resultado Encontrado : <br><br>";
			print_r($result);
		}
}
}

 

 

 

 

 

:::::: B - Controler que faz o papel de servidor do serviço:

class ServidoresController extends AppController {

var $name = 'Servidores';

var $uses = array();
       function index() 
{
		$this->layout = '';
		$caminho = "http://localhost/LABORATORIO/WEBSERVICE/cake_1.2.5/";
		$server = new SoapServer(null, array('uri' => $caminho));  
		function ola($name) 
		{
			return 'Olá '.$name.'! O SOAP nativo do PHP está funcionando...';
		}
		$server->addFunction("ola");
		if ($_SERVER["REQUEST_METHOD"]== "POST") 
		{
				$server->handle();
		} 
		else 
		{
			$functions = $server->getFunctions();
			foreach ($functions as $func) 
			{
				print $func. "<br>";
			}
		}	
}
}

 

 

 

No entanto o mesmo não acontece com o nuSOAP. :(

 

Quando tentei utilizar a mesma estrutura para o nuSOAP recebi a mensagem de erro a seguir:

 

Array ( [faultcode] => SOAP-ENV:Client [faultactor] => [faultstring] => error in msg parsing: xml was empty, didn't parse! [detail] => )

 

OU

 

Array

(

[faultcode] => SOAP-ENV:Client

[faultactor] =>

[faultstring] => error in msg parsing:

xml was empty, didn't parse!

[detail] =>

)

 

 

 

Os códigos utilizados para o nuSOAP foram estes:

 

 

:::::: A - Controler que faz o papel de cliente do serviço:

class ClientesController extends AppController {

var $name = 'Clientes';

var $uses = array();
       function index() 
{
		$this->layout = '';
		require_once('lib/nusoap.php');
		$client = new nusoap_client('http://localhost/LABORATORIO/WEBSERVICE/cake_1.2.5/servidores/'); // Estou usando esta sintaxe para funcionar mesmo com SOAP nativo do PHP ativado.
		$result = $client->call('hello',array('Mauricio Reckziegel (nusoap com SOAP nativo do PHP ativado)'));
		print_r($result);
}
}

 

 

 

 

 

:::::: B - Controler que faz o papel de servidor do serviço:

class ServidoresController extends AppController {

var $name = 'Servidores';

var $uses = array();
       function index() 
{
		$this->layout = '';
		require_once('lib/nusoap.php');
		$server = new soap_server;
		$server->register('hello');
		function hello($name) 
		{
			return 'Hello '.$name;
		}
		$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
		$server->service($HTTP_RAW_POST_DATA);	
}
}

 

Quem quiser ajudar, agradeço desde já. Qualque dica será bem vinda!!! Enquanto isso, testarei as informações do link do Elias...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguindo o caminho mostrado acima, minha dúvida agora é como retornar o resultado de um consulta no return da funcao ola:

 

function ola($name) 
{
$this->loadModel('Equipamentos');
$lista = $this->Equipamentos->find('all', array('conditions' => array('Equipamentos.numserie' => '111.222.345/112')));
       return $this->$lista;

#return $lista;
}

 

 

Alguém poderia me explicar como eu retorno estes valores? Quando não uso $this, obtenho a seguinte mensagem de erro:

 

<br />

<b>Fatal error</b>: Uncaught SoapFault exception: [sOAP-ENV:Server] Using $this when not in object context in /var/www/mikrotik/teste/cake_1.2.5/app/controllers/clientes_controller.php:43

Stack trace:

#0 [internal function]: SoapClient->__call('ola', Array)

#1 /var/www/mikrotik/teste/cake_1.2.5/app/controllers/clientes_controller.php(43): SoapClient->ola('Ara??jo')

#2 /var/www/mikrotik/teste/cake_1.2.5/cake/libs/object.php(116): ClientesController->index()

#3 /var/www/mikrotik/teste/cake_1.2.5/cake/dispatcher.php(227): Object->dispatchMethod('index', Array)

#4 /var/www/mikrotik/teste/cake_1.2.5/cake/dispatcher.php(194): Dispatcher->_invoke(Object(ClientesController), Array)

#5 /var/www/mikrotik/teste/cake_1.2.5/app/webroot/index.php(88): Dispatcher->dispatch(NULL)

#6 {main}

thrown in <b>/var/www/mikrotik/teste/cake_1.2.5/app/controllers/clientes_controller.php</b> on line <b>43</b><br />

 

 

 

Já quando eu uso:

 

<br />

<b>Fatal error</b>: Uncaught SoapFault exception: [Client] looks like we got no XML document in /var/www/mikrotik/app/controllers/clientes_controller.php:22

Stack trace:

#0 [internal function]: SoapClient->__call('ola', Array)

#1 /var/www/mikrotik/app/controllers/clientes_controller.php(22): SoapClient->ola('111.222.345/112')

#2 /var/www/mikrotik/cake/libs/object.php(116): ClientesController->index()

#3 /var/www/mikrotik/cake/dispatcher.php(227): Object->dispatchMethod('index', Array)

#4 /var/www/mikrotik/cake/dispatcher.php(194): Dispatcher->_invoke(Object(ClientesController), Array)

#5 /var/www/mikrotik/app/webroot/index.php(88): Dispatcher->dispatch(NULL)

#6 {main}

thrown in <b>/var/www/mikrotik/app/controllers/clientes_controller.php</b> on line <b>22</b><br />

 

 

Ãgradeço desde já a atenção...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dê apenas "return $lista;"

O problema da exception não tem nada a ver com o return, parece que você está recebendo algum xml inválido, dê uma olhada nessa parte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá lucaswxp,

 

O primeiro quote já mostra o resultado para o return sem $this.

 

Mas eu consegui fazer o soap trabalhar sem fugir muito ao que já foi apresentado acima, veja:

 

::::::::: Este é o servidor:

       function index() 
{
	$this->layout = '';

	$caminho = "http://111.111.111.111/mikrotik/";
	$server = new SoapServer(null, array('uri' => $caminho));  

	function consultamkt($idnserie = null)
	{
		$userInstance = ClassRegistry::init('Equipamento');

		$result = $userInstance->find('all', array('conditions' => array('Equipamento.idnumserie' => $idnserie), 'fields' => array('Equipamento.idnumserie', 'Equipamento.id')));
		[color="#FF0000"]// Aqui eu faço um tratamento pois a resposta é diferente caso o array venha com todos os valores de uma única vez ou um índice por vez (cliente em loop).[/color]
                       if(count($idnserie) < 2)
		{
			if(empty($result))
			{
				$listaMKT['idnumserie'] = $idnserie;
				$listaMKT['resp'] = 'FALSE';
				$listaMKT['msg'] = 'Esta placa <strong>NÃO</strong> está cadastrada no ***.';
				$listaMKT['data'] = date('d/m/Y').' - '.date('H:i:s');
			}
			else
			{
				$listaMKT['idnumserie'] = $result[0]['Equipamento']['idnumserie'];
				$listaMKT['id'] = $result[0]['Equipamento']['id'];
				$listaMKT['resp'] = 'TRUE';
				$listaMKT['msg'] = 'Placa identificada na base de dados do ***.';
				$listaMKT['data'] = date('d/m/Y').' - '.date('H:i:s');
			}
		}
		else
		{
			for($x=0; $x < count($result); $x++)
			{


				$array[] = $cadastrados['cadastrados'][] = $result[$x]['Equipamento']['idnumserie'];

				$cadastrados['PENDENTES'] = array_diff($idnserie, $array);
				$cadastrados['PENDENTES'] = array_values($cadastrados['PENDENTES']);
				$cadastrados['PENDENTES']['resp'] = 'FALSE';
				$cadastrados['PENDENTES']['data'] = date('d/m/Y').' - '.date('H:i:s');
			}
			$cadastrados['cadastrados']['resp'] = 'TRUE';
			$cadastrados['cadastrados']['data'] = date('d/m/Y').' - '.date('H:i:s');
			$listaMKT = $cadastrados;
		}
		return $listaMKT;
	}

	$server->addFunction("consultamkt");

	if ($_SERVER["REQUEST_METHOD"]== "POST") 
	{
			$server->handle();
	} 
	else 
	{
		$functions = $server->getFunctions();
		foreach ($functions as $func) 
		{
			print $func. "<br>";
		}
	}

}

 

 

 

 

::::::::: Este é o cliente:

                       $this->layout = '';
		$caminho = "http://111.111.111.111/mikrotik/servidores/"; # Localização do arquivo do servidor de serviço
		$uri = "http://111.111.111.111/mikrotik/"; # Endereço do servidor de serviço
		$client = new SoapClient(null, 
			array
			(
				'location' => $caminho,
				'uri' => $uri,  		 	
				'trace' => 1
			)
		);

		$idnserie = array(); $idnserie[] = '222'; $idnserie[] = '444'; $idnserie[] = '1428'; $idnserie[] = '1314'; $idnserie[] = '111'; $idnserie[] = '554'; $idnserie[] = '810';

		#$result = $client->consultamkt($idnserie); [color="#FF0000"]// para enviar tudo de uma única vez...[/color]

		[color="#FF0000"]// para enviar cada índice do array por vez[/color]
		for($x = 0; $x < count($idnserie); $x++)
		{
			$result[] = $client->consultamkt($idnserie[$x]); 
		}


		if (is_soap_fault($result))
		{
			trigger_error("SOAP Fault: (faultcode: {$result->faultcode},
			faultstring: {$result->faulstring})", E_ERROR);
		}
		else
		{
			echo "Resultado Encontrado : <br><br>";
			pr($result);
		}

 

 

O que fez a diferença foi instanciar a classe dentro da função:

 

$userInstance = ClassRegistry::init('Equipamento');

 

Eu não sei se um load faria a mesma coisa, mas como estou com pressa pois isto é um trabalho real, deixarei outros testes para depois.

 

Obrigado pela atenção de todos vocês.

 

 

Christiano G. de Araújo

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.