Retorn urldecode($result->getBody());

Marcos Birro Calixto Criador 03/01/2020
Marcos Birro Calixto

Carlos, bom dia. 

Abri outro ticket sobre o guzzle/API

Bom, eu estava fazendo a requisição assim em json:

        $result = $aae->request('POST'env('URL_API_OI_V1_GETPREV'), [
            'form_params' => [
                'ano_data_programada' => 2019,
                'mes_data_programada' => 12,
            ],
            'headers' => [
                'Authorization' => "Bearer {$this->token}",
               //'Content-Type' =>  'Application/json',
                'Content-Type'  => 'application/x-www-form-urlencoded',
            ],
        ]);
 
Estava retorno em json mas no caso deste cliente OI o header content´type deve ser application/x-www...
Assim, o retorn ficou assim:
        //$preventivas = json_decode($result->getBody());
        $preventivas = urldecode($result->getBody());
        
        dd($preventivas);
Em vez de json me traz o urldecode que fica assim no dd($preventivas)
 
Criador Marcos Birro Calixto 03/01/2020
Marcos Birro Calixto

Cotinuando porque não coube:

"{"mensagem":"Ok","dados":[{"preventiva_id":155226,"status":"Em an\u00e1lise pelo fornecedor","predio":"ACAA-ACAA","UF":"MG","preventiva_tipo":"Limpeza","checklist_id":null,"data_programada":"2019-12-01","ciclo":20,"periodicidade":"SEMESTRAL","ultima_preventiva":null,"justificativa":null},{"preventiva_id":155230,"status":"Em an\u00e1lise pelo ...

Agora preciso pegar estes dados e gravar numa tabela com estes campos.
NÃo estou sabendo fazer isto. Como pego cada variável e dou um insert?

Obrigado.

Se quiser olhar, o código está em https://github.com/marcosbirrocalixto/helper/invitations
Manager Carlos Ferreira 03/01/2020
Carlos Ferreira

Olá, Marcos!
Tudo bem?

Primeiro passo é converte esses dados para JSON, atualmente é uma string:
$json = json_encode($preventivas);

Agora debug novamente e veja que tem os dados formatados:
dd($json);

Observe que retorna um array, porntato você pode interar em um loop para conseguir inserir:
foreach ($json['dados'] as $dado) {
    // Insere aqui...
    dd($dado);
}

Criador Marcos Birro Calixto 07/01/2020
Marcos Birro Calixto

Carlos, eu estou tendi dificuldades com isto! Olha o erro que está dando!

  1. //$preventivas = json_decode($result->getBody());
  2. $preventivas = urldecode($result->getBody());
  3.  
  4. $preventivasjson = json_decode($preventivas);
  5. //dd($preventivasjson);
  6.  
  7. foreach ($preventivasjson['dados'] as $dado) {
  8. // Insere aqui...
  9. dd($dado->preventiva_id);
  10. }
  11. return view('api.ssp.preventivas.index', compact('preventivasjson'));
  12. }
  13.  
  14. /**
  15. * Show the form for creating a new resource.
  16. *
  17. * @return \Illuminate\Http\Response
  18. */
  19. public function create()
  20. {
  21. //
  22. }
  23.  
  24. /**
  25. * Store a newly created resource in storage.
  26. *
Arguments
  1. "Cannot use object of type stdClass as array"
Manager Carlos Ferreira 07/01/2020
Carlos Ferreira

Olá, Marcos!

Por que usou o urldecode ao invés do json_decode?

Esse erro é porque você está tentando acessar o objeto (stdClass) como se fosse um array, deve ser assim (dentro do loop):
 dd($preventivasjson->dados);

 Se tiver em dúvida, verifique o tipo:
 https://www.php.net/manual/pt_BR/function.gettype.php

Criador Marcos Birro Calixto 07/01/2020
Marcos Birro Calixto

Esrq API é de um cliente e tenho que obedecer a documentação. Eles usam este urldecode para retornar a API deeles.

Agora tenho que pegar estes dados e inserir numa tabela.

Obrigado.

Manager Carlos Ferreira 08/01/2020
Carlos Ferreira

Mas, fazendo assim deu certo?
dd($preventivasjson->dados);

O que tem nessa variável mesmo?
dd($preventivasjson);

Qual é o tipo de dado?
dd(gettype($preventivasjson));

Criador Marcos Birro Calixto 09/01/2020
Marcos Birro Calixto

Bom dia.

dd($preventivasjson->dados) deu certo sim.

Agora vou criar a tabela e gravar estes dados que peguei do cliente. Vou fazer uma rotina para inserir caso não existe e update casoo exista.

Esta rotina rodará como cron para buscar as OSs e atualizá-las.

O retorno de dd(gettype($preventivasjson)); é "object"

Fiz o foreach e gerou a view como teste. Agora é fazer o forwach para inserir ou atualizar a tabela.

Este sistema está fcando muito grande. Além do laravel, tem o ACL, API para conectar ao aplicativo kotlin e API ara comenectar ao cliente OI. Vai rodar no país inteiro. Tenho muito que fazer... Otimizar código, reescrever algumas rotinas mas está indo.

Muito obrgado Carlos.

Criador Marcos Birro Calixto 09/01/2020
Marcos Birro Calixto

Boa tarde Carlos.

Como posso fazer este insert? Eu não lembro de ter alguma aula sobre este tipo de insert!

Fiz assim:

        foreach ( $preventivas->dados as $preventiva ) {
            dd($preventiva);
        }
e retornou
{ # 575 
  + " preventiva_id ": 155226 
  + " status ": " Em análise pelo fornecedor "
  + " predio ": " ACAA-ACAA "
  + " UF ": " MG "
  + " preventive_type ": " Limpeza "
}
Insert. A model é Preventiva e está com o fillable ok
        foreach ( $preventivas->dados as $preventiva ) {
           Insert aqui se não existir ou update se existir.
        }
        }
Obrigado
Manager Carlos Ferreira 09/01/2020
Carlos Ferreira

Você pode inserir de diversas formas.

Uma delas seria inserir item por item dentro deste loop, exemplo:
foreach ( $preventivas->dados as $preventiva ) {
    $objeto = new NomeDoModel;
    $objeto->preventiva_id = $preventiva->preventiva_id;
    $objeto->status = $preventiva->status;
    $objeto->predio = $preventiva->predio;
    $objeto->UF = $preventiva->UF;
    $objeto->preventive_type = $preventiva->preventive_type;
    $objeto->save();
}

Outra alternativa:
foreach ( $preventivas->dados as $preventiva ) {
    NomeDoModel::create([
        'preventiva_id' => $preventiva->preventiva_id,
        'status' => $preventiva->status,
        'predio' => $preventiva->predio,
        'UF' => $preventiva->UF,
        'preventive_type' => $preventiva->preventive_type,
    ]);
}

Você também pode criar um array multidimensional desses items no loop, e inserir uma única vez com o método insert.
NomeDoModel::insert($array_multidimensional);

Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!