Ir para conteúdo

POWERED BY:

Arquivado

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

giesta

SOAP - PHP Comendo Coisas + Dificuldade com WS

Recommended Posts

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

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

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

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

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

×

Informação importante

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