Advertisement
maiconsaraiva

Exemplo, consumo de API REST com Guzzle Http Client (PHP)

Jul 10th, 2019
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.14 KB | None | 0 0
  1. <?php
  2.     //Exemplo POST
  3.     meuArrayPHP = [
  4.       'nome' = 'Maicon',
  5.       'dataNascimento' = '2001.01.01',
  6.       'valorLimite' = 100.55,
  7.       'qualquerPropriedadeApi' = 'Valor'
  8.     ]
  9.     $options = [
  10.         /*De acordo com a biblioteca Guzzle: Ao acionar fazer um POST request, se eu quiser enviar um JSON posso enviar da maneira abaixo:
  11.          "An easy way to upload JSON data and set the appropriate header is using the json request option:"  */
  12.         'json' => $meuArrayPHP
  13.     ];
  14.     $method = 'POST';
  15.     $uri    = 'clientes';
  16.     $resposta = request($method,$uri,$options);
  17.     echo var_export($resposta,true);
  18.    
  19.     //Exemplo DELETE (deletando o cliente com ID 1
  20.     $idCliente = 1;
  21.     $resposta = request('DELETE','clientes/'.$idCliente);
  22.     echo var_export($resposta,true);
  23.    
  24.     //Exemplo GET (consultando cliente com ID = 2)
  25.     $idCliente = 2;
  26.     $resposta = request('GET','clientes/'.$idCliente);
  27.     echo var_export($resposta,true);    
  28.  
  29.  
  30.  
  31.     /**
  32.      * Reimplementa a função "request()" da biblioteca Guzzle Http Client.
  33.      * Efetua alguns tratamentos de erros, e retorna o JSON já convertido para Array PHP e/ou String
  34.      * (caso o retorno tenha sucesso mas não seja um JSON)
  35.      * Documentação de Request (usando a Biblioteca Guzzle Http Client):
  36.      * http://docs.guzzlephp.org/en/stable/quickstart.html#making-a-request
  37.      * @param string $method   Método da requisição que está sendo solicitada.
  38.      *                         Opções: GET, POST, DELETE, PUT, etc.
  39.      * @param string $uri      URI/Requisição que está sendo solicitada
  40.      *                         Exemplo: "pedidos", "pedidos/1",  "clientes", "clientes?query=...."
  41.      * @param array  $options  Opções, tal como no formato exibido pela biblioteca Guzzle Http Cliente e pela API a ser consultada.
  42.      *                         é um parâmetro opcional (para GET e DELETE por exemplo, não é utilizado)
  43.      * @return mix Resposta    Retorna um JSON convertido em Array (caso a resposta seja um JSON)
  44.      *                         ou o conteúdo de "body" em formato string (se body não for um JSON)
  45.      */
  46.     function request(string $method, string $uri,array $options = [])
  47.     {
  48.  
  49.         //Instancia a classe Http Client do Guzzle. http://docs.guzzlephp.org/en/stable/
  50.         $client = new Client([            
  51.             'headers' => [
  52.                 'Content-Type'  => 'application/json',
  53.                 'Accept'        => 'application/json',
  54.                 //Autorização do tipo "Basic"
  55.                 'Authorization' => 'Basic HUKLAadlflslckssklsdajfndsjkfnsdjklcnsdajkla'
  56.             ],
  57.             'base_uri' => $this->base_url,
  58.             'timeout'  => 5, //5 segundos
  59.             /*Necessário desabilitar o verify se não daria erro de verificação de SSL
  60.             http://docs.guzzlephp.org/en/stable/request-options.html#verify*/
  61.             'verify'   => false
  62.          ]);
  63.  
  64.         try
  65.         {
  66.             if ($this->is_debug) {
  67.                 echo '<b> '.date('d-m-Y H:i:s').' '.$method.' '.$this->base_url . $uri.'</b><br/>';
  68.             }
  69.  
  70.             $response = $client->request($method,$uri, $options );
  71.             $this->qtde_requisicoes++;
  72.             $statuscode = $response->getStatusCode();            
  73.             //200 = Retorno OK
  74.             if ($statuscode==200)
  75.             {  
  76.                 $strBody = (string) $response->getBody();
  77.                 //Converte o JSON para Array PHP
  78.                 $_ret = json_decode($strBody,true);  
  79.                 /* Se não for um JSON (deu erro na conversão), então retorno o coteúdo de "body" em formato string.
  80.                   OBS: Note que isso não significa que é um erro. Por exemplo, ao fazer um request DELETE,
  81.                        se o item foi deletado com sucesso, a resposta será simplesmente 'true' */
  82.                 if (json_last_error()!=0) //0 = Não tem erro (arquivo JSON convertido para Array corretamente)
  83.                     $_ret = $strBody;                        
  84.                 if ($this->is_debug) {                    
  85.                     echo  date('d-m-Y H:i:s').' StatusCode: '.$statuscode. ' ReasonPhrase: '.$response->getReasonPhrase(). '<br />'; // OK
  86.                     echo 'Count Array: '.count($_ret).'<br />';
  87.                 }                            
  88.                 //Retorna em o JSON convertido para array
  89.                 return $_ret;
  90.             } else
  91.             {                
  92.                 throw new Exception('Erro no retorno do request '.$method.' "'.$uri.'" : '.$statuscode.' - '.$response->getReasonPhrase() );                  
  93.             }                        
  94.         } catch (ClientException $e) {
  95.             //Exceptions for 400 level errors if the http_errors request option is set to true.                        
  96.             echo Psr7\str($e->getRequest())
  97.             //Servidor retornou alguma resposta ?            
  98.             if ($e->hasResponse()) {
  99.                 echo Psr7\str($e->getResponse()) ; //Exibie todo o conteúdo da resposta (incluindo: Header, Body, etc.)
  100.                 //Se houve resposta, então exibe a resposta devolvida pela API
  101.                 $statuscode = $e->getResponse()->getStatusCode();
  102.                 $strBody = $e->getResponse()->getBody();        
  103.                 $_ret    = json_decode($body,true);      
  104.                 if (json_last_error()!=0) // Se código = 0, então não tem erro (arquivo JSON convertido para Array corretamente)                    
  105.                     $_ret = $strBody;                
  106.                 /*Exemplo de resposta (depende da API)
  107.                     {
  108.                         "descricao": "ERRO",
  109.                         "erros": [
  110.                             {
  111.                                 "codigo": "integracao.naoAutenticada",
  112.                                 "mensagem": "Acesso não autorizado"
  113.                             }
  114.                         ],
  115.                         "status": 406
  116.                     }
  117.                 */    
  118.                 return $_ret;
  119.                 //Ou gera Exception:                
  120.                 throw new Exception('<b>Erro no request: '.$method.' "'.$uri.'" : <br/>'.PHP_EOL.
  121.                     var_export($_ret,true) . '</b> <br/>'.PHP_EOL);                            
  122.             } else {
  123.                 throw new Exception('<b>Erro no request: '.$method.' "'.$uri.'": <br/>'.PHP_EOL.
  124.                     $e->getMessage() . '</b><pre/>' . PHP_EOL  );  
  125.             }                                              
  126.         } catch (RequestException $e) {
  127.             //Exceptions for errors that occur during a transfer.
  128.             if ($this->is_debug)
  129.                 echo Psr7\str($e->getRequest()).'<br/>' ;    
  130.             echo "<pre>".var_export($options,true)."</pre><br/>";    
  131.             if ($e->hasResponse()) {
  132.                 //throw new Exception(' Erro no request: '.$method.' "'.$uri.'": '.Psr7\str($e->getResponse() ) );                
  133.                 //throw new Exception(' Erro no request: '.$method.' "'.$uri.'": '.$e->getResponse() );
  134.                 throw new Exception(' Erro no request: '.$method.' "'.$uri.'": '.$e->getMessage() );
  135.             } else {
  136.                 throw new Exception(' Erro no request: '.$method.' "'.$uri.'": '.$e->getMessage() );
  137.             }  
  138.         } catch (Exception $e) {
  139.             /* **** Erro genérico  ***** */          
  140.             $_code = $response->getStatusCode();
  141.             //http response code. List of all possible responde code: https://www.restapitutorial.com/httpstatuscodes.html            
  142.             //echo $response->getStatusCode();  
  143.             //http message phrase associated with the response code
  144.             //echo $response->getReasonPhrase();
  145.             //Tratamento específico para a resposta http "204 - No Content"
  146.             if ( $_code==204 )
  147.               throw new Exception ('204 - No Content (request processado, mas retornou vazio): '.$method.' "'.$uri.'"');
  148.             else
  149.               throw new Exception('Erro Geral no request '.$method.' "'.$uri.'": '.$e->getMessage() );            
  150.         }
  151.     }
  152. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement