CURL.CBL¶
CURL.CBL - Manuale d'Uso¶
Introduzione¶
CURL.CBL è un modulo COBOL centralizzato per l'esecuzione di chiamate HTTP tramite il comando curl. Fornisce un'interfaccia standardizzata per effettuare richieste REST API, gestendo automaticamente:
* Costruzione del comando curl
* Gestione degli header HTTP (anche di grandi dimensioni)
* Invio di body in formato JSON o Form URL-encoded
* Parsing delle risposte ed estrazione di valori specifici
* Retry automatico in caso di errori di rete
* Logging e debug
Architettura¶
Flusso di Esecuzione¶
Programma Chiamante
│
▼
┌─────────────────┐
│ CURL.CBL │
│ │
│ 1. Validazione │
│ 2. Creazione │
│ file config │
│ 3. Creazione │
│ file body │
│ 4. Esecuzione │
│ curl │
│ 5. Parsing │
│ risposta │
│ 6. Cleanup │
└─────────────────┘
│
▼
Risposta al chiamante
File Temporanei¶
CURL.CBL crea i seguenti file temporanei nella cartella configurata:
| File | Descrizione |
|---|---|
curl-YYYYMMDD-HHMMSS-pXXXXXXXX-config.txt |
File di configurazione curl (header) |
curl-YYYYMMDD-HHMMSS-pXXXXXXXX-body.json |
Body della richiesta |
curl-YYYYMMDD-HHMMSS-pXXXXXXXX-h.txt |
Header della risposta HTTP |
curl-YYYYMMDD-HHMMSS-pXXXXXXXX-rsp.txt |
Body della risposta |
curl-YYYYMMDD-HHMMSS-pXXXXXXXX-command.txt |
Comando eseguito (solo in debug) |
I file vengono automaticamente eliminati in caso di successo (a meno che non sia attivo il debug).
Copybook di Riferimento¶
utilcurl.cpy¶
Il copybook principale contiene due strutture:
1. util-curl - Parametri Principali¶
01 util-curl.
02 curl-operazione pic x(20).
02 curl-folder pic x(30).
02 curl-command pic x(512).
02 curl-post-params pic x(512).
02 curl-fl-add-server pic x(01).
02 curl-fl-save-log pic x(01).
02 curl-tag-esito pic x(30).
02 curl-esito-negativo pic x(256).
02 curl-file-esito pic x(256).
02 curl-header pic x(16000) occurs 5 times.
02 curl-o-esito pic x(01).
02 curl-o-msg pic x(256).
2. util-curl-body-params - Parametri Body e Risposta¶
01 util-curl-body-params.
02 curl-body-format pic x(01).
02 curl-body-use-raw pic x(01).
02 curl-body-raw pic x(64000).
02 curl-body-n-params pic 9(02).
02 curl-body-params.
03 curl-body-param occurs 50 times.
04 curl-body-p-nome pic x(50).
04 curl-body-p-valore pic x(500).
04 curl-body-p-tipo pic x(01).
02 curl-resp-n-params pic 9(02).
02 curl-resp-params.
03 curl-resp-param occurs 20 times.
04 curl-resp-p-tag pic x(50).
04 curl-resp-p-valore pic x(32000).
Parametri di Input¶
Parametri Obbligatori¶
| Campo | Descrizione |
|---|---|
curl-command |
URL da chiamare (o path relativo se curl-fl-add-server = "S") |
Parametri Opzionali¶
| Campo | Valori | Default | Descrizione |
|---|---|---|---|
curl-operazione |
ESEGUI-CURL |
ESEGUI-CURL |
Operazione da eseguire |
curl-folder |
stringa | generic |
Sottocartella per i file temporanei |
curl-fl-add-server |
S/N |
N |
Se S, antepone SERVER-WEB all'URL |
curl-fl-save-log |
S/N |
N |
Se S, mantiene i file di log anche in caso di successo |
curl-post-params |
stringa | - | Parametri POST inline (retrocompatibilità) |
curl-tag-esito |
stringa | - | Tag JSON da cercare per determinare l'esito |
curl-esito-negativo |
stringa | - | Valore del tag che indica errore |
Header HTTP¶
Gli header vengono passati tramite l'array curl-header (5 elementi da 16000 caratteri ciascuno).
move "Authorization: Bearer eyJhbGc..." to curl-header (1)
move "Content-Type: application/json" to curl-header (2)
Nota: Gli header vengono scritti su un file di configurazione per superare il limite di 1024 caratteri della command line.
Body della Richiesta¶
Modalità 1: Tabella Parametri (per body piccoli)¶
move "J" to curl-body-format
move 3 to curl-body-n-params
move "username" to curl-body-p-nome (1)
move "mario.rossi" to curl-body-p-valore (1)
move "S" to curl-body-p-tipo (1)
move "age" to curl-body-p-nome (2)
move "30" to curl-body-p-valore (2)
move "N" to curl-body-p-tipo (2)
move "active" to curl-body-p-nome (3)
move "true" to curl-body-p-valore (3)
move "B" to curl-body-p-tipo (3)
Modalità 2: Body Raw (per body grandi, es. file base64)¶
move "S" to curl-body-use-raw
move '{"fileName":"test.csv","base64":"SGVsbG8gV29ybGQ=..."}'
to curl-body-raw
Formato Body (curl-body-format)¶
| Valore | Descrizione | Content-Type |
|---|---|---|
J |
JSON | application/json |
F |
Form URL-encoded | application/x-www-form-urlencoded |
Tipi Parametro (curl-body-p-tipo)¶
| Valore | Descrizione | Esempio Output JSON |
|---|---|---|
S o spazio |
Stringa | "nome": "valore" |
N |
Numerico | "età": 30 |
B |
Boolean | "attivo": true |
L |
Null | "campo": null |
R |
Raw (già formattato) | Viene inserito così com'è |
Parametri Risposta¶
Per estrarre valori specifici dalla risposta JSON:
move 3 to curl-resp-n-params
move "access_token" to curl-resp-p-tag (1)
move "error" to curl-resp-p-tag (2)
move "error_description" to curl-resp-p-tag (3)
Dopo la chiamata, i valori saranno disponibili in curl-resp-p-valore (n).
Parametri di Output¶
| Campo | Descrizione |
|---|---|
curl-o-esito |
S = successo, N = errore |
curl-o-msg |
Messaggio descrittivo (in caso di errore) |
curl-file-esito |
Path del file contenente la risposta completa |
curl-resp-p-valore (n) |
Valori estratti dalla risposta JSON |
Modalità di Utilizzo¶
Chiamata Base¶
WORKING-STORAGE SECTION.
copy "utilcurl.cpy".
PROCEDURE DIVISION.
initialize util-curl util-curl-body-params
move "https://api.example.com/endpoint" to curl-command
call "CURL" using stringhe
util-curl
util-curl-body-params
if curl-o-esito = "S"
display "Chiamata riuscita"
else
display "Errore: " curl-o-msg
end-if
Chiamata POST con JSON¶
initialize util-curl util-curl-body-params
move "https://api.example.com/users" to curl-command
move "J" to curl-body-format
move 2 to curl-body-n-params
move "name" to curl-body-p-nome (1)
move "Mario Rossi" to curl-body-p-valore (1)
move "S" to curl-body-p-tipo (1)
move "email" to curl-body-p-nome (2)
move "[email protected]" to curl-body-p-valore (2)
move "S" to curl-body-p-tipo (2)
call "CURL" using stringhe
util-curl
util-curl-body-params
Chiamata con Autenticazione Bearer¶
initialize util-curl util-curl-body-params
move "https://api.example.com/protected" to curl-command
string "Authorization: Bearer " w-token
delimited " " into curl-header (1)
call "CURL" using stringhe
util-curl
util-curl-body-params
Chiamata OAuth2 (Form URL-encoded)¶
initialize util-curl util-curl-body-params
move "https://auth.example.com/token" to curl-command
move "F" to curl-body-format
move 3 to curl-body-n-params
move "client_id" to curl-body-p-nome (1)
move "my-client-id" to curl-body-p-valore (1)
move "client_secret" to curl-body-p-nome (2)
move "my-secret" to curl-body-p-valore (2)
move "grant_type" to curl-body-p-nome (3)
move "client_credentials" to curl-body-p-valore (3)
* Estrai il token dalla risposta
move 1 to curl-resp-n-params
move "access_token" to curl-resp-p-tag (1)
call "CURL" using stringhe
util-curl
util-curl-body-params
if curl-o-esito = "S"
move curl-resp-p-valore (1) to w-token
end-if
Upload File Base64 (Body Raw)¶
initialize util-curl util-curl-body-params
move "https://api.example.com/upload" to curl-command
string "Authorization: Bearer " w-token
delimited " " into curl-header (1)
move "Content-Type: application/json"
to curl-header (2)
* Usa modalità RAW per body grandi
move "S" to curl-body-use-raw
string '{"fileName":"' w-filename '",'
'"base64":"' w-base64-content '"}'
delimited " " into curl-body-raw
call "CURL" using stringhe
util-curl
util-curl-body-params
Esempi Pratici¶
Esempio Completo: Autenticazione + Upload¶
Vedi FORS24.CBL per un esempio completo che:
1. Effettua una chiamata OAuth2 per ottenere un token
2. Usa il token per effettuare un upload di file
3. Gestisce gli errori in modo appropriato
Gestione Errori¶
Codici di Errore CURL¶
| Exit Code | Descrizione |
|---|---|
| 1 | Protocollo non supportato |
| 3 | URL malformato |
| 5 | Impossibile risolvere proxy |
| 6 | Impossibile risolvere host |
| 7 | Impossibile connettersi al server |
| 22 | HTTP status >= 400 |
| 28 | Timeout operazione |
| 35 | Errore SSL/TLS handshake |
| 51 | Certificato SSL non valido |
| 52 | Server non ha risposto |
| 56 | Errore ricezione dati |
| 60 | Certificato SSL non verificabile |
Codici HTTP¶
| Status | Descrizione |
|---|---|
| 200 | OK |
| 201 | Risorsa creata |
| 400 | Richiesta non valida |
| 401 | Non autorizzato |
| 403 | Accesso negato |
| 404 | Risorsa non trovata |
| 429 | Troppe richieste (rate limit) |
| 500 | Errore interno del server |
| 502 | Bad Gateway |
| 503 | Servizio non disponibile |
| 504 | Gateway timeout |
Retry Automatico¶
CURL.CBL effettua automaticamente fino a 3 tentativi (configurabile) con un ritardo di 5 secondi tra un tentativo e l'altro. I seguenti errori non vengono ritentati: * Exit code 3 (URL malformato) * Exit code 5 (proxy non risolvibile) * Exit code 6 (host non risolvibile)
Note Tecniche e Limiti¶
Limiti Dimensionali¶
| Campo | Dimensione Max |
|---|---|
curl-command (URL) |
512 caratteri |
curl-header (singolo) |
16.000 caratteri |
curl-body-p-valore (singolo) |
500 caratteri |
curl-body-raw |
64.000 caratteri |
curl-resp-p-valore (singolo) |
32.000 caratteri |
| Numero header | 5 |
| Numero parametri body | 50 |
| Numero parametri risposta | 20 |
Limite Command Line¶
Il comando curl viene eseguito tramite C$SYSTEM che ha un limite di 1024 caratteri. Per superare questo limite:
* Gli header vengono scritti su file e passati con l'opzione -K
* Il body viene scritto su file e passato con l'opzione --data-binary "@file"
Configurazione¶
CURL.CBL legge la configurazione SERVER-WEB da AREAAPP se curl-fl-add-server = "S".
I file temporanei vengono creati in: {ext-root-dir}/curl/{curl-folder}/
Debug¶
Per mantenere i file di log anche in caso di successo:
move "S" to curl-fl-save-log
Oppure attivare il debug globale tramite la configurazione standard (gesdebug).
Troubleshooting¶
Problema: "Invalid serialized unsecured/JWS/JWE object"¶
Causa: Il token JWT viene troncato.
Soluzione: Verificare che:
* curl-header sia sufficientemente grande (almeno 2048 per token standard)
* Il token venga passato con la lunghezza corretta usando una sottostringa
Problema: Timeout frequenti¶
Causa: Server lento o rete instabile. Soluzione: I timeout sono configurati a: * Connect timeout: 30 secondi * Max time: 60 secondi
Problema: Errore SSL/Certificato¶
Causa: Certificato non valido o non verificabile.
Soluzione: Verificare la configurazione SSL del server. Se necessario per test, si può aggiungere l'opzione --insecure (sconsigliato in produzione).
Problema: Body JSON malformato¶
Causa: Caratteri speciali non escapati nel body.
Soluzione: Usare la modalità RAW (curl-body-use-raw = "S") e costruire manualmente il JSON, assicurandosi di escapare correttamente i caratteri speciali.
Problema: Risposta vuota¶
Causa: Il server non ha restituito un body.
Soluzione: Verificare il file di risposta in curl-file-esito e gli header HTTP nel file -h.txt.
Changelog¶
| Versione | Data | Modifiche |
|---|---|---|
| 1.0 | 22/12/2024 | Versione iniziale |
Autore¶
Andrea Parmeggiani - Eurosystem2000
Estratto da documentazione interna ClickUp