Il software libero cURL è uno dei primi e più popolari progetti open source. Il programma scritto in C viene uti­liz­za­to per inviare dati nelle reti in­for­ma­ti­che. Il nome cURL sta per “client URL”. La licenza aperta concede il diritto di uti­liz­zar­lo per qualsiasi scopo e at­tual­men­te viene usato in in­nu­me­re­vo­li di­spo­si­ti­vi.

Che cos’è cURL?

Il software cURL è composto da due com­po­nen­ti. La libreria del software libcurl è alla base dell’effettivo tra­sfe­ri­men­to dei dati e supporta i seguenti pro­to­col­li:

  • DICT
  • FILE
  • FTP
  • FTPS
  • GOPHER
  • HTTP
  • HTTPS
  • IMAP
  • IMAPS
  • LDAP
  • LDAPS
  • POP3
  • POP3S
  • RTMP
  • RTSP
  • SCP
  • SFTP
  • SMB
  • SMBS
  • SMTP
  • SMTPS
  • TELNET
  • TFTP

Il programma a riga di comando cURL agisce, invece, come un’in­ter­fac­cia testuale e in­te­ra­gi­sce con libcurl tramite la riga di comando.

Il programma è uno strumento im­por­tan­te per lo sviluppo web, perché permette allo svi­lup­pa­to­re di co­mu­ni­ca­re di­ret­ta­men­te con i server invece di passare per un browser. Gli script basati sui comandi cURL (in inglese “cURL commands”) vengono uti­liz­za­ti per au­to­ma­tiz­za­re processi nonché per il testing e il debugging.

Come funziona cURL?

I due com­po­nen­ti di cURL fun­zio­na­no in modi diversi.

Come si usa libcurl?

La libreria del programma libcurl consente di inviare dati a reti in­for­ma­ti­che. Sono di­spo­ni­bi­li diversi “Language Bindings” (col­le­ga­men­ti a linguaggi) per molti dei linguaggi di pro­gram­ma­zio­ne più popolari, il che rende le funzioni di libcurl com­pa­ti­bi­li con un gran numero di software che co­mu­ni­ca­no con i server.

Come si usa cURL?

Il programma a riga di comando cURL viene uti­liz­za­to per lo sviluppo web. Il metodo più semplice consiste nel digitare i comandi cURL nella riga di comando, dove è possibile, con le co­no­scen­ze ap­pro­pria­te, sot­to­por­re i server e le API a procedure di testing e debugging.

Invece di immettere i comandi ma­nual­men­te nella riga di comando, potete anche rag­grup­par­li in script. Ciò consente di stan­dar­diz­za­re e au­to­ma­tiz­za­re ope­ra­zio­ni complesse. Questo vale sia per il ca­ri­ca­men­to e il download di dati che per la com­pi­la­zio­ne, a livello di pro­gram­ma­zio­ne, di moduli e il mirroring di interi siti web.

Lo schema di un comando cURL è ge­ne­ral­men­te il seguente:

# Schema generale di un comando cURL
curl [opzioni] </url>

Negli esempi suc­ces­si­vi uti­liz­zia­mo lo schema seguente:

# Visualizzare l’URL seguente
url="www.example.com"
curl [opzioni] "$url"

Abbiamo ester­na­liz­za­to l’URL a una variabile, fo­ca­liz­zan­do l’at­ten­zio­ne sulle opzioni. Le opzioni de­ter­mi­na­no il fun­zio­na­men­to della chiamata cURL.

Esempi pratici del comando cURL in Linux

Per uti­liz­za­re i seguenti esempi di cURL, è ne­ces­sa­rio:

  1. un computer con sistema operativo Linux o simile a UNIX, incluso macOS;
  2. accesso alla console o alla riga di comando;
  3. un editor di codice/editor di testo semplice per la com­po­si­zio­ne di comandi.
N.B.

Usate un solo editor di codice/editor di testo semplice per comporre i comandi. Non dovreste mai uti­liz­za­re un software di ela­bo­ra­zio­ne testi come Word, Ope­nOf­fi­ce o Li­breOf­fi­ce per preparare un testo per la riga di comando.

Un primo test con cURL

Ve­ri­fi­ca­te in­nan­zi­tut­to se cURL è in­stal­la­to sul vostro sistema. A tale scopo, aprite la riga di comando e inserite il comando seguente. Potrebbe essere ne­ces­sa­rio premere Invio per eseguire il codice.

# Verificare l’installazione di cURL
curl --version

Se vi appare un testo che inizia con “curl” e un numero di versione, allora cURL è in­stal­la­to. Se cURL invece non fosse in­stal­la­to, seguite le istru­zio­ni di “Eve­ry­thing curl” per in­stal­la­re il programma.

Consiglio

Con i comandi “curl --help” e “curl --manual” ri­ce­ve­re­te maggiori in­for­ma­zio­ni sul comando cURL.

È inoltre con­si­glia­bi­le aprire nell’editor di codice un documento nuovo. Potete copiare i comandi per pre­pa­rar­li all’uso nella riga di comando. Non appena il comando è pronto, copiatelo nella riga di comando ed ese­gui­te­lo.

N.B.

I comandi usati nella riga di comando sono molto potenti. Un comando immesso in modo errato può anche pa­ra­liz­za­re l’intero sistema. Pertanto, non è con­si­glia­to copiare comandi da Internet ed eseguirli sulla riga di comando. Dovreste invece aprire un documento vuoto in un editor di codice e copiarli lì. Questo passaggio in­ter­me­dio vi costringe a fare una breve pausa, rivedere e, se ne­ces­sa­rio, adattare ogni comando prima di eseguirlo.

Scaricare file con cURL

Scaricare dati da un server con cURL

In linea di principio, con cURL potete re­cu­pe­ra­re qualsiasi URL che conoscete. Il termine “curl” viene uti­liz­za­to, in questo contesto, so­stan­zial­men­te per indicare l’in­di­riz­za­men­to di un URL con cURL. Provate a eseguire il seguente comando:

# Indirizzare il seguente sito
site="www.google.com"
curl "$site"

Se eseguite il codice così come indicato, otterrete una massa confusa di dati. In risposta all’accesso cURL, infatti, verrebbe re­sti­tui­ta la pagina iniziale di Google in formato HTML. Il codice sorgente HTML viene vi­sua­liz­za­to di­ret­ta­men­te nella riga di comando senza for­mat­ta­zio­ne. Per poterlo vi­sua­liz­za­re cor­ret­ta­men­te serve tuttavia un browser. Un’opzione migliore è di solito quella di salvare il file in locale.

Consiglio

Uti­liz­za­te il comando “clear” nella riga di comando per svuotare lo schermo. In questo modo è possibile eliminare quantità esor­bi­tan­ti di dati dalla riga di comando.

Scaricare un file con cURL e salvarlo in locale

Sca­ri­chia­mo un logo dalla versione inglese di Wikipedia. L’opzione “-O” (o maiuscola, non zero) indica a cURL di usare il nome del file po­si­zio­na­to alla fine dell’URL. Con questa opzione, cURL salverà il file scaricato in locale man­te­nen­do il nome.

# Un’immagine della versione inglese di Wikipedia
file="https://en.wikipedia.org/static/images/project-logos/enwiki-2x.png"
# Scaricare l’immagine e salvarla in locale con lo stesso nome
curl "$file" -O

Come si comporta invece con un URL di cui non è indicato il nome? Testate il seguente codice:

# Pagina iniziale di Google
homepage="www.google.com"
# Scaricare la pagina iniziale con l’opzione -O
curl "$homepage" -O

Come vedete, si è ve­ri­fi­ca­to un errore perché nell’URL della pagina iniziale di Google non è spe­ci­fi­ca­to alcun nome. In questo caso, con l’opzione “-o” (o minuscola), potete assegnare voi un nome al file:

# Pagina iniziale di Google
homepage="www.google.com"
# Nome del file da scrivere
nome="homepage-google.html"
# Scaricare la pagina iniziale e salvarla localmente con il nome scelto
curl "$homepage" -o "$nome"

Ri­pren­de­re un download in­ter­rot­to con cURL

Forse vi è già capitato che un download di grandi di­men­sio­ni, che è durato diverse ore, si in­ter­rom­pa im­prov­vi­sa­men­te e siete stati costretti a ri­co­min­cia­re da capo. In questo caso, cURL vi può aiutare con l’opzione “-C-”:

# Un grande file (genoma umano) da scaricare
file="https://ftp.ncbi.nih.gov/genomes/refseq/vertebrate_mammalian/Homo_sapiens/reference/GCF_000001405.39_GRCh38.p13/GCF_000001405.39_GRCh38.p13_genomic.gbff.gz"
# Continuare il download se interrotto
curl -C- -O "$file"
N.B.

L’opzione contiene in realtà uno spazio dopo la C “-C -”. La versione equi­va­len­te “-C-” che usiamo in questi esempi è, tuttavia, più leggibile e più facile da ricordare.

Se ne­ces­sa­rio, è anche possibile annullare ma­nual­men­te un download avviato con cURL. Ciò è par­ti­co­lar­men­te van­tag­gio­so nel caso di file di grandi di­men­sio­ni, ad esempio se si deve uscire di casa e portare il portatile con sé.

Consiglio

Le chiamate in corso di cURL possono essere annullate. Per farlo, premete Ctrl + C, se ne­ces­sa­rio anche più volte.

Co­mu­ni­ca­re con il server uti­liz­zan­do cURL

La fun­zio­na­li­tà di download di cURL è simile a quella del popolare strumento da riga di comando wget. cURL, tuttavia, non è spe­cia­liz­za­to nei download, ma è pro­get­ta­to per la co­mu­ni­ca­zio­ne generale nelle reti. Le funzioni di cURL quindi non finiscono qui.

Ve­ri­fi­ca­re con cURL se un server è rag­giun­gi­bi­le

Con cURL è possibile ve­ri­fi­ca­re se un server è rag­giun­gi­bi­le. In questo senso, il fun­zio­na­men­to di cURL è simile a quello del comando ping. cURL offre, tuttavia, una maggiore fles­si­bi­li­tà grazie alla grande varietà di pro­to­col­li e opzioni sup­por­ta­ti. Ping lavora, inoltre, a livello di Internet mentre cURL in­ter­vie­ne a livello di ap­pli­ca­zio­ne. Ciò significa che Ping verifica se la macchina è collegata a Internet. Il seguente comando cURL, invece, controlla se e come risponde un server:

# Verificare se un server web è raggiungibile
server="google.com"
curl -I "$server"

Se dopo l’ese­cu­zio­ne del codice vengono vi­sua­liz­za­te le in­for­ma­zio­ni sullo stato, il server è rag­giun­gi­bi­le.

Ricevere header con cURL

Per ogni richiesta HTTP, oltre al documento vero e proprio, vengono scambiati diversi metadati. Queste in­for­ma­zio­ni relative all’in­te­sta­zio­ne HTTP de­scri­vo­no sia il documento che lo stato della richiesta HTTP. Si­cu­ra­men­te vi sarà capitato di in­con­tra­re l’errore “404 Not Found”. Si tratta proprio di un metadato, che indica che il documento richiesto non è stato trovato.

Date un’occhiata all’output delle in­te­sta­zio­ni dell’URL “google.com”. Usate a questo scopo cURL con l’opzione “--head”:

# Ricevere l’header
url="google.com"
curl --head "$url"

Tra le altre cose, dovreste vedere la dicitura “301 Moved Per­ma­nen­tly”. Si tratta di un codice di stato HTTP per il rein­di­riz­za­men­to per­ma­nen­te, in questo caso di [google.com] (senza 'www') a [www.google.com].

Consiglio

Invece dell’opzione “--head”, è anche possibile usare l’al­ter­na­ti­va “-I” (i maiuscola). Per ri­cor­dar­lo più fa­cil­men­te pensate che lo uti­liz­za­te per re­cu­pe­ra­re Infor­ma­zio­ni di un URL e non il suo contenuto effettivo.

Ana­liz­za­re le catene di rein­di­riz­za­men­to con cURL

rein­di­riz­za­men­ti HTTP (in inglese “Redirects”) possono essere collegati in serie. In questo contesto, viene uti­liz­za­to il termine “catena di rein­di­riz­za­men­to (in inglese Redirect Chain). Im­ma­gi­nia­mo, ad esempio, un sito web la cui pagina iniziale è [https://www.example.com/]. Se, tuttavia, in­di­riz­zia­mo questo sito con [http://example.com], po­treb­be­ro ve­ri­fi­car­si i seguenti rein­di­riz­za­men­ti:

  • [http://example.com] → [https://example.com]
  • [https://example.com] → [https://www.example.com]
  • [https://www.example.com] → [https://www.example.com/]

Una catena di rein­di­riz­za­men­ti comporta tempi di ca­ri­ca­men­to inu­til­men­te lunghi e dovrebbe essere evitata. Purtroppo, questo non è un problema facile da ana­liz­za­re. Quando si carica il sito nel browser, i rein­di­riz­za­men­ti vengono eseguiti senza che l’utente se ne accorga. In questo caso, cURL vi aiuta con l’opzione “--location”, che indica a cURL di seguire tutti i rein­di­riz­za­men­ti. In questo esempio usiamo l’opzione “--head” perché non siamo in­te­res­sa­ti al contenuto delle pagine.

# Verificare reindirizzamenti
url="google.com"
curl --location --head "$url"
Consiglio

Invece dell’opzione “--location”, potete usare anche l’al­ter­na­ti­va “-L” (l maiuscola).

Tra­sfe­ri­re dati su un server con cURL

cURL non permette soltanto di scaricare dei dati, ma anche di inviarne su un server. Questa funzione è molto pratica, ad esempio, se si desidera au­to­ma­tiz­za­re la com­pi­la­zio­ne di un modulo online. Oltre al metodo di richiesta POST, cURL supporta anche quello GET.

Poiché l’invio di dati è più complesso che il loro download, possiamo delineare qui soltanto un esempio ap­pros­si­ma­ti­vo. Per in­for­ma­zio­ni più det­ta­glia­te, con­sul­ta­te la pagina Eve­ry­thing curl.

# Trasferire dati al server
url="example.com"
# Indicare i dati come membri nomi-valore separati da '&'
dati="nome=Mario&cognome=Rossi&età=42"
# Con questa richiesta i dati saranno trasferiti con il metodo POST
curl --data "$date" "$url"
# In alternativa, è possibile indicare a curl di trasferire i dati tramite GET
curl --data "$date" "$url" --get

Leggere i cookies con cURL

cookie HTTP sono piccole in­for­ma­zio­ni di testo che vengono, in genere, me­mo­riz­za­te in locale sul di­spo­si­ti­vo quando si visitano dei siti web. Nel browser è possibile sia vi­sua­liz­za­re il contenuto dei cookie di un sito visitato che eli­mi­nar­li. Di solito, si tratta tuttavia di una procedura troppo com­pli­ca­ta da eseguire ai fini di un test. Com­bi­nan­do cURL con l’opzione “--cookie-jar” (in italiano “barattolo per biscotti”) è possibile accedere ai cookie in modo più diretto.

# Leggere i cookie
url="www.google.com"
cookies="cookies.txt"
curl --head --cookie-jar "$cookies" "$url"
# Visualizzare i cookie con il comando cat
cat "$cookies"
Consiglio

Uti­liz­zan­do l’opzione “--cookie”, è inoltre possibile indicare a cURL di inviare dei cookie.

Opzioni generali

Alcune delle opzioni cURL di­spo­ni­bi­li possono essere combinate con quelle già pre­sen­ta­te.

Vi­sua­liz­za­re in­for­ma­zio­ni ag­giun­ti­ve

A volte le in­for­ma­zio­ni vi­sua­liz­za­te durante l’ese­cu­zio­ne di un comando cURL possono essere in­suf­fi­cien­ti. In questo caso è possibile uti­liz­za­re l’opzione “--verbose”. Un comando cURL con questa opzione fornisce una maggiore quantità di in­for­ma­zio­ni.

# Visualizzare informazioni aggiuntive
url="www.google.com"
curl --verbose -I "$url"

Spe­ci­fi­ca­re utente e password con cURL

Alcuni URL sono protetti da accessi non au­to­riz­za­ti con l’au­ten­ti­ca­zio­ne HTTP. Ma cosa succede se dovete accedere a un URL del genere con cURL? Se non indicate il nome utente e la password, vedreste l’errore HTTP 401. In questo caso, potete uti­liz­za­re lo schema seguente:

# Specificare utente e password con curl
# URL protetto da password 
url="www.example.com/secure/"
# Utente
utente=""
# Password
password=""
curl --user "${utente}:${password}" "$url"
Consiglio

È possibile uti­liz­za­re cURL anche per scaricare dati da un server FTP. Anche in questo caso torna utile l’opzione --user per spe­ci­fi­ca­re il nome utente e la password.

Uti­liz­za­re un proxy con cURL

Un proxy è un server in­ter­me­dio. L’uso di un proxy può essere utile per vari motivi come, ad esempio, adempiere ad alcuni requisiti di sicurezza o di pre­sta­zio­ni.

Se vi con­net­te­te a Internet tramite un proxy, dovete co­mu­ni­car­lo a cURL con l’opzione “--proxy”:

# Usare proxy con cURL
url="www.google.com"
proxy="proxy.example.com"
porta="8080"
curl --proxy "${proxy}:${porta}" "$url"
N.B.

Se dovete spe­ci­fi­ca­re anche un nome utente e una password per il server proxy, ag­giun­ge­te l’opzione “--proxy-user”. In questo caso, immettete il nome utente e la password nel formato “utente:password”.

Vai al menu prin­ci­pa­le