Zum Hauptinhalt springen

12. Content Negotiation (Inhaltsverhandlung)

Die meisten HTTP-Antworten enthalten eine Entität, die Informationen zur Interpretation durch einen menschlichen Benutzer enthält. Natürlich ist es wünschenswert, dem Benutzer die "beste verfügbare" Entität bereitzustellen, die der Anfrage entspricht. Leider haben nicht alle Benutzer die gleichen Präferenzen darüber, was "am besten" ist, und nicht alle Benutzeragenten sind gleichermaßen in der Lage, alle Entitätstypen zu rendern. Aus diesem Grund bietet HTTP mehrere "Inhaltsverhandlungs"-Mechanismen (content negotiation) - den Prozess der Auswahl der besten Darstellung für eine gegebene Antwort, wenn mehrere Darstellungen verfügbar sind.

Hinweis: Dies wird nicht "Formatverhandlung" (format negotiation) genannt, da alternative Darstellungen denselben Medientyp haben können, aber unterschiedliche Funktionen dieses Typs verwenden, verschiedene Sprachen verwenden usw.

Jede Antwort, die einen Entitätskörper enthält, kann (MAY) Gegenstand einer Verhandlung sein, einschließlich Fehlerantworten.

In HTTP können zwei Arten der Inhaltsverhandlung existieren: servergesteuerte Verhandlung (server-driven negotiation) und agentengesteuerte Verhandlung (agent-driven negotiation). Diese beiden Verhandlungsarten sind orthogonal und können daher separat oder in Kombination verwendet werden. Ein kombinierter Ansatz, genannt transparente Verhandlung (transparent negotiation), tritt auf, wenn ein Cache die vom Ursprungsserver bereitgestellten agentengesteuerten Verhandlungsinformationen verwendet, um servergesteuerte Verhandlungen für nachfolgende Anfragen bereitzustellen.

12.1 Server-driven Negotiation (Servergesteuerte Verhandlung)

Wenn die Auswahl der besten Darstellung für eine Antwort durch einen auf dem Server befindlichen Algorithmus getroffen wird, spricht man von servergesteuerter Verhandlung. Die Auswahl basiert auf den verfügbaren Darstellungen der Antwort (den Dimensionen, in denen sie variieren kann; z.B. Sprache, Inhaltscodierung usw.) und dem Inhalt bestimmter Headerfelder in der Anfragenachricht oder anderen Informationen bezüglich der Anfrage (wie z.B. die Netzwerkadresse des Clients).

Servergesteuerte Verhandlung ist vorteilhaft, wenn der Algorithmus zur Auswahl unter den verfügbaren Darstellungen schwer dem Benutzeragenten zu beschreiben ist, oder wenn der Server seine "beste Schätzung" mit der ersten Antwort an den Client senden möchte (in der Hoffnung, die Hin- und Rücklaufverzögerung nachfolgender Anfragen zu vermeiden, wenn die "beste Schätzung" für den Benutzer gut genug ist). Um die Schätzung des Servers zu verbessern, kann (MAY) der Benutzeragent Anfrage-Headerfelder einfügen, die seine Präferenzen für solche Antworten beschreiben (Accept, Accept-Language, Accept-Encoding usw.).

Servergesteuerte Verhandlung hat Nachteile:

  1. Es ist für den Server unmöglich, genau zu bestimmen, was für einen bestimmten Benutzer "am besten" sein könnte, da dies ein vollständiges Verständnis der Fähigkeiten des Benutzeragenten und der beabsichtigten Verwendung der spezifischen Anfrage erfordern würde.

  2. Dem Benutzeragenten zu ermöglichen, seine Fähigkeiten in jeder Anfrage zu beschreiben, ist umständlich (verbraucht verfügbare Bandbreite) und kann zu erheblichen Datenschutzrisiken führen (Benutzer-Fingerprinting).

  3. Es macht die Implementierung des Ursprungsservers komplex und den Algorithmus schwer zu verifizieren.

  4. Es kann öffentlich verfügbare Darstellungen einschränken, wenn der Serveralgorithmus Annahmen über die Fähigkeiten der Benutzeragenten trifft.

HTTP/1.1 enthält die folgenden Anfrage-Headerfelder zur Aktivierung servergesteuerter Verhandlung: Accept (Abschnitt 14.1), Accept-Charset (Abschnitt 14.2), Accept-Encoding (Abschnitt 14.3), Accept-Language (Abschnitt 14.4) und User-Agent (Abschnitt 14.43). Ein Ursprungsserver ist jedoch nicht auf diese Dimensionen beschränkt und kann (MAY) die Antwort basierend auf jedem Aspekt der Anfrage variieren, einschließlich nicht aufgelisteter Anfrage-Headerfelder oder Erweiterungs-Headerfelder, die in der Anfrage nicht vorhanden sind.

Das Vary-Headerfeld kann verwendet werden, um die bei der Auswahl einer Darstellung verwendeten Parameter auszudrücken, was für Benutzeragenten beim Verständnis der Anwendbarkeit des Caches nützlich sein kann (siehe Abschnitt 13.6) und für Server, die das Vary-Headerfeld generieren (siehe Abschnitt 14.44).

12.2 Agent-driven Negotiation (Agentengesteuerte Verhandlung)

Bei agentengesteuerter Verhandlung wird die Auswahl der besten Darstellung für eine Antwort vom Benutzeragenten nach Empfang einer anfänglichen Antwort durchgeführt. Die Auswahl basiert auf einer Liste der verfügbaren Darstellungen (einschließlich ihrer URIs und ihrer unterscheidenden Merkmale) und den Präferenzen des Benutzers oder Benutzeragenten.

Agentengesteuerte Verhandlung ist vorteilhaft, wenn die Antwort in Dimensionen variiert, in denen der Ursprungsserver durch Untersuchung der Anfrage nicht genau bestimmen kann, was für den Benutzeragenten am besten ist, oder wenn ein öffentlicher Cache verwendet wird, um die Serverlast und Netzwerknutzung durch Konfiguration der Benutzeragenten zu reduzieren.

Agentengesteuerte Verhandlung hat den folgenden Nachteil: Eine zweite Anfrage ist erforderlich, um die beste alternative Darstellung zu erhalten. Diese zweite Anfrage fügt nur dann wahrnehmbare Latenz hinzu, wenn der Cache in der Lage ist, die richtige Antwort bereitzustellen (bereits zwischengespeichert), oder wenn die Liste der Ressourcen klein ist. Darüber hinaus bietet diese Spezifikation keinen Standard für die Liste, noch für den Benutzeragenten zur automatischen Auswahl der besten Wahl, diese Spezifikation definiert keinen Standard für eine solche automatische Auswahl.

HTTP/1.1 definiert die Statuscodes 300 (Multiple Choices) und 406 (Not Acceptable) zur Verwendung durch Server bei der Durchführung agentengesteuerter Verhandlung.

12.3 Transparent Negotiation (Transparente Verhandlung)

Transparente Verhandlung ist eine Kombination aus agentengesteuerter und servergesteuerter Verhandlung. Sie wird verwendet, wenn ein Cache servergesteuerte Verhandlung für einen Benutzeragenten unter Verwendung der vom Ursprungsserver bereitgestellten Inhaltsverhandlungsinformationen bereitstellt.

Der Vorteil der transparenten Verhandlung besteht darin, dass sie eine Anfrage-Hin- und Rückfahrt eliminiert, wenn der Ursprungsserver nicht verfügbar ist.

Der Nachteil der transparenten Verhandlung besteht darin, dass sie zur Auswahl einer falschen Darstellung führen kann, wenn die Inhaltsverhandlungsinformationen unvollständig oder ungenau sind.

HTTP/1.1 definiert keine Header für transparente Verhandlung.