Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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();
} echo $e->getMessage();
}
echo "<br> Executado ateh o fim";
?>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?
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>Enviado:
<?xml version="1.0"?>
<soapenv:Envelope soapenv="[http://schemas.xmlsoap.org/soap/envelope/](http://schemas.xmlsoap.org/soap/envelope/)" [q0="http://ws.integracao.ana.gov.br/"](q0=) [xsd="http://www.w3.org/2001/XMLSchema"](xsd=) [xsi="http://www.w3.org/2001/XMLSchema-instance">111111AAAA222222000000.016/04/2015](xsi=) 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.
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!
Hufersil. Melhor impossível. Resolvido! :)
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>/ 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.
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/