Jump to content
juninhogpe

Listar dados de JSON com PHP e Curl

Recommended Posts

Pessoal, estou consumindo uma API com PHP + Curl.

 

Segue abaixo como estão os dados:

 

JSON:

{"odata.metadata":"http:\/\/ip:porta\/api\/sistema\/$metadata#sistema_interno.sistema_interno_cond_pgto_lista","odata.count":2,"value":[{"cond_pgto":466,"codigo":"000","descricao":"DINHEIRO","taxa":null,"tipo_operacao":"A","desconto":0,"tipo_pgto":0},{"condicoes_pgto":820,"codigo":"002","descricao":"MISTA","taxa":null,"tipo_operacao":"A","desconto":null,"tipo_pgto":10}]}

 

chamada PHP:

            $url = 'http://ip:/porta/end_api?$format=json';
            $username = 'usuario'; 
            $password = 'senha';

            $ch  = curl_init();

            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

            $output = curl_exec($ch);
            $info = curl_getinfo($ch);

            curl_close($ch);

            $lista = json_decode($output, TRUE);

        ?>


         <table>
            <tr><th>Codigo</th></tr>

            <?php
				foreach ($lista['value'] as $lst):
            ?>
             	<tr><td>
                  	<?php echo ($lst['codigo']) ?>
                </td></tr>

            <?php endforeach;?>
		</table>

E quando executo o código tenho o retorno:

Warning: Invalid argument supplied for foreach() in C:\AppServ\www\api\teste.php on line 44

No caso essa linha 44:

foreach ($lista['value'] as $lst):

 

Conseguem me ajudar a entender o por que do erro?

 

Obrigado.

Share this post


Link to post
Share on other sites

@juninhogpe, beleza!
 

Faça o seguinte teste:

<?php

$output= '{"odata.metadata":"http:\/\/ip:porta\/api\/sistema\/$metadata#sistema_interno.sistema_interno_cond_pgto_lista","odata.count":2,"value":[{"cond_pgto":466,"codigo":"000","descricao":"DINHEIRO","taxa":null,"tipo_operacao":"A","desconto":0,"tipo_pgto":0},{"condicoes_pgto":820,"codigo":"002","descricao":"MISTA","taxa":null,"tipo_operacao":"A","desconto":null,"tipo_pgto":10}]}';

$listas = json_decode($output, true);

foreach ($listas['value'] as $lista) {
    echo $lista['codigo'];	
    echo "<br>";
}

/* 
 Saida: 
  000
  002		
*/

A sua iteração esta correta, verifique o valor da variável $output!

Share this post


Link to post
Share on other sites

@EdCesar, obrigado pelo retorno.

 

Do jeito que você fez eu passando o conteúdo dentro do $output, funcionou.

 

Engraçado que no meu output eu chamo assim:

 

$ch  = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);

$output = curl_exec($ch);

Estou sem entender como corrigir.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Guilherme Luiz
      Olá pessoal,
       
      Estou com uma pequena dúvida em relação a buscar dados em json no MySQL.
      No meu banco eu tenho uma table com o seguinte campo em json.
       
      table - contacts
      column - groups_id
       
      Na coluna groups_id eu armazeno ids de grupos em json por exemplo:
      ["252","222","666"]  
      Quando eu realizo a seguinte query
      SELECT * FROM user_contacts WHERE JSON_CONTAINS(group_id, '["252"]')  
      Beleza... Ele me resulta em todos os contatos que possuem o registro 252.
      O que acontece é que essa table é 1 > N, ou seja, um contato pode fazer parte de vários grupos, sendo assim:
       
      quando eu consulto
      SELECT * FROM user_contacts WHERE JSON_CONTAINS(group_id, '["252","222"]') Ele não me resulta nos contatos que estão com grupo 252 ou 222.
      Ele me resulta nos contatos que estão com o grupo 252 e 222, ou seja, ele me retorna somente os contatos que o group id tenha ["252","222"]
       
      Eu vi que nessa situação eu poderia criar um INDEX na minha tabela usando:
      ALTER TABLE user_contacts ADD INDEX groups ( (CAST(group_id->'$.groups' AS UNSIGNED ARRAY)) );  
      Mas o CAST() na versão que Mysqli que eu possuo no servidor 4.6.X me retorna Syntax error.
      Alguem teria uma sugestão ou luz de qual caminho posso seguir nessa situação sem que seja atualizando a versão do bd?
       
       
    • By Rafael Ferreira_163968
      Boa noite, nunca mechi com curl e estou tomando uma surra bunita, se puderem me ajudar, estou consumindo uma api e preciso enviar dados do mysql para esta api, mas antes estou tentando testar com variaveis feitas a mao sem conectar no BD, funcionando com as variaveis eu desenrolo a consulta depois. segue codigo e duvida:
       
      <?php $curl = curl_init(); $numero = '000000000'; $msg = 'teste de mensagem BD'; curl_setopt_array($curl, array( CURLOPT_URL => "http://urldaapi", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => "{\r\n \"menssage\": '.$msg.',\r\n \"number\": '.$numero.'\r\n}", CURLOPT_HTTPHEADER => array( "Authorization: 0000000000000000000", "cache-control: no-cache" ), )); $response = curl_exec($curl); $err = curl_error($curl); curl_close($curl); if ($err) { echo "cURL Error #:" . $err; } else { echo $response; } nessa linha
       CURLOPT_POSTFIELDS => "{\r\n  \"menssage\": '.$msg.',\r\n  \"number\": '.$numero.'\r\n}", a original é a seguinte
       
      CURLOPT_POSTFIELDS => "{\r\n \"menssage\": \"Teste pela API\",\r\n \"number\": \"6200000000\"\r\n}",  gostaria da ajuda dos colegas de como pegar essas variaveis  $numero = '000000000'; e $msg = 'teste de mensagem BD'; e repassar elas para o CURLOPT_POSTFILDES, tentei como a primeira linha mas nao da, preciso modificar a linha original para consumir esses valores. podem me ajudar?
    • By mamotinho
      oi pessoal estou com um problema , não estou conseguindo passar todos os valores o foreach no json_encode() alguém poderia me ajudar, eu estou tentando monta um mecanismo de refresh em tempo real de uma lista de notificação veja abaixo:
       
      <script type="text/javascript"> function make_call() { // Fazendo requisição AJAX $j.post('teste.php', function (frase) { // Exibindo frase $j('#listas').html('<i>' + frase + '</i>'); }, 'JSON'); setTimeout(function(){ make_call(); }, 5000); } </script>
      Aqui é o arquivo que quero enviar para a div #lists
       
      <?php require("conexao/directory.php"); $notificar = $db->query("select TOP 5 * from Techi7CP.dbo.cabal_notificacao_geral order by regdate desc"); $notificacao = $notificar->fetchAll(); $count_notificacao = abs($notificar->rowCount()); if($count_notificacao==0){ echo '<li style="text-align:center;">não existe notificações no momento.</li>'; }else{ foreach($notificacao as $notif){ $consulta_conta = $db->query("select * from account.dbo.cabal_auth_table where UserNum='".$notif['usernum']."'")->fetchObject(); switch($notif['acao']){ case 'logadopremiado' : echo ' <li><a class="black-text" href="#!"><span class="material-icons icon-bg-circle red small">redeem</span>'.$notif['jogador'].' ganhou no Logado Premiado</a> <time class="media-meta grey-text darken-2" datetime="2015-06-12T20:50:48+08:00"> '.Data::ExibirTempoDecorrido(date("Y-m-d H:i:s.B", strtotime($notif['regdate']))).'</time> </li>'; break; case 'mudarsenha' : echo ' <li><a class="black-text" href="#!"><span class="material-icons icon-bg-circle teal small">vpn_key</span>'.$consulta_conta->Nome.' alterou sua senha</a> <time class="media-meta grey-text darken-2" datetime="2015-06-12T20:50:48+08:00"> '.Data::ExibirTempoDecorrido(date("Y-m-d H:i:s.B", strtotime($notif['regdate']))).'</time> </li>'; break; case 'distribuirpontos' : echo ' <li><a class="black-text" href="#!"><span class="material-icons icon-bg-circle cyan small">control_point</span>'.$notif['jogador'].' distribuiu seus pontos</a> <time class="media-meta grey-text darken-2" datetime="2015-06-12T20:50:48+08:00"> '.Data::ExibirTempoDecorrido(date("Y-m-d H:i:s.B", strtotime($notif['regdate']))).'</time> </li>'; break; case 'girodasorte' : echo ' <li><a class="black-text" href="#!"><span class="material-icons icon-bg-circle brown small">star_border</span>'.$consulta_conta->Nome.' usou o giro da sorte</a> <time class="media-meta grey-text darken-2" datetime="2015-06-12T20:50:48+08:00"> '.Data::ExibirTempoDecorrido(date("Y-m-d H:i:s.B", strtotime($notif['regdate']))).'</time> </li>'; break; case 'sistematpoint' : echo ' <li><a class="black-text" href="#!"><span class="material-icons icon-bg-circle green small">golf_course</span>'.$notif['jogador'].' recebeu seu tpoint por clique</a> <time class="media-meta grey-text darken-2" datetime="2015-06-12T20:50:48+08:00"> '.Data::ExibirTempoDecorrido(date("Y-m-d H:i:s.B", strtotime($notif['regdate']))).'</time> </li>'; break; case 'combo' : echo ' <li><a class="black-text" href="#!"><span class="material-icons icon-bg-circle amber small">videogame_asset</span>'.$notif['jogador'].' fez '.$notif['ExtraDetalhes'].' em sua primeira vez</a> <time class="media-meta grey-text darken-2" datetime="2015-06-12T20:50:48+08:00"> '.Data::ExibirTempoDecorrido(date("Y-m-d H:i:s.B", strtotime($notif['regdate']))).'</time> </li>'; break; } } } ?> como eu faria para ser exibido todos os resultados registrados com o json_encode().
    • By Good
      Bom dia,
       
      eu tenho um formulário que as pessoas preenchem o nome, endereço, email e outros dados.
       
      E ao fazer o envio do formulário, faz algumas validações em outras apis. O sistema funciona redondo.
      E ao terminar as validações, gravo no banco de dados e posteriormente é feito um envio via CURL para outro servidor, puxando os dados gravados no BD.
      E ao chegar no último servidor, é enviado alguns formulários e outros não.
       
      Eu percebi que os formulários que chegam até o último servidor eles não tem acentuação.
      Mas aí eu tive que criar um botão para reenviar os dados. Com isso eu consigo fazer o reenvio manual. Mas eu não entendo é pq que não funciona de forma automática nas etapas de preenchimento do formulário.
       
      DETALHE: para enviar para o ultimo servidor, eu já puxo tudo do banco de dados.
       
      Meu código bem simples mesmo:
       
      $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://central.servidor.com.br/post.php?id='.$product['integration_b4you']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array)); $response = curl_exec($ch);  
       
      Preciso adicionar algum cabeçalho? Tem como descobrir até onde o arquivo deu problema, etc.. O motivo de não ter sido enviado, ou se foi enviado e due erro lá no outro servidor, etc..
    • By FabianoSouza
      Pessoal, estou iniciando agora em Wordpress. Mas já me viro bem com HTML,  CSS, Javascript, ASP Clássico e SQL Server.
       
      Meu primeiro desafio com WP é saber como faço para receber uma string em JSON de outro site.
      Essa string contém registros de um banco de dados, então precisarei montar uma tabela em HTML para exibir dos dados...
       
      Quero saber onde, dentro do WORDPRESS, eu consigo faze isso. É direto no código fonte? Dá pra usar plugin??
       
      Por onde sigo??
       
      Obrigado.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.