A função getRest foi desenvolvida para realizar requisições HTTP via REST no sistema Protheus, ou em qualquer outro sistema configurável. Utilizando a biblioteca cURL do PHP, ela é flexível o suficiente para autenticar requisições, lidar com parâmetros opcionais e monitorar o tempo de resposta. Abaixo, vamos explorar o funcionamento e propósito de cada parte dessa função.
public function getRest($url, $protheus = true, $options = []) {
$inicio = microtime(true);
// Get cURL resource
$curl = curl_init();
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_USERAGENT => 'Codular Sample cURL Request'
]);
if ($protheus) {
//EXIT(REST_USER . ':' . REST_PASS);
curl_setopt($curl, CURLOPT_HTTPHEADER, ['tenantId: ' . EMPCOD]);
if (REST_AUTH) {
curl_setopt($curl, CURLOPT_HTTPHEADER, ['Authorization: BASIC ' . base64_encode(REST_USER . ':' . REST_PASS)]);
}
}
if (count($options) > 0) {
foreach ($options as $index_opt => $option) {
curl_setopt($curl, CURLOPT_HTTPHEADER, [$index_opt . ': ' . $option]);
}
}
// Send the request & save response to $resp
//exit($url);
$json_results = curl_exec($curl);
if (isset($options['status_code']) && $options['status_code']) {
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
}
$http_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
// Close request to clear up some resources
curl_close($curl);
//exit($json_results);
if ($json_results == '[{}]') {
$json_results = '';
}
//$json_results = utf8_encode($json_results);
$json_results = mb_convert_encoding($json_results, 'UTF-8', 'auto');
$fim = microtime(true);
$diferencaSegundos = $fim - $inicio;
$session = new Session();
$_data_session['REQUESTQUERIES'][] = "[REST]<br/>" . $url . "<br/ > ----- Tempo em segundos: " . $diferencaSegundos;
$session->updateData($_data_session, 'REQUESTQUERIES');
if (LOGFILE == 'ON') {
$tempo = ' [' . $diferencaSegundos . ' segundos] ';
error_log('[getRest][' . date("d/m/Y H:i:s") . ']:[status:'. $http_code .']' . $url . $tempo . PHP_EOL, 3, ROOT . '/log/' . LOGFILENAME);
}
if (isset($options['status_code']) && $options['status_code']) {
return [$http_code, $json_results];
} else {
return $json_results;
}
}
Descrição Geral da Função
A função getRest permite fazer chamadas para URLs REST, retornando o resultado em JSON. É especialmente útil para buscar dados ou executar ações em APIs RESTful, como as expostas pelo sistema Protheus, podendo autenticar e personalizar a requisição conforme necessário.
Estrutura e Parâmetros da Função
A função possui três parâmetros principais:
$url: URL da API REST a ser acessada.$protheus: Booleano que indica se a requisição é para o sistema Protheus, onde são necessárias configurações específicas de autenticação e cabeçalho.$options: Array opcional para configurações adicionais de cabeçalho e outras opções, como a possibilidade de retornar o código HTTP da resposta.
Passo a Passo da Função
- Início do Cronômetro: A variável
$inicioregistra o tempo de início da execução da função, permitindo calcular o tempo total ao final. - Configuração do cURL: A função inicializa a instância cURL e define algumas opções básicas:
- CURLOPT_RETURNTRANSFER: Retorna o resultado da requisição em vez de imprimi-lo.
- CURLOPT_URL: Define a URL da requisição.
- CURLOPT_USERAGENT: Define um agente de usuário para a requisição.
- Cabeçalhos para Protheus:
- Se a variável
$protheusfor verdadeira, a função configura cabeçalhos específicos para acessar a API do Protheus. - Um cabeçalho
tenantIdé adicionado, com o código da empresa configurado emEMPCOD. - Se a variável
REST_AUTHestiver ativa, é adicionada uma autenticação básica com as credenciais (REST_USEReREST_PASS) codificadas em Base64.
- Se a variável
- Cabeçalhos Opcionais:
- Para personalizar a requisição, a função itera sobre o array
$optionse adiciona cada par chave-valor como um cabeçalho HTTP.
- Para personalizar a requisição, a função itera sobre o array
- Execução da Requisição:
- A função executa a requisição e armazena a resposta em JSON na variável
$json_results. - Ela também verifica se o código HTTP de resposta é necessário (
$options['status_code']). Se sim, armazena o código na variável$http_code.
- A função executa a requisição e armazena a resposta em JSON na variável
- Tratamento da Resposta:
- Após receber a resposta, a função converte seu encoding para UTF-8 para evitar problemas de caracteres.
- Se a resposta for um JSON vazio (
[{}]), ela é redefinida para uma string vazia.
- Cálculo do Tempo de Resposta:
- A função calcula a duração da requisição subtraindo o tempo final (
$fim) do tempo inicial ($inicio), guardando esse tempo em segundos.
- A função calcula a duração da requisição subtraindo o tempo final (
- Registro de Logs e Sessão:
- Logs de Sessão: A função registra a URL e o tempo da requisição em uma sessão (
REQUESTQUERIES). - Logs de Arquivo: Se o
LOGFILEestiver ativado, a função registra o tempo da requisição e o status da resposta em um arquivo de log.
- Logs de Sessão: A função registra a URL e o tempo da requisição em uma sessão (
- Retorno da Função:
- A função retorna o JSON de resposta. Se
$options['status_code']estiver ativo, retorna um array contendo o código HTTP e o JSON da resposta.
- A função retorna o JSON de resposta. Se
Exemplo de Uso
Essa função é essencial para integrar sistemas que dependem de dados do Protheus ou outras APIs REST. Abaixo está um exemplo de como utilizá-la para buscar dados:
$url = "https://api.protheus.com/data"; $response = getRest($url, true, ['status_code' => true]); // Exibe o código HTTP e a resposta JSON list($http_code, $json_data) = $response; echo "Status HTTP: " . $http_code; echo "Dados JSON: " . $json_data;
Conclusão
A função getRest é uma ferramenta poderosa para acessar APIs REST, oferecendo autenticação opcional, personalização de cabeçalhos, controle de tempo de resposta e registro em log. Ela é altamente customizável, permitindo o uso tanto para chamadas simples quanto para integrações robustas com o sistema Protheus, simplificando o processo de comunicação entre sistemas e melhorando a eficiência na troca de dados.