Un vantaggio pratico di un'API REST è che il backend può restare scritto in un linguaggio e i client in un altro. Se il server è un eseguibile Free Pascal costruito con il framework Horse (ne abbiamo parlato nell'articolo precedente), un client PHP può interrogarlo con gli stessi strumenti che si userebbero per qualunque servizio web esterno: cURL e json_decode.
Un client HTTP minimale con cURL
Vale la pena isolare in un'unica funzione la logica di chiamata, in modo da riusarla per tutti gli endpoint: metodo, URL, eventuali dati da inviare come JSON e header di autenticazione se presente un token.
<?php
declare(strict_types=1);
function chiamaApi(string $endpoint, string $metodo = 'GET', ?array $dati = null, string $token = ''): array
{
$baseUrl = 'https://TUO-SERVER:9000'; // in produzione: dominio reale via HTTPS
$url = $baseUrl . $endpoint;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $metodo);
$headers = ['Content-Type: application/json'];
if ($token !== '') {
$headers[] = "Authorization: Bearer {$token}";
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
if ($dati !== null) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($dati));
}
$risposta = curl_exec($ch);
$codiceHttp = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['code' => $codiceHttp, 'body' => $risposta];
}Ottenere e riutilizzare il token
Il flusso tipico prevede una prima chiamata per ottenere un token, da conservare (in sessione, non in un cookie in chiaro) e da allegare a ogni richiesta successiva verso gli endpoint protetti.
$esito = chiamaApi('/gettoken?username=' . urlencode($utente) . '&password=' . urlencode($password), 'POST');
$risultato = json_decode($esito['body'], true);
if ($risultato['result'] ?? false) {
$_SESSION['token'] = $risultato['value'];
} else {
// Gestire il caso di credenziali non valide mostrando un messaggio inline all'utente
}
// Richiesta successiva, autenticata
$esito = chiamaApi('/persona/' . urlencode($nome), 'GET', null, $_SESSION['token'] ?? '');
$dati = json_decode($esito['body'], true);Il contratto tra client e server
Perché il client PHP funzioni senza sorprese, conviene che l'API Free Pascal mantenga una busta di risposta coerente su tutti gli endpoint — tipicamente {"result": bool, "message": string, "value": ...} — così il codice PHP può controllare sempre lo stesso campo prima di leggere il resto. Lato Pascal questo si ottiene centralizzando l'invio della risposta in un'unica funzione di utilità, come visto nell'articolo sul server Horse; lato PHP basta un controllo su $risultato['result'] prima di procedere.
Un'ultima nota di sicurezza: se il server Free Pascal e il client PHP girano su macchine diverse, il traffico va protetto con HTTPS anche in fase di test, ed è bene evitare di passare credenziali come parametri di query string (finiscono nei log del server); un body JSON in una richiesta POST è la scelta più corretta, come mostrato per l'endpoint di login.