Php - Criando uma library Curl no Codeigniter


Vamos começar criando uma classe Curl.php. A ideia é que esta classe possa fazer requisições POST através do PHP, ao invés de utilizar um formulário, por exemplo.

Para começar a trabalhar com Libraries devemos ter em mente algumas regras do Codeigniter:

- Nomes de arquivos devem ter a primeira letra maiuscula. Exemplo:  Myclass.php
- A declaração da classe deve ter a primeira letra maiuscula. Exemplo:  class Myclass
- O nome da classe e o nome do arquivo devem ser os mesmos.
- O Arquivo deve ficar dentro de 'application/libraries', caminho existente dentro da instalação do Codeigniter.

Com estes pré-requisitos em mente podemos começar a trabalhar.

Vamos colocar nosso arquivo "Curl.php" dentro de 'application/libraries'
O conteúdo do arquivo é o que segue abaixo:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Curl {

private $ch;

public function post($url,$data)
{
echo $url."<br>";

$this->init($url);

curl_setopt($this->ch,CURLOPT_POST, 1);
curl_setopt($this->ch,CURLOPT_POSTFIELDS, $data);

return $this->exec();

}

private function init($url)
{

$this->ch = curl_init();
curl_setopt($this->ch,CURLOPT_URL, $url);

}

    private function exec()
    {

$result = curl_exec($this->ch);
curl_close($this->ch);

return $result;

    }

}

Esta é a classe básica para que a nossa library funcione.

Podemos chama-la dentro de um model ou controller na inicialização de qualquer classe simplesmente assim:

$this->load->library('Curl');

E executar o método assim:

$retorno = $this->curl->post('http://endereco/postar/',Array('nome'=>'eu', 'mensagem' => 'Ola Curl'));

Como já fazemos com as demais libraries padrão do Codeigniter.

Agora que fizemos a chamada Curl, temos de chamar alguém, correto? Bem, vamos supor que "do outro lado" temos os seguinte script no endereço http://endereco/postar/.

<php
echo 'Sua mensagem foi enviada';
var_dump($_POST);

Receberemos como resposta:

Sua mensagem foi enviada
array(2) { ["nome"]=> string(2) "eu" ["mensagem"]=> string(8) "Ola Curl" } bool(true)

Se você apontar para uma URL normal com noticias e etc ele retornará todo o conteúdo da página.

Lembrando que o retorno vai depender da url de destino, se ela está capturando corretamente os dados e etc, ou seja, não depende só do nosso lado o correto funcionamento, mas sim de ambos os lados.

Caso a URL não seja válida bool(false) será retornado.

Vamos incrementar um pouco mais nossa library. Vamos colocar uma opção de retorno do header da página que consultados. O Header tem várias informações importantes como, por exemplo, se a página foi redirecionada, se está com erro 500, se retornou tudo bem com um 200 e etc.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Curl {

private $ch;

public function post($url,$data)
{
echo $url."<br>";

$this->init($url);

curl_setopt($this->ch,CURLOPT_POST, 1);
curl_setopt($this->ch,CURLOPT_POSTFIELDS, $data);
curl_setopt($this->ch, CURLOPT_HEADER, true);

return $this->exec();

}

private function init($url)
{

$this->ch = curl_init();
curl_setopt($this->ch,CURLOPT_URL, $url);

}

    private function exec()
    {

$result = curl_exec($this->ch);
curl_close($this->ch);

return $result;
    }
}

No script acima "curl_setopt($this->ch, CURLOPT_HEADER, true)" ativa o retorno do cabeçalho.

Vamos melhorar um pouco mais a classe, separando em métodos estes 'a mais', além de implementar um método de erro e uma opção de apenas retornar true caso o post tenha sido executado de maneira correta.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Curl {

private $ch;

public function __construct($param)
{

//Inicializa a classe
$this->ch = curl_init();
curl_setopt($this->ch,CURLOPT_URL, $param['url']);

}


/**=========== POST ==============
* Configura os parâmetros de POST
*
* @params {array} $data Dados que serão enviados por POST
* @return {string/bool} Retorno do método de erro
*
*/
public function post($data)
{

curl_setopt($this->ch,CURLOPT_POST, 1);
curl_setopt($this->ch,CURLOPT_POSTFIELDS, $data);

return $this->exec();

}


/**=========== EXEC ==============
* Executa o curl
*
* @return {string/bool} Retorno do método de erro
*
*/
    private function exec()
    {

$retorno = $this->erro(curl_exec($this->ch));

curl_close($this->ch);

return $retorno;

    }

/**=========== ERRO ==============
* Controla as respostas com ou sem erro
*
* @param {object} $resp Retorno do curl_exec
*
* @return {string/bool} Retorna o tipo de erro ou 'true'
*
*/
private function erro($resp)
{

if  ($resp === false)  {

return 'Error: ' . curl_error($this->ch);

}  else  {

return true;

}

}

/**=========== OPÇÕES ==============
* Controla as opções de postagem
*
* @param {array} $params Array('NOME_DA_OPCAO' => '','NOME_DA_OPCAO' => '')
*
*/
public function opcoes($params = Array())
{

if  (count($params)  == 0)  return false;

if  (isset($params['CURLOPT_HEADER']))  { // Retorna o cabeçalho da página de destino

curl_setopt($this->ch, CURLOPT_HEADER, true);

}

if  (isset($params['CURLOPT_RETURNTRANSFER']))  { // Bloqueia a resposta padrão, que é imprimir tudo que está na página de destino

curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);

}

}

}

Tiveos que mexer bastante na estrutura da classe de modo que agora temos um método construtor que inicializa o curl, sendo que este construtor também já recebe a url.

Depois que a classe é inicializada podemos chamar o método post quando quisermos. Ele vai usar o método padrão exec() que executa o curl.

Esta estrutura é bacana pois podemos fazer métodos separados para cada tipo de envio, seja ele GET, PUT, FTP, etc. e utilizar o mesmo método padrão exec(), além dos métodos erro() e opcoes() que também são gerais.

No caso do método opcoes() podemos continuar implementando quantos parametros do Curl quisermos, deixando mais completa a classe. Em nosso caso hoje os que coloquei serão suficientes para ter um resultado satisfatório.

Assim, para utilizarmos a nova library Curl devemos seguir o seguinte fluxo:

No construtor do Model ou Controller chamar
$this->load->library('Curl',Array('url' => URL_POST));

Dentro do seu método do Model ou Controller que faz o post devemos fazer:

$this->curl->opcoes(Array(
'CURLOPT_HEADER' => '',
'CURLOPT_RETURNTRANSFER' => ''
));
$l = $this->curl->post(Array(
'nome' => 'eu',
'mensagem' => 'Ola Curl'
));

var_dump($l);

onde "opcoes()" vai instanciar ou não as propriedades de HEADER e RETURN TRANSFER, que é aquela opção de trazer ou não todo o conteudo da URL que é chamada.

Se usarmos apenas

$l = $this->curl->post(Array(
'nome' => 'eu',
'mensagem' => 'Ola Curl'
));

var_dump($l);

as opções padrão serão retornadas, ou seja, o método opcoes() é mesmo opcional :-)

Então é isso

Comentários

  1. Curl library in Codeigniter can also be used to show data in JSON formation. For this, Codeigniter curl library must be installed and curl operations must be used to configure the script.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

MySQL - Completando quantidades fixas de caracteres com as funções LPAD() e RPAD()

MySQL - Clonando tabelas na linha de comando

PHP - Gerando arquivo em UTF-8 com fwrite() e utf8_encode()