TomCamara 0 Denunciar post Postado Setembro 23, 2010 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
Gambazinho 0 Denunciar post Postado Setembro 23, 2010 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
cga_desenvolvimento 0 Denunciar post Postado Abril 20, 2011 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
elias_farah 0 Denunciar post Postado Abril 20, 2011 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
cga_desenvolvimento 0 Denunciar post Postado Abril 25, 2011 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
cga_desenvolvimento 0 Denunciar post Postado Abril 25, 2011 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
lucaswxp 22 Denunciar post Postado Abril 27, 2011 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
cga_desenvolvimento 0 Denunciar post Postado Maio 2, 2011 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