Ir para conteúdo

Arquivado

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

The

Integração com Web Service

Recommended Posts

fala galera, estou com um problema...hehehe

estou criando um pequeno sistema em PHP na minha empresa e vou fazer uma integração com um sistema de terceiro, será da seguinte maneira:

Este sistema terceiro me disponibiliza uma página com dados XML (sou bem leigo ao XML) vou acessar esta página e pegar os dados xml, porém vem meu primeiro problema, tenho que acessar está página a cada 5 min para pegar estar informações, andei procurando e encontrei o agendador de tarefas do windows, o qual faço ele executar o IE e mais um parametro que executa o meu script php, não sei se é o meio mais adequado, mas foi uma forma que encontrei.

Até ai é um problema de criar uma rotina que execute o código automaticamente, agora tenho outro problema...

quero acessar está página pegar os dados xml e salvar no mysql, fiz várias procuras e encontrei o simplexml_load_string, mas somente tenho a url, tentei tbm pelo simplexml_load_file, porém para usar neste formato terei que acessar a url que tenho, salvar o arquivo em xml e executar o código, é um método também, mas como criar essa rotina está um pouco complicado....

to procurando em vários lugares e não estou encontrando uma solução

olhem todos os métodos que já tentei, mas sem sucesso....

 

<?php
$post = '<posicao><resposta><msg>OK</msg></resposta><veiculos><veiculo><placa>FGY3639</placa><vel>0.0</vel><lat>-23.703995</lat><lng>-46.573746</lng></veiculo><veiculo><placa>FGY2566</placa><vel>0.0</vel><lat>-30.004387</lat><lng>-51.205235</lng></veiculo></veiculos><url-autenticacao>http://www.xxxxxxxxxxxxxx.com.br/integracaoSv?id=4xx&senha=293157xxxxxxxxxxxxxxxxxxx8fbab48069a</url-autenticacao></transacao></posicao>';

$array1 = explode('<url-autenticacao>',$post);
$array2 = explode('</url-autenticacao>',$array1[1]);

echo $array2[0];
?>
<?php
include "conexao.php";

$string = <<<XML
<?xml version='1.0'?> 
<document>
<posicao>
<resposta>
<msg>OK</msg>
</resposta>
<veiculos>
<veiculo>
<placa>EOM0000</placa>
<vel>7.0</vel>
<lat>-23.44747</lat>
<lng>-46.317059</lng>
</veiculo>
<veiculo>
<placa>EOM0000</placa>
<vel>0.0</vel>
<lat>-23.959021</lat>
<lng>-46.3764</lng>
</veiculo>
</veiculos>
</posicao>
</document>
XML;


$xml = simplexml_load_string($string);


var_dump($xml);
?>

 

neste, vejo o mais correto, mas somente tenho a URL que me leva a estes dados.....quero que o sistema acessa a URL pega os dados e coloca no banco, mas nem estou conseguindo pegar os dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

simplexml_load_file criará um objeto SimpleXMLElement com o conteúdo do arquivo que foi especificado (a URL, por exemplo).

Não há necessidade alguma em salvar o arquivo. No link abaixo, você encontrará diversos exemplos de uso.
Basic SimpleXML usage

 

Com o SimpleXMLElemente, não há necessidade de utilizar explode, como está utilizando no primeiro código. Basta correr pelos nós do arquivo, assim como verá nos exemplos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ótimo! Caso encontre alguma dúvida após os estudos, utilize este mesmo tópico.



Bons estudos!

Compartilhar este post


Link para o post
Compartilhar em outros sites

tentei de várias forma aqui

 

<?php

$sxe = new SimpleXMLElement('http://www.xxxxxxxxx.com.br/integracaoSv?id=42&senha=293xxxxxxxxxxxxxxxxxxxxxxxx69a', NULL, TRUE);
echo $sxe->asXML();

?>

Desta maneira acima, consegui pegar a informação da url e mostrar na minha tela

 

preciso pegar esta informação e salvar na minha tabela do mysql, assim modifiquei o código e fiz da seguinte maneira

 

fiz da seguinte maneira

 

<?php
include "conexao.php";
$query = "insert into teste (placa, velocidade, lat, log1) values (”%s” , ”%s” , ”%s” , ”%s”)";

$sxml = new SimpleXMLElement('http://www.xxxxxxxxxxxxxg.com.br/integracaoSv?id=42&senha=2931xxxxxxxxxxxxxxxx069a');
foreach ($sxml as $linhaAtual) {

        $pl        = (string) $linhaAtual->pl;
        $vel = (string) $linhaAtual->vel;
		$lat = (string) $linhaAtual->lat;
		$log1 = (string) $linhaAtual->log1;
        
        $tmpQuery = sprintf($query, $placa, $velocidade, $lat, $log1 );
        
        mysql_query($tmpQuery);
    }
?>

 

porém ele não executa e nem mostra erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adicione isso no código.

mysql_query($tmpQuery) or die(mysql_error());

Entretanto, se nem assim funcionar, tente o seguinte:

var_dump($tmpQuery);

 

E execute a query direto no SGBD.

 

Também estranhei uma coisa, seus apas duplas. São iguais de word e não as do "código" em si, veja a diferença desta:

 

 

" -> ”

Altere-as para simples apóstrofos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

para um XML simples assim você pode usar o código abaixo:

 

function array_combine_($keys, $values)
{
  $result = array();
  foreach ($keys as $i => $k) {
    $result[$k][] = $values[$i];
  }
  array_walk($result, create_function('&$v', '$v = (count($v) == 1)? array_pop($v): $v;'));
  return  $result;
}
 
function extract_data($str)
{
  return
    (is_array($str))?
    array_map("extract_data", $str):
    ((!preg_match_all('#<([A-Za-z0-9_]*)[^>]*>(.*?)</\1>#s', $str, $matches))? 
    $str:
    array_map(("extract_data"), array_combine_($matches[1], $matches[2])));
}

 

 

Ex. com seus dados:

$post = '<posicao><resposta><msg>OK</msg></resposta><veiculos><veiculo><placa>FGY3639</placa><vel>0.0</vel><lat>-23.703995</lat><lng>-46.573746</lng></veiculo><veiculo><placa>FGY2566</placa><vel>0.0</vel><lat>-30.004387</lat><lng>-51.205235</lng></veiculo></veiculos><url-autenticacao>http://www.xxxxxxxxxxxxxx.com.br/integracaoSv?id=4xx&senha=293157xxxxxxxxxxxxxxxxxxx8fbab48069a</url-autenticacao></transacao></posicao>';

print_r(extract_data($post));

Compartilhar este post


Link para o post
Compartilhar em outros sites

galera acabei de conseguir, mas não usei o simpleXMLElement, acabei utilizando o API DOM, usei o DOMDocument::load, ficou mais fácil de entender e trabalhar, meu código ficou da seguinte maneira

 

<?php
$doc = new DOMDocument();
$doc ->load('http://www.txxxxxxxxxxxx.com.br/integracaoSv?id=4ccc&senha=76b020dxxxxxx7ec80');

$veiculos = $doc->getElementsByTagName("veiculo");

foreach($veiculos as $veiculo){
	$placas = $veiculo->getElementsByTagName("placa");
	$placa = $placas->item(0)->nodeValue;
	
	$vels = $veiculo->getElementsByTagName("vel");
	$vel = $vels->item(0)->nodeValue;
	
	$lats = $veiculo->getElementsByTagName("lat");
	$lat = $lats->item(0)->nodeValue;
	
	$lngs = $veiculo->getElementsByTagName("lng");
	$lng = $lngs->item(0)->nodeValue;
	
	
	echo "Placa: ";
	echo $placa;
	echo "<br>";
	echo "Velocidade: ";
	echo $vel;
	echo "<br>";
	echo "Latitude: ";
	echo $lat;
	echo "<br>";
	echo "Longitude: ";
	echo $lng;
	echo "<br>";
	echo "<br>";
	}
?>

 

vou salvar dentro do mysql, mas como agora consigo ler e já tenho cada nó armazenado nas minhas variaveis é só utilizar o sql para fazer o input, ai é bem mais tranquilo hehehehehehehehe

 

não sendo mais chato......preciso que este código rode a cada 2 min......como setar desta forma???????.para teste vou roda no localhost, pensei em utilizar o agendador de tarefa do windows que abra a página e rode, porém o agendador somente deixa executar uma vez no dia, como será que eu deve fazer???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço todas as configurações do agendador, mas como seu servidor é windows, utilize o agendador.

 

Mas pergunte-se a si mesmo. Qual a necessidade real de rodar a cada 2 minutos? Necessita de um tempo de resposta tão baixo?



Em alguns casos, a sincronização é feita somente na hora da consulta. Se eu quero determinada informação, é realizada a sincronização na hora da solicitação da consulta. Isso se a sincronização não for muito custosa.

 

As vezes, você pode parametrizar tempos, por exemplo. Sincronizar automaticamente a cada uma hora, entretanto, se eu for consultar e, a ultima sincronização for a mais de 15 minutos, realize a sincronização novamente.

 

Existe N exemplos, não gosto muito de processos contínuos. Muitas vezes, não há real necessidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

a cada 2 minutos o arquivo xml é atualizado e preciso pegar esta atualização, por isso desta minha necessidade......queria muito colocar no linux mas infelizmente terei que rodar no windows

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.