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:

  1. $url: URL da API REST a ser acessada.
  2. $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.
  3. $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

  1. Início do Cronômetro: A variável $inicio registra o tempo de início da execução da função, permitindo calcular o tempo total ao final.
  2. 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.
  3. Cabeçalhos para Protheus:
    • Se a variável $protheus for 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 em EMPCOD.
    • Se a variável REST_AUTH estiver ativa, é adicionada uma autenticação básica com as credenciais (REST_USER e REST_PASS) codificadas em Base64.
  4. Cabeçalhos Opcionais:
    • Para personalizar a requisição, a função itera sobre o array $options e adiciona cada par chave-valor como um cabeçalho HTTP.
  5. 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.
  6. 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.
  7. 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.
  8. 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 LOGFILE estiver ativado, a função registra o tempo da requisição e o status da resposta em um arquivo de log.
  9. 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.

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.