giesta 29 Denunciar post Postado Abril 29, 2015 Boa Noite pessoal. Não tenho nenhuma intimidade com a integracao de sistemas, mas tive que fazer da noite pro dia uma integracao via WS. Então fiz meu dever de casa e estudei um pouco, tenho entao o seguinte codigo que eu montei: <?php try { $wsdl_pre = "http://smh.ana.gov.br:8090/ws-telemetria-htc/services/inserirMedicoes?wsdl"; $wsdl_pro = "http://www.snirh.gov.br/app-ws-telemetria-htc/services/inserirMedicoes?wsdl"; $config_soap = array("trace"=>1,"exceptions"=>1); $soap_client = new SoapClient($wsdl_pre,$config_soap); $login = "11111"; $senha = "AAAAA"; $codigoFlu = "000000"; $codigoPlu = "222222"; $chuva = "0.0"; $dataMedicao = "16/04/2015 22:00:00"; $nivel = "100"; $vazao = "1500.00"; $xml_header = "<soapenv:Envelope></soapenv:Envelope>"; $xml = new SimpleXMLElement($xml_header); #Fabrica de Linguica $xml->addAttribute('xmlns:soapenv' ,"http://schemas.xmlsoap.org/soap/envelope/"); $xml->addAttribute('xmlns:q0' , "http://ws.integracao.ana.gov.br/"); $xml->addAttribute('xmlns:xsd' , "http://www.w3.org/2001/XMLSchema"); $xml->addAttribute('xmlns:xsi' , "http://www.w3.org/2001/XMLSchema-instance"); #Nivel Body $body = $xml->addChild('soapenv:Body'); #Nivel Inserir Medicao $inserirmedicao = $body->addChild('ws:inserirMedicao'); #Nivel 1 - Login e Senha $inserirmedicao->addChild('login' ,$login); $inserirmedicao->addChild('senha', $senha); #Nivel 2 - Estacao $estacao = $inserirmedicao->addChild('estacao'); $estacao->addChild('codigoFlu', $codigoFlu); $estacao->addChild('codigoPlu', $codigoPlu); #Nivel 3 - Medicao $medicao = $estacao->addChild('medicao'); $medicao->addChild('chuva', $chuva); $medicao->addChild('dataMedicao', $dataMedicao); $medicao->addChild('nivel', $nivel); $medicao->addChild('vazao', $vazao); echo "Enviado: "; echo $xml->asXML(); $soap_client->inserirMedicao($xml->asXML()); echo "<br>"; echo "Recebido: "; echo $soap_client->__getLastResponse(); } catch(SoapFault $e) { echo $e->getMessage(); } echo "<br> Executado ateh o fim"; ?> Quando o sistema vai dar echo no Enviado ele "come" as coisas q estão antes do ":" e o sistema retorna sempre como usuario e senha invalidos. Ao tentar com tudo completo pelo soapUI funciona normalmente. Ao tentar o valor que esta presente no "Enviado" o soapUI retorna com erro de parsing de XML. Onde eu estou errando? Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 29, 2015 No momento em que você utiliza a biblioteca SOAP, não há mais necessidade em converter os dados para WS, apenas usufruir dos métodos. Aqui você vai encontrar um exemplo similar bem detalhado. http://forum.imasters.com.br/topic/535213-enviar-xml-via-soap/ Compartilhar este post Link para o post Compartilhar em outros sites
giesta 29 Denunciar post Postado Abril 29, 2015 Gabriel, obrigado pela resposta. Mas nesse caso como eu faço o child do xml? Eu teria que criar outra classe dentro da própria classe? Eu preciso passar através da função inserirMedicao o seguinte xml <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://ws.integracao.ana.gov.br/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <q0:inserirMedicao> <login>login1</login> <senha>senha1</senha> <estacao> <codigoFlu>10100000</codigoFlu> <codigoPlu>00212223</codigoPlu> <medicao> <chuva>0.0</chuva> <dataMedicao>16/03/2011 05:05:00</dataMedicao> <nivel>345.6</nivel> <vazao>1234.5</vazao> </medicao> <medicao> <chuva>1.0</chuva> <dataMedicao>16/03/2011 06:05:00</dataMedicao> <nivel>345.9</nivel> <vazao>1234.9</vazao> </medicao> </estacao> </q0:inserirMedicao> </soapenv:Body> </soapenv:Envelope> e o retorno (source) do php tem sido Enviado: <?xml version="1.0"?><soapenv:Envelope soapenv="http://schemas.xmlsoap.org/soap/envelope/" q0="http://ws.integracao.ana.gov.br/" xsd="http://www.w3.org/2001/XMLSchema" xsi="http://www.w3.org/2001/XMLSchema-instance"><Body><inserirMedicao><login>111111</login><senha>AAAA</senha><estacao><codigoFlu>222222</codigoFlu><codigoPlu>00000</codigoPlu><medicao><chuva>0.0</chuva><dataMedicao>16/04/2015 22:00:00</dataMedicao><nivel>100</nivel><vazao>1500.00</vazao></medicao></estacao></inserirMedicao></Body></soapenv:Envelope> Recebido: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns1:inserirMedicaoResponse xmlns:ns1="http://ws.integracao.ana.gov.br/"><retorno><mensagem>Usuário e/ou Senha inválidos</mensagem><mensagem>---</mensagem><quantidadeMedicaoInserida>0</quantidadeMedicaoInserida><quantidadeMedicaoNaoInserida>0</quantidadeMedicaoNaoInserida></retorno></ns1:inserirMedicaoResponse></soap:Body></soap:Envelope> Entao a duvida primeira é pq o php esta "comendo o xmlns:" no xml e pq o webservice me retorna como usuario invalido pelo php e via soapUI , incluindo a parte que o PHP come funciona. Compartilhar este post Link para o post Compartilhar em outros sites
hufersil 145 Denunciar post Postado Abril 29, 2015 O que o Gabriel disse, é que se você fizer assim: $wsdl = 'http://smh.ana.gov.br:8090/ws-telemetria-htc/services/inserirMedicoes?wsdl'; $config = array("trace"=>1,"exceptions"=>1); $dados = array( 'login' => '11111', 'senha' => 'AAAAA', 'estacao' => array( 'codigoFlu' => '1234', 'codigoPlu' => '1234', 'medicao' => array( 'chuva' => 0.0, 'nivel' => 0.0, 'vazao' => 0.0, 'dataMedicao' => '2015-04-14', ), ) ); $soap = new SoapClient($wsdl, $config); $soap->inserirMedicao($dados); Ele já gera o XML e envia para você. Abaixo um exemplo do XML gerado: <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://ws.integracao.ana.gov.br/"> <SOAP-ENV:Body> <ns1:inserirMedicao> <login>11111</login> <senha>AAAAA</senha> <estacao> <codigoFlu>1234</codigoFlu> <codigoPlu>1234</codigoPlu> <medicao> <chuva>0</chuva> <dataMedicao>2015-04-14</dataMedicao> <nivel>0</nivel> <vazao>0</vazao> </medicao> </estacao> </ns1:inserirMedicao> </SOAP-ENV:Body></SOAP-ENV:Envelope> O retorno que tive com este exemplo é um pouco diferente do seu, ele acrescentou a frase: Dados NÃO foram transmitidos para a base de dados. O que aparenta estar enviando a requisição de forma correta. @braços! Compartilhar este post Link para o post Compartilhar em outros sites
giesta 29 Denunciar post Postado Abril 29, 2015 Hufersil. Melhor impossível. Resolvido! :) Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Abril 29, 2015 Você não precisa tratar o XML, a biblioteca SOAP trata isso pra ti. Veja bem, a message de input do WSDL exige o complex type inserirMedicao. Já, complex type inserirMedicao é o seguinte <xs:complexType name="inserirMedicao"> <xs:sequence> <xs:element minOccurs="0" name="login" type="xs:string"/> <xs:element minOccurs="0" name="senha" type="xs:string"/> <xs:element maxOccurs="unbounded" minOccurs="0" name="estacao" type="tns:estacaoTO"/> </xs:sequence> </xs:complexType> Que referencia estacaoTO (que pode ter zero ou mais estações): <xs:complexType name="estacaoTO"> <xs:sequence> <xs:element minOccurs="0" name="codigoFlu" type="xs:string"/> <xs:element minOccurs="0" name="codigoPlu" type="xs:string"/> <xs:element maxOccurs="unbounded" minOccurs="0" name="medicao" nillable="true" type="tns:medicaoTO"/> </xs:sequence> </xs:complexType> Que referencia medicaoTO (que pode ter zero ou mais medições): <xs:complexType name="medicaoTO"> <xs:sequence> <xs:element minOccurs="0" name="chuva" type="xs:double"/> <xs:element minOccurs="0" name="dataMedicao" type="xs:string"/> <xs:element minOccurs="0" name="nivel" type="xs:double"/> <xs:element minOccurs="0" name="vazao" type="xs:double"/> </xs:sequence> </xs:complexType> A partir de então, você deve criar a informação no PHP, sem se preocupar com XML ou algum outro detalhe de linguagem que não seja PHP: /** cria-se o objeto que será passado como parâmetro **/ $inserirMedicao = new \stdClass(); $inserirMedicao->login = 'login'; $inserirMedicao->senha = 'senha'; /** cria-se a lista da estação **/ $estacaoList = new \ArrayObject(); /** cria-se a estação **/ $estacao = new \stdClass(); $estacao->codigoFlu = 'codigo flu'; $estacao->codigoPlu = 'codigo plu'; /** adiciona-se a estação a lista de estações **/ $estacaoList->append(new \SoapVar($estacao , SOAP_ENC_OBJECT , null , null , 'estacaoTO')); /** cria-se a lista de medições **/ $medicaoList = new \ArrayObject(); /** cria-se a medição **/ $medicao = new \stdClass(); $medicao->chuva = 1.0; $medicao->dataMedicao = '2015-04-29'; $medicao->nivel = 1.0; $medicao->vazao = 1.0; /** adiciona-se a estação a lista de estações **/ $medicaoList->append(new \SoapVar($medicao , SOAP_ENC_OBJECT , null , null , 'medicaoTO')); /** adiciona-se a lista de medições a estacao **/ $estacao->medicao = new \SoapVar($medicaoList , SOAP_ENC_OBJECT , null , null , 'medicao'); /** adiciona-se a lista de estações ao parâmetro estacao **/ $inserirMedicao->estacao = new \SoapVar($estacaoList , SOAP_ENC_OBJECT , null , null , 'estacao'); $resultado = $soap_client->inserirMedicao($inserirMedicao); var_dump($resultado); Edit--- eu estava escrevendo, sai para uma reunão, voltei, terminei de escrever... e já tinha uma resposta. Compartilhar este post Link para o post Compartilhar em outros sites