12. Content Negotiation (Negoziazione del Contenuto)
La maggior parte delle risposte HTTP contiene un'entità che include informazioni destinate all'interpretazione da parte di un utente umano. Naturalmente, è desiderabile fornire all'utente la "migliore entità disponibile" corrispondente alla richiesta. Sfortunatamente, non tutti gli utenti hanno le stesse preferenze su ciò che è "migliore", e non tutti gli user agent sono ugualmente capaci di rendere tutti i tipi di entità. Per questo motivo, HTTP fornisce diversi meccanismi di "negoziazione del contenuto" (content negotiation) - il processo di selezione della migliore rappresentazione per una data risposta quando sono disponibili più rappresentazioni.
Nota: Questo non è chiamato "negoziazione di formato" (format negotiation), perché le rappresentazioni alternative possono essere dello stesso tipo di media, ma utilizzare diverse funzionalità di quel tipo, utilizzare lingue diverse, ecc.
Qualsiasi risposta contenente un corpo di entità può (MAY) essere soggetta a negoziazione, incluse le risposte di errore.
Possono esistere due tipi di negoziazione del contenuto in HTTP: negoziazione guidata dal server (server-driven negotiation) e negoziazione guidata dall'agente (agent-driven negotiation). Questi due tipi di negoziazione sono ortogonali e possono quindi essere utilizzati separatamente o in combinazione. Un approccio combinato, chiamato negoziazione trasparente (transparent negotiation), si verifica quando una cache fornisce una negoziazione guidata dal server a un user agent utilizzando le informazioni di negoziazione guidata dall'agente fornite dal server di origine.
12.1 Server-driven Negotiation (Negoziazione Guidata dal Server)
Se la scelta della migliore rappresentazione per una risposta è effettuata da un algoritmo situato sul server, si parla di negoziazione guidata dal server. La selezione si basa sulle rappresentazioni disponibili della risposta (le dimensioni in cui può variare; ad esempio, lingua, codifica del contenuto, ecc.) e sul contenuto di particolari campi di intestazione nel messaggio di richiesta o altre informazioni relative alla richiesta (come l'indirizzo di rete del client).
La negoziazione guidata dal server è vantaggiosa quando l'algoritmo di selezione tra le rappresentazioni disponibili è difficile da descrivere all'user agent, o quando il server desidera inviare la sua "migliore stima" al client con la prima risposta (sperando di evitare il ritardo di andata e ritorno delle richieste successive se la "migliore stima" è sufficientemente buona per l'utente). Per migliorare la stima del server, l'user agent può (MAY) includere campi di intestazione di richiesta che descrivono le sue preferenze per tali risposte (Accept, Accept-Language, Accept-Encoding, ecc.).
La negoziazione guidata dal server presenta svantaggi:
-
È impossibile per il server determinare con precisione cosa potrebbe essere "migliore" per un dato utente, poiché ciò richiederebbe una comprensione completa delle capacità dell'user agent e dell'uso previsto della richiesta particolare.
-
Far descrivere all'user agent le sue capacità in ogni richiesta è ingombrante (consumando larghezza di banda disponibile) e può portare a significativi rischi per la privacy (fingerprinting dell'utente).
-
Complica l'implementazione del server di origine e rende l'algoritmo difficile da verificare.
-
Può limitare le rappresentazioni pubblicamente disponibili quando l'algoritmo del server fa supposizioni sulle capacità degli user agent.
HTTP/1.1 include i seguenti campi di intestazione di richiesta per abilitare la negoziazione guidata dal server: Accept (sezione 14.1), Accept-Charset (sezione 14.2), Accept-Encoding (sezione 14.3), Accept-Language (sezione 14.4), e User-Agent (sezione 14.43). Tuttavia, un server di origine non è limitato a queste dimensioni e può (MAY) variare la risposta in base a qualsiasi aspetto della richiesta, inclusi campi di intestazione di richiesta non elencati o campi di intestazione di estensione non presenti nella richiesta.
Il campo di intestazione Vary può essere utilizzato per esprimere i parametri utilizzati nella selezione di una rappresentazione, il che può essere utile agli user agent per comprendere l'applicabilità della cache (vedere sezione 13.6) e ai server che generano il campo di intestazione Vary (vedere sezione 14.44).
12.2 Agent-driven Negotiation (Negoziazione Guidata dall'Agente)
Con la negoziazione guidata dall'agente, la selezione della migliore rappresentazione per una risposta viene eseguita dall'user agent dopo aver ricevuto una risposta iniziale. La selezione si basa su un elenco delle rappresentazioni disponibili (inclusi i loro URI e le loro caratteristiche distintive) e le preferenze dell'utente o dell'user agent.
La negoziazione guidata dall'agente è vantaggiosa quando la risposta varia in dimensioni in cui il server di origine non può determinare con precisione cosa è meglio per l'user agent esaminando la richiesta, o quando viene utilizzata una cache pubblica per ridurre il carico del server e l'utilizzo della rete configurando gli user agent.
La negoziazione guidata dall'agente presenta il seguente svantaggio: è necessaria una seconda richiesta per ottenere la migliore rappresentazione alternativa. Questa seconda richiesta aggiungerà latenza percettibile solo se la cache è in grado di fornire la risposta corretta (già memorizzata nella cache) o se l'elenco delle risorse è piccolo. Inoltre, questa specifica non fornisce uno standard per l'elenco, né per l'user agent per selezionare automaticamente la scelta migliore, questa specifica non definisce alcuno standard per tale selezione automatica.
HTTP/1.1 definisce i codici di stato 300 (Multiple Choices) e 406 (Not Acceptable) che i server devono utilizzare quando eseguono una negoziazione guidata dall'agente.
12.3 Transparent Negotiation (Negoziazione Trasparente)
La negoziazione trasparente è una combinazione di negoziazione guidata dall'agente e guidata dal server. Viene utilizzata quando una cache fornisce una negoziazione guidata dal server a un user agent utilizzando le informazioni di negoziazione del contenuto fornite dal server di origine.
Il vantaggio della negoziazione trasparente è che elimina un viaggio di andata e ritorno della richiesta quando il server di origine non è disponibile.
Lo svantaggio della negoziazione trasparente è che può portare alla selezione di una rappresentazione errata se le informazioni di negoziazione del contenuto sono incomplete o inaccurate.
HTTP/1.1 non definisce alcuna intestazione per la negoziazione trasparente.