[RESOLVIDO] Rotina de Cep Viacep Json

Boa tarde, pessoal.
Como a base de cep’s do SC está defasada desde 2019, tive que buscar uma alternativa e encontrei uma rotina que funciona muito bem dentro do ambiente de desenvolvimento do SC, porém, a mesma aplicação em ambiente de produção nada retorna:

if ({cepres} != “”){
$url = “https://viacep.com.br/ws/".{cepres}."/json/”;
$dados = file_get_contents($url);
$dados = json_decode($dados);
if ($dados != null){
{endres} = $dados->logradouro;
{baires} = $dados->bairro;
{ufres} = $dados->uf;
{cidres} = $dados->localidade;
{fone1} = $dados->ddd;
}
}

Onde eu estou errando?

utilizando o comando
echo ‘

’, print_r($dados),’

no ambiente de desenvolvimento eu recebo o retorno abaixo, mas no ambiente de produção recebo apenas o ‘1’ que aparece ao final.

stdClass Object
(
[cep] => 35522-014
[logradouro] => Rua Vereador Lelis Camilo
[complemento] =>
[bairro] => Jardim do Lago
[localidade] => Nova Serrana
[uf] => MG
[ibge] => 3145208
[gia] =>
[ddd] => 37
[siafi] => 4903
)
1

tente:

$url = "https://viacep.com.br/ws/{{cepres}}/json/";


/* Nota: Use [code] e [/code] para expor códigos */

Obrigado pela dica, mano… mas não funcionou. Só funciona no ambiente de desenvolvimento dentro do SC.
Pelo que percebo, o problema está em o que liberar em alguma configuração do provedor para que o endereço de requisição (viacep.com.br) seja permitido, ou que o retorno json possa ser lido, ou algo do gênero.
Você tem idéia do que possa ser feito?
TFA

Dar uma olhada no log doapache e php para ver se surge um indicador de erro. Mas com certeza o problema está no ambiente.

O problema é que o provedor não habilita fopen por razões de segurança.
Porém, habilita via curl ( não me pergunte pq ).
Daí eu tenho retorno, porém o json_decode não o transforma em array.
Já utilizei o json_decode($dados, true) pois o “true” transforma em array.
Seguindo uma dica, criei uma blank com o código curl e obtive o retorno e mais uma mensagem:
curl_exec(): supplied resource is not a valid cURL handle resource.
Neste ponto é que não consigo consumir o retorno, é como se ainda permanecesse em formato json e não em array, mesmo ordenando.

Esta é a rotina:

$cepe = 13063050;
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://viacep.com.br/ws/$cepe/json/"); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_exec($ch); 
curl_close($ch); 
$retorno = curl_exec($ch); 

var_dump($retorno);
$dados = json_decode($retorno, true);
//echo '<pre>', print_r($dados), '<pre>';
echo 'Endereço é: ', $retorno->logradouro;
$endereco = $dados->logradouro;
$bairro = $dados->bairro;
$uf = $dados->uf;
$cidade = $dados->localidade;
$telefone = $dados->ddd; 

Alguma dica?

tente:

$dados = (array) json_decode($retorno, true);

se possível de um, antes de depois do json_decode:

echo '<pre>', print_r($retorno,true), '</pre>';
echo '<pre>', print_r($dados,true), '</pre>';

Complicado não poder usar um fopen hein?

Eu trocaria de provedor.

Eu também trocaria, porém, sem chance.

Após tentar sua sugestão para o cep 13063050, obtive o seguinte resultado:

{ “cep”: “13063-050”, “logradouro”: “Rua Altemiro de Sousa Leite”, “complemento”: “”, “bairro”: “Jardim Eulina”, “localidade”: “Campinas”, “uf”: “SP”, “ibge”: “3509502”, “gia”: “2446”, “ddd”: “19”, “siafi”: “6291” }
Array
(
[0] => 1
)
1

Como não é exatamente o que precisamos, procurei um tratamento de erros para o json_decode:

```
if (json_last_error() == 0) {
    echo '- Nao houve erro! O parsing foi perfeito';
}
else {
    echo 'Erro!</br>';
	switch (json_last_error()) {

        case JSON_ERROR_DEPTH:
            echo ' - profundidade maxima excedida';
        break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - state mismatch';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Caracter de controle encontrado';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Erro de sintaxe! String JSON mal-formada!';
        break;
        case JSON_ERROR_UTF8:
            echo ' - Erro na codificação UTF-8';
        break;
        default:
            echo ' – Erro desconhecido';
        break;
    }
}

E obtive:
{ “cep”: “13063-050”, “logradouro”: “Rua Altemiro de Sousa Leite”, “complemento”: “”, “bairro”: “Jardim Eulina”, “localidade”: “Campinas”, “uf”: “SP”, “ibge”: “3509502”, “gia”: “2446”, “ddd”: “19”, “siafi”: “6291” }- Nao houve erro! O parsing foi perfeito

Sendo assim, devo concluir que há um array, porém, não consigo obter o conteúdo referente a um índice. A sintaxe como estou tentando extrair está incorreta.
Já usei {uf} = $dados->uf; {uf} = $dados[6]; {uf} = $dados=uf; e nenhuma traz a informação.

A única coisa que achei estranha é que há um espaço em branco logo após o ínicio da chave do array e ao final antes da chave de fechamento.

Devo pensar em utilizar algum comando como o split?

Essa url é de um Webservice feito para ser consumido diretamente pela url não precisa usar
curl_url para forçar a extração de dados da URL, apenas usar o json com url.

setlocale(LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'pt_BR.utf-8', 'portuguese');
date_default_timezone_set('America/Sao_Paulo');

$_cep = 13063050;

$_json_url = "https://viacep.com.br/ws/$_cep/json/";
$_json = file_get_contents($_json_url);

if (!preg_match('/("erro": true)/i' , $_json)) {
    $_json = str_replace('},]',"}]", $_json);
    $_data = json_decode($_json);

    echo $_data->cep."</br>";
    echo $_data->logradouro."</br>";
    echo $_data->complemento."</br>";
    echo $_data->bairro."</br>";
    echo $_data->localidade."</br>";
    echo $_data->uf."</br>";
    echo $_data->ibge."</br>";
    echo $_data->gia."</br>";
} else {
    // CEP não encontrado.
    echo 'CEP não encontrado!!'."</br>";
    echo "<pre>";
    print_r($_json);
    echo "</pre>";
}
1 Curtida

Obrigado pela resposta, Jailton.
Mas é como disse acima, o provedor não permite fopen. Se isto não estiver liberado, não haverá nenhum retorno. Vc terá as seguintes mensagens:

Warning : file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/storage/9/c4/a3/zzzzz/public_html/saco.php on line 5

Warning : file_get_contents(https://viacep.com.br/ws/13063050/json/): failed to open stream: no suitable wrapper could be found in /home/storage/9/c4/a3/zzzzz/public_html/saco.php on line 5

A solução me parece estar em forçar via curl e ler através de explode ou split.
O retorno vem em curl, mas por mais que use json_decode, ele aparece como string e não como array… ou estou cometendo algum erro na sintaxe.

Ok reescrevi a rotina para usar curl pode testar, mas trabalhar em uma hospedagem limitada futuramente você pode vir a precisar de algum recurso especifico que não vai ter como contornar a situação.


setlocale(LC_ALL, 'pt_BR', 'pt_BR.utf-8', 'pt_BR.utf-8', 'portuguese');
date_default_timezone_set('America/Sao_Paulo');

$_canal = curl_init();

$_cep = 13063050;

$_url = "https://viacep.com.br/ws/$_cep/json/";

 // Definir opções de URL e cabeçalho
 curl_setopt($_canal, CURLOPT_URL, $_url);
 curl_setopt($_canal, CURLOPT_HEADER, 0);

 // Comece a capturar a saída
 ob_start();

 // Executando a chamada curl
 curl_exec($_canal);

 // Obtenha o conteúdo srtout e limpe o buffer
$_json = ob_get_clean();

 // Feche o recurso Curl
 curl_close($_canal);

if (!preg_match('/("erro": true)/i' , $_json)) {
    $_json = str_replace('},]',"}]", $_json);
    $_data = json_decode($_json);

    echo $_data->cep."</br>";
    echo $_data->logradouro."</br>";
    echo $_data->complemento."</br>";
    echo $_data->bairro."</br>";
    echo $_data->localidade."</br>";
    echo $_data->uf."</br>";
    echo $_data->ibge."</br>";
    echo $_data->gia."</br>";
} else {
    // CEP não encontrado.
    echo 'CEP não encontrado!!'."</br>";
    echo "<pre>";
    print_r($_json);
    echo "</pre>";
}
3 Curtidas

Muito obrigado, Jailton!

Resolvido. O segredo está na instrução $_json = str_replace(’},]’,"}]", $_json);
Isso fez a string de retorno se tornar um array.
Obrigado tbm ao Haroldo.

Eu tinha esquecido de por o tratamento de erro caso CEP não existir, editei ela
novamente as 2 que passei e coloquei, ai pode copiar novamente e adaptar no
seu projeto.

1 Curtida

Valeu, Jailton!
Já coloquei a rotina até no grupo de Whatsapp.
Deve ter um monte de gente achando que o cep do SC está atualizado e os clientes estão tendo que digitar os campos. Foi o meu caso.