Uma biblioteca de classes em PHP é um conjunto de classes que podem ser reutilizadas em diferentes partes de um projeto ou até mesmo em projetos diferentes. Essas classes contêm métodos e propriedades que podem ser usados para executar tarefas específicas.
Ao criar um pacote de classes, é possível separar as funcionalidades do projeto em módulos lógicos, tornando o código mais organizado e fácil de manter. Além disso, pacotes de classes podem ser compartilhados com outros desenvolvedores, permitindo que eles utilizem as mesmas classes em seus próprios projetos, economizando tempo e esforço no desenvolvimento.
¶ ⚠️ Disclaimer ⚠️
A biblioteca de classes PHP fornecida neste artigo se encontra desatualizada e não será sujeita a suporte futuro ou atualizações. A utilização desta biblioteca é de inteira responsabilidade do usuário, que concorda em assumir todos os riscos e consequências associadas ao seu uso.
Esta biblioteca de classes PHP é disponibilizada como um recurso gratuito e não há garantias quanto à sua precisão, desempenho ou adequação a qualquer finalidade específica. O autor e a equipe responsável pela criação desta biblioteca não se responsabilizam por quaisquer danos diretos, indiretos, incidentais ou consequenciais resultantes do uso desta biblioteca, incluindo, mas não se limitando a, perda de dados, interrupção de negócios ou quaisquer outras perdas financeiras ou comerciais.
Além disso, salientamos que não nos comprometemos a fornecer suporte técnico, correções de bugs, patches de segurança ou atualizações futuras para esta biblioteca de classes PHP. Portanto, qualquer problema ou deficiência encontrada nesta biblioteca não será abordada ou corrigida por nós.
Recomendamos que os usuários desta biblioteca de classes PHP avaliem cuidadosamente suas necessidades e façam uso apenas se estiverem dispostos a aceitar essas condições e assumir a responsabilidade por quaisquer consequências decorrentes do uso da biblioteca. É importante destacar que não é obrigatório o uso da biblioteca de classes WebserviceClient para consumir a API em PHP, neste caso, você pode optar por desenvolver seu próprio conjunto de classes. No entanto, se você preferir por criar um novo pacote ou alterar o pacote atual, também não poderemos fornecer suporte em relação ao consumo do mesmo.
Ao prosseguir com a utilização deste arquivo, você confirma que leu, compreendeu e concordou com os termos e condições estabelecidos neste disclaimer.
Servidor WEB: Para utilizar a API em PHP, é necessário ter um servidor WEB configurado com APACHE e PHP.
Token e Host da API: É preciso também ter o token e a URL do sistema. Se você ainda não possui um token para a API, há uma wiki disponível que pode ajudá-lo a gerar um token para integrações API.
<?php
namespace IXCsoft;
class WebserviceClientException extends \Exception
{
}
class WebserviceClient implements \Iterator, \ArrayAccess
{
private $host, $curl, $token, $selfSigned, $responseBody, $decoded_resposta, $responseHeaders;
private $headers = [];
/**
* api constructor.
* @param string $host endereço da api
* @param string $token token para autenticação é obrigatório
* @param bool $selfSigned certificado autoassinado é obrigatório
*/
public function __construct($host, $token = null, $selfSigned = false)
{
$this->host = $host;
$this->token = $token;
$this->selfSigned = $selfSigned;
$this->curl = curl_init();
curl_setopt($this->curl, CURLOPT_HEADER, 1);
if ($token) {
curl_setopt($this->curl, CURLOPT_USERPWD, $token);
}
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
if ($selfSigned) {
curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, FALSE);
}
}
public function __destruct()
{
curl_close($this->curl);
}
/**
* Incluir cabeçalho customizado na requisição
* @param string $key Nome do attributo
* @param string $value Valor do attributo
*/
public function setCabecalho($key, $value)
{
$this->headers[] = sprintf("%s: %s", $key, $value);
}
/**
* Fazer uma requisição GET
* @param string $url endereço da requisição
* @param array $params GET parametros da requisição
*/
public function get($url, array $params = [])
{
$this->headers[] = "ixcsoft: listar";
curl_setopt($this->curl, CURLOPT_POST, true);
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $params);
$this->request($url);
}
/**
* Fazer uma requisição POST
* @param string $url endereço da requisição
* @param string array com o conteúdo
* @param bool $json
*/
public function post($url, array $params = [])
{
curl_setopt($this->curl, CURLOPT_POST, true);
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $params);
$this->request($url);
}
/**
* Fazer uma requisição PUT
* @param string $url endereço da requisição
* @param mixed $data array com o conteúdo
* @param string $registro id do registro
*/
public function put($url, $data, $registro)
{
if ($json = !is_scalar($data)){
$data = json_encode($data);
}
curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data);
$this->request($url . '/' . $registro, $json);
}
/**
* Fazer uma requisição DELETE
* @param string $url endereço da requisição
* @param string $registro id do registro
*/
public function delete($url, $registro = '')
{
curl_setopt($this->curl, CURLOPT_CUSTOMREQUEST, "DELETE");
$this->request($url . '/' . $registro);
}
private function request($target, $json = false)
{
if (!strpos($target, '&')) {
$target = trim($target) . '/';
}
curl_setopt($this->curl, CURLOPT_URL, trim($this->host, '/') . '/' . trim($target));
if ($json) {
$this->headers[] = "Content-type: application/json";
}
if ($this->headers) {
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $this->headers);
}
$this->headers = [];
$raw_response = curl_exec($this->curl);
$header_size = curl_getinfo($this->curl, CURLINFO_HEADER_SIZE);
$this->reset();
$header = substr($raw_response, 0, $header_size);
$this->responseHeaders = array_filter(explode(PHP_EOL, $header), function ($line) {
return !preg_match("/^(HTTP|\r\n|Server|Date)/", $line) && trim($line);
});
$this->responseBody = substr($raw_response, $header_size);
}
/**
* Retorna o conteúdo da última requisição
* @param bool $json_decode
* @return mixed
*
*/
public function getRespostaConteudo($json_decode = true)
{
if ($json_decode == true) {
return $this->decoded_resposta = json_decode($this->responseBody, true);
}
return $this->decoded_resposta = $this->responseBody;
}
/**
* Retorna o cabeçalho da ultima requisição
* @return array
*/
public function getResposta_cabecalho()
{
return $this->responseHeaders;
}
//Iterator methods
public function current()
{
return current($this->decoded_resposta);
}
public function key()
{
return key($this->decoded_resposta);
}
public function next()
{
return next($this->decoded_resposta);
}
public function valid()
{
return is_array($this->decoded_resposta)
&& (key($this->decoded_resposta) !== NULL);
}
//ArrayAcess methods
public function rewind()
{
$this->getRespostaConteudo(true);
return reset($this->responseBody);
}
public function offsetExists($chave)
{
$this->getRespostaConteudo(true);
return is_array($this->responseBody) ?
isset($this->responseBody[$chave]) : isset($this->responseBody->{$chave});
}
public function offsetGet($chave)
{
$this->decode_resposta();
if (!$this->offsetExists($chave)){
return NULL;
}
return is_array($this->decoded_resposta) ?
$this->decoded_resposta[$chave] : $this->decoded_resposta->{$chave};
}
public function offsetSet($chave, $valor)
{
throw new WebserviceClientException("Decoded resposta data is immutable.");
}
public function offsetUnset($chave)
{
throw new WebserviceClientException("Decoded resposta data is immutable.");
}
private function reset()
{
curl_reset($this->curl);
curl_setopt($this->curl, CURLOPT_HEADER, 1);
if ($this->token) {
curl_setopt($this->curl, CURLOPT_USERPWD, $this->token);
}
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
if ($this->selfSigned) {
curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, false);
}
}
}