• cerca

SEI GIA' REGISTRATO? EFFETTUA ADESSO IL LOGIN.



HAI DIMENTICATO LA PASSWORD? CLICCA QUI

NON SEI ANCORA REGISTRATO A WEBAREA? CLICCA QUI E REGISTRATI !

Come utilizzare cURL in PHP per effettuare chiamate in GET o POST ad un webservice, o per catturare il contenuto di una pagina web.

di :: 11 luglio 2018

get post utilizzando curl php

In questo tutorial vediamo come utilizzare cURL in PHP, con alcuni esempi pratici, per interagire con altre pagine o risorse web, ad esempio ad un webservice, oppure per prelevare il contenuto di un pagina web.

Possiamo distinguere 5 fasi nel processo di chiamata ad una url, utilizzando PHP Curl:

  1. inizializziamo una sessione in cURL
  2. definiamo le opzioni per questa sessione
  3. effettuiamo la chiamata alla url
  4. chiudiamo la sessione
  5. stampiamo a video il risultato della chiamata

Se, ad esempio, vogliamo catturare la pagine di Google che risponde alla url "http://www.google.com/search?q=curl+php", creiamo uno script PHP come questo:

<?php
//step1
$curlSES=curl_init(); 
//step2
curl_setopt($curlSES,CURLOPT_URL,"http://www.google.com/search?q=curl+php");
curl_setopt($curlSES,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curlSES,CURLOPT_HEADER, false); 
//step3
$result=curl_exec($curlSES);
//step4
curl_close($curlSES);
//step5
echo $result;
?>

Vediamo nel dettaglio questo script:

  1. Inizializziamo una sessione cURL utilizzando la funzione curl_init. Creiamo una variabile chiamata, ad esempio, $curlSES
  2. Impostiamo le opzioni di questa sessione Curl, ricorrendo alla funzione curl_setopt.
    Abbiamo definito le opzioni:
    CURLOPT_URL: per  settare la url da chiamare con Curl. La chiamata avverrà in GET.
    CURLOPT_RETURNTRANSFER settato a "True" ci consente di catturare in una stringa (nella variabile $result) la risposta del server invece che stamparla subito a video.
    CURLOPT_HEADER settato a "False" per ignorare gli Header di risposta e quindi non visualizzarli
  3. Utilizziamo la funzione curl_exec per effettuare la chiamata, e catturiamo la risposta nella variabile $result
  4. Chiudiamo la sessione cURL con la funzione curl_close
  5. Infine stampiamo a video la risposta ottenuta, cioè la variabile $result

Così facendo abbiamo effettuato una chiamata in GET alla url di Google (se non specificato nelle opzioni, infatti, viene effettuata una chiamata di tipo GET) , ed abbiamo catturato l'html della pagina di Google.

Si tratta di un esempio molto semplice ma che ci è di aiuto per iniziare ad utilizzare cURL con PHP

Le opzioni utilizzabili in cURL non numerose. Noi ne abbiamo viste solo tre in questo esempio.

Vediamo altre opzioni, con un nuovo esempio, in cui effettuiamo una chiamata in POST anzichè in GET, ad un webservice il cui indirizzo è "www.miosito.it", a cui passo alcune variabili come "nome", "cognome" ed "email", e mi aspetto che questo webservice mi risponda con una semplice stringa di "ok" o "ko".

Per passare queste variabili creo una variabile di tipo array chiamata $pars

<?php

$pars=array(
    'nome' => 'pippo',
    'cognome' => 'disney',
    'email' => 'pippo@paperino.com',
);

//step1
$curlSES=curl_init(); 
//step2
curl_setopt($curlSES,CURLOPT_URL,"http://www.miosito.it");
curl_setopt($curlSES,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curlSES,CURLOPT_HEADER, false); 
curl_setopt($curlSES, CURLOPT_POST, true);
curl_setopt($curlSES, CURLOPT_POSTFIELDS,$pars);
curl_setopt($curlSES, CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curlSES, CURLOPT_TIMEOUT,30);
//step3
$result=curl_exec($curlSES);
//step4
curl_close($curlSES);
//step5
echo $result;
?>

A differenza dell'esempio precedente, per effettuare una chiamata POST, utilizziamo l'opzione CURLOPT_POST settato a "true", e passiamo le variabili sottoforma di array attraverso il parametro CURLOPT_POSTFIELDS e quindi non più appese alla url, come avviene per le chiamate GET.

Inoltre abbiamo visto la presenza altre opzioni.

CURLOPT_CONNECTTIMEOUT

E' il tempo massimo, in secondi, entro cui la connessione al server dovrà avvenire. Oltre questo tempo la chiamata verrà annullata.

CURLOPT_TIMEOUT

E' il tempo massimo, in secondi, di esecuzione della chiamata al server a cui siamo connessi (è il tempo di risposta del server).

Queste ultime due opzioni sono importanti in quanto evitano di rimanere con una chiamata cURL "appesa" perchè in attesa di connessione o di risposta.

Vediamo adesso altre opzioni che possono risultare utili nelle chiamate cURL.

CURLOPT_USERAGENT

Viene utilizzato per impostare uno user agent.
Può essere utile ad esempio quando si vuole catturare una o più pagine di un sito web e ci si vuole "camuffare" da utente reale. Questo è un esempio di suo utilizzo.

curl_setopt($curlSES,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');

Attenzione per chi utilizza cURL per queste attività di cattura di pagine web: con cURL è possibile fingere di utilizzare uno user agent, ma non è possibile alterare il "Referrer", cioè la fonte della chiamata. In poche parole non esiste una opzione "CURLOPT_REFERRER".

CURLOPT_FOLLOWLOCATION

Se il server che stiamo chiamando effettua uno o più redirect su altre pagine, e vogliamo seguire questi redirect, dobbiamo settare questa opzione a "true"

curl_setopt($curlSES, CURLOPT_FOLLOWLOCATION, true);

CURLOPT_MAXREDIRS

Collegato al parametro precedente, questa opzione consente di definire il numero massimo di redirect da seguire. Ad esempio 10 redirect massimi.

curl_setopt($curlSES, CURLOPT_MAXREDIRS, 10);

Per la lista completa delle opzioni di PHP cURL si rimanda alla pagina dedicata del sito php.net.

Gestione degli errori Curl PHP

Vediamo adesso come modificare l'esempio precedente per gestire un eventuale errore nella chiamata cURL (ad esempio un timeout)

<?php

$pars= array(
    'nome' => 'pippo',
    'cognome' => 'disney',
    'email' => 'pippo@paperino.com',
);

//step1
$curlSES=curl_init(); 
//step2
curl_setopt($curlSES,CURLOPT_URL,"http://www.miosito.it");
curl_setopt($curlSES,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curlSES,CURLOPT_HEADER, false); 
curl_setopt($curlSES, CURLOPT_POST, true);
curl_setopt($curlSES, CURLOPT_POSTFIELDS,$pars);
curl_setopt($curlSES, CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curlSES, CURLOPT_TIMEOUT,30);
//step3
if(curl_exec($curlSES) === false)
{
    echo "Errore: ". curl_error($curlSES)." - Codice errore: ".curl_errno($curlSES);
}
else
{
    $result=curl_exec($curlSES);
    //step5
    echo $result;
}

//step4
curl_close($curlSES);

?>

Come potete vedere, abbiamo gestito con un "if" il caso in cui curl_exec sia "false" cioè quando la chiamata va in errore.

if(curl_exec($curlSES) === false)

In caso di errore printiamo sia una stringa descrittiva dell'errore, utilizzando la funzione "curl_error", che lo specifico codice di errore, utilizzando la funzione "curl_errno".

Per la lista completa dei codici di errore si rimanda a questa pagina.

Se invece curl_exec è "true", cioè nel caso "else", printiamo la variabile $return con il contenuto della risposta del server.

x

ATTENZIONE