In questo tutorial vedremo come effettuare richieste verso le API di The Movie Database con PHP.
Dopo aver ottenuto la nostra chiave API, la salviamo in un file .env
con il seguente contenuto:
API_KEY=chiave_api
A scopo puramente didattico, possiamo implementare una nostra classe che legga il contenuto di questo file e restituisca un array associativo con le coppie chiave/valore.
class Env {
private $filePath;
public function __construct($filePath = './.env') {
$this->filePath = $filePath;
}
public function parse() {
if(!file_exists($this->filePath) || !is_readable($this->filePath)) {
return [];
}
$file_data = file_get_contents($this->filePath);
$lines = preg_split('/\n/', $file_data);
$data = [];
if(count($lines) === 0) {
$lines = [trim($file_data)];
}
foreach($lines as $line) {
if(strstr($line, '=') === false) {
continue;
}
$parts = explode('=', $line);
list($key, $value) = $parts;
$data[$key] = $value;
}
return $data;
}
}
Leggiamo il contenuto del file come stringa e otteniamo un array di righe separando il testo con una semplice espressione regolare. Quindi effettuiamo un loop su tale array e per ogni riga verifichiamo la presenza del token separatore =
. Se tale carattere è presente, lo usiamo per separare la riga come coppia chiave/valore andando a popolare l'array associativo restituito dal metodo pubblico parse()
.
Ora dobbiamo creare un'altra classe helper che andrà ad effettuare la richiesta HTTP GET alle API remote.
class Request {
private $url;
private $params;
public function __construct($url = '', $params = null) {
$this->url = $url;
$this->params = $params;
}
public function get() {
return $this->sendRequest();
}
private function sendRequest() {
if(!filter_var($this->url, FILTER_VALIDATE_URL)) {
return null;
}
$ch = curl_init();
$api_url = $this->url;
if(is_array($this->params) && count($this->params) > 0) {
$data = http_build_query($this->params);
$api_url .= '?' . $data;
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$response = curl_exec($ch);
if(curl_error($ch)) {
return null;
}
curl_close($ch);
return json_decode($response, true);
}
}
Usiamo l'estensione cURL aggiungendo all'URL di base l'eventuale query string se vengono passati dei parametri aggiuntivi tramite l'array associativo $params
serializzato con la funzione core http_build_query()
. Ignoriamo eventuali errori SSL usando l'opzione CURLOPT_SSL_VERIFYPEER
(opzione da rimuovere in produzione per motivi di sicurezza) e se la richiesta ha successo restituiamo un array associativo leggendo l'output JSON restituito dalle API remote.
Vogliamo effettuare la ricerca di film tramite API, quindi definiamo una prima funzione che effettua la richiesta HTTP GET corrispondente.
require_once 'lib/Request.php';
require_once 'lib/Env.php';
function get_tmdb_api_data($search_term = '') {
$api_url = 'https://api.themoviedb.org/3/search/movie';
$env = new Env('./.env');
$env_data = $env->parse();
$params = ['api_key' => $env_data['API_KEY'], 'query' => $search_term];
$request = new Request($api_url, $params);
return $request->get();
}
Filtriamo i dati ottenuti creando una funzione che seleziona solo alcune informazioni relative ai film eventualmente trovati.
function search_tmdb_api_data($term = '') {
$results = get_tmdb_api_data($term);
$movies = [];
if(is_null($results) || !is_array($results['results']) || count($results['results']) === 0) {
return $movies;
}
$data = $results['results'];
foreach($data as $datum) {
$movies[] = [
'title' => $datum['title'],
'plot' => $datum['overview'],
'date' => $datum['release_date']
];
}
return $movies;
}
Vogliamo ottenere una stringa con il titolo, l'anno di uscita e la trama di ciascun film separati da interruzioni di riga. Definiamo quindi una funzione per la formattazione dei risultati.
function format_tmdb_api_results($results) {
if(!is_array($results) || count($results) === 0) {
return '';
}
$output = '';
foreach($results as $result) {
$year = '';
if($result['date']) {
$parts = explode('-', $result['date']);
$year = $parts[0];
}
$output .= sprintf("%s\n%s\n%s\n\n", $result['title'], $year, $result['plot']);
}
return $output;
}
Le date sono nel formato YYYY-mm-dd
quindi per ottenere l'anno dobbiamo trasformare la stringa corrispondente in un array ed estrarre il primo elemento.
Possiamo usare il nostro codice come segue:
$term = 'matrix';
$results = search_tmdb_api_data($term);
echo format_tmdb_api_results($results);
exit;