Frage Benutzerdefinierte HTTP-Header: Namenskonventionen


Einige unserer Nutzer haben uns gebeten, Daten zu ihrem Konto in der HTTP-Header von Anfragen senden wir sie oder sogar Antworten, die sie von unserer API erhalten. Was ist die allgemeine Konvention zum Hinzufügen von benutzerdefinierten HTTP-Headern in Bezug auf Benennung, Format... etc.

Sie können auch jede kluge Verwendung dieser Dinge, über die Sie im Internet gestolpert sind, veröffentlichen. Wir versuchen dies zu implementieren, indem wir das Beste als Ziel verwenden :)


866
2017-08-24 21:59


Ursprung


Antworten:


Im Juni 2012 wurde die Ablehnung der Empfehlung, das Präfix "X-" zu verwenden, offiziell als RFC 6648. Im Folgenden sind die relevanten Stellen aufgeführt:

3. Empfehlungen für Ersteller neuer Parameter

...

  1. SOLLTE ihren Parameternamen nicht mit "X-" oder ähnlich vorangestellt werden      konstruiert.

4. Empfehlungen für Protokolldesigner

...

  1. SOLLTE Parameter mit einem "X-" Präfix oder ähnlichem NICHT verbieten      Konstruiert von der Registrierung.

  2. DARF NICHT festgelegt werden, dass ein Parameter mit einem "X-" Präfix oder      ähnliche Konstrukte müssen als nicht standardisiert verstanden werden.

  3. DARF NICHT festgelegt werden, dass ein Parameter ohne "X-" Präfix oder      ähnliche Konstrukte müssen als standardisiert verstanden werden.

Beachten Sie, dass "SOLLTE NICHT" ("entmutigt") nicht dasselbe ist wie "NICHT MUSS" ("verboten"), siehe auch RFC 2119 für eine andere Spezifikation für diese Keywords. Mit anderen Worten, Sie können "X-" vorangestellte Header verwenden, aber es wird nicht empfohlen und Sie können sie nicht als öffentlichen Standard dokumentieren.


Im Juni 2011, der erste IETF Entwurf wurde gepostet missbilligen die Empfehlung, das Präfix "X-" für Nicht-Standard-Header zu verwenden. Der Grund dafür ist, dass bei Nicht-Standard-Headern mit dem Präfix "X-" das Entfernen des Präfixes "X-" die Rückwärtskompatibilität auslöscht, wodurch Anwendungsprotokolle gezwungen werden, beide Namen zu unterstützen (z. B. x-gzip & gzip sind jetzt gleichwertig). Also, die Empfehlung ist, sie nur zu benennen vernünftig ohne das Präfix "X-".


Die Empfehlung ist  war um ihren Namen mit "X-" zu beginnen. Z.B. X-Forwarded-For, X-Requested-With. Dies wird auch in a.o. Abschnitt 5 von RFC 2047.


956
2017-08-24 22:02



Die Frage muss erneut gelesen werden. Die eigentliche Frage ähnelt nicht den Herstellerpräfixen in CSS-Eigenschaften, in denen die Zukunftssicherheit und das Nachdenken über Anbieterunterstützung und offizielle Standards angemessen sind. Die tatsächlich gestellte Frage ähnelt eher der Auswahl von Parameternamen für URL-Abfragen. Niemand sollte sich darum kümmern, was sie sind. Aber der Name-Abstand der benutzerdefinierten ist eine vollkommen gültige - und gemeinsame und richtige - zu tun.

Begründung:
Es geht um Konventionen zwischen Entwicklern für benutzerdefinierte, anwendungsspezifische Header - "Daten, die für ihr Konto relevant sind"- die nichts mit Lieferanten, Standardisierungsgremien oder Protokollen zu tun haben, die von Dritten implementiert werden sollen, außer dass der betreffende Entwickler lediglich Header-Namen vermeiden muss, die möglicherweise von Servern, Proxys oder Clients anderweitig verwendet werden Grund, die Beispiele "X-Gzip / Gzip" und "X-Forwarded-For / Forwarded-For" sind strittig. Die Frage betrifft Konventionen im Kontext einer privaten API, ähnlich den Namenskonventionen für URL-Abfrageparameter eine Frage der Präferenz und des Namensabstands, Bedenken bezüglich "X-ClientDataFoo", die von irgendeinem Proxy oder Anbieter ohne das "X" unterstützt werden, sind eindeutig fehl am Platz.

Das Präfix "X-" ist nicht besonders oder magisch, aber es macht deutlich, dass es sich um einen benutzerdefinierten Header handelt. In der Tat helfen RFC-6648 und andere, den Fall für die Verwendung eines "X-" -Präfixes zu unterstützen, da - als Anbieter von HTTP-Clients und -Servern das Präfix verwerfen - Ihre app-spezifische, private-API, persönliche Daten- Durch die geringe Anzahl der offiziell reservierten Header-Namen wird der Passiermechanismus noch besser gegen Namensraumkollisionen isoliert. Das heißt, meine persönliche Vorliebe und Empfehlung besteht darin, einen Schritt weiter zu gehen und z.B. "X-ACME-ClientDataFoo" (wenn Ihre Widget-Firma "ACME" ist).

IMHO ist die IETF-Spezifikation nicht spezifisch genug, um die Frage des OP zu beantworten, da sie nicht zwischen völlig verschiedenen Anwendungsfällen unterscheidet: (A) Anbieter, die neue global anwendbare Funktionen wie "Forwarded-For" auf der einen Seite und (B) einführen App-Entwickler übergeben anwendungsspezifische Zeichenfolgen an / von Client und Server. Die Spezifikation betrifft nur die erstere, (A). Die Frage ist, ob es Konventionen für (B) gibt. Es gibt. Sie umfassen die alphabetische Gruppierung der Parameter und deren Trennung von den vielen normenrelevanten Headern des Typs (A). Die Verwendung des "X-" oder "X-ACME-" Präfixes ist bequem und legitim für (B) und widerspricht nicht (A). Je mehr Anbieter aufhören, "X-" für (A) zu verwenden, desto klarer werden die (B).

Beispiel: 
Google (die in den verschiedenen Standardisierungsgremien ein gewisses Gewicht haben) sind - wie heute, 20141102 in dieser leichten Bearbeitung meiner Antwort - derzeit "X-Mod-Pagespeed", um die Version ihres Apache-Moduls anzuzeigen eine gegebene Antwort transformieren. Sagt jemand wirklich vor, dass Google "Mod-Pagespeed" ohne das "X-" verwenden und / oder die IETF bitten sollte, ihre Verwendung zu segnen?

Zusammenfassung: 
Wenn Sie in Ihrer App benutzerdefinierte HTTP-Header (als eine zuweilen geeignete Alternative zu Cookies) verwenden, um Daten an Ihren / von Ihrem Server zu übertragen, und diese Header explizit NICHT dazu bestimmt sind, außerhalb des Kontexts Ihrer Anwendung verwendet zu werden, Name-Abstand sie mit einem "X-" oder "X-FOO-" Präfix ist eine vernünftige und gemeinsame Konvention.


413
2017-10-28 16:39



Das Format für HTTP-Header ist in der HTTP-Spezifikation definiert. Ich werde über HTTP 1.1 sprechen, für das die Spezifikation lautet RFC 2616. In Abschnitt 4.2, 'Message Headers', ist die allgemeine Struktur eines Headers definiert:

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

Diese Definition beruht auf zwei Hauptsäulen, Token und TEXT. Beide sind in Abschnitt 2.2 "Grundregeln" definiert. Token ist:

   token          = 1*<any CHAR except CTLs or separators>

Der Reihe nach ruht auf CHAR, CTL und Separatoren:

   CHAR           = <any US-ASCII character (octets 0 - 127)>

   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

   separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

TEXT ist:

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

Wo LWS linearer Leerraum ist, dessen Definition ich nicht reproduzieren kann, und OCTET ist:

   OCTET          = <any 8-bit sequence of data>

Die Definition ist mit einem Hinweis versehen:

The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].

Also, zwei Schlussfolgerungen. Erstens ist klar, dass der Header Name muss aus einer Teilmenge von ASCII-Zeichen bestehen - alphanumerische Zeichen, einige Interpunktionszeichen, nicht viel anderes. Zweitens gibt es in der Definition eines Headers nichts Wertdas beschränkt es auf ASCII oder schließt 8-Bit-Zeichen aus: es besteht explizit aus Oktetten, wobei nur Steuerzeichen gesperrt sind (beachten Sie, dass CR und LF als Steuerelemente gelten). Des Weiteren impliziert der Kommentar zur TEXT-Produktion, dass die Oktetts als in ISO-8859-1 befindlich zu interpretieren sind, und dass es einen Codiermechanismus gibt (der übrigens schrecklich ist), um Zeichen außerhalb dieser Codierung darzustellen.

Um insbesondere auf @BalusC zu reagieren, ist es ziemlich klar, dass Header-Werte laut Spezifikation in ISO-8859-1 sind. Ich habe High-8859-1-Zeichen (speziell einige Akzentvokale, wie sie in Französisch verwendet werden) in einem Header von Tomcat gesendet und sie von Firefox korrekt interpretiert, so dass dies in gewisser Weise sowohl in der Praxis als auch in der Theorie funktioniert (Obwohl dies ein Location-Header war, der eine URL enthält und diese Zeichen in URLs nicht zulässig sind, war dies tatsächlich illegal, aber unter einer anderen Regel!).

Das heißt, ich würde mich nicht darauf verlassen, dass ISO-8859-1 auf allen Servern, Proxies und Clients funktioniert, also würde ich mich bei der defensiven Programmierung an ASCII halten.


56
2017-08-25 19:49



Die Registrierung des Header-Feldnamens ist in definiert RFC3864und mit "X-" ist nichts besonderes.

Soweit ich das beurteilen kann, gibt es keine Richtlinien für private Header; im Zweifelsfall vermeide sie. Oder werfen Sie einen Blick auf das HTTP Extension Framework (RFC 2774).

Es wäre interessant, mehr von dem Anwendungsfall zu verstehen; Warum können die Informationen nicht zum Nachrichtentext hinzugefügt werden?


15
2017-08-25 06:44



Modifizieren, oder genauer, hinzufügen Zusätzliche HTTP-Header ist ein großartiges Code-Debugging-Tool, wenn nichts anderes.

Wenn eine URL-Anfrage eine Weiterleitung oder ein Bild zurückgibt, gibt es keine HTML- "Seite", um die Ergebnisse des Debug-Codes temporär zu schreiben - zumindest nicht eine, die in einem Browser sichtbar ist.

Ein Ansatz besteht darin, die Daten in eine lokale Protokolldatei zu schreiben und diese Datei später anzuzeigen. Eine weitere Möglichkeit besteht darin, vorübergehend HTTP-Header hinzuzufügen, die die zu debuggenden Daten und Variablen widerspiegeln.

Ich füge regelmäßig zusätzliche HTTP-Header wie X-fubar-somelev: oder X-testing-someresult hinzu: um Dinge zu testen - und habe eine Menge Bugs gefunden, die sonst nur sehr schwer zu finden wären.


14
2017-07-04 09:29



RFC6648 empfiehlt, dass Sie davon ausgehen, dass Ihr benutzerdefinierter Header "standardisiert, öffentlich, häufig bereitgestellt oder in mehreren Implementierungen verwendbar ist". Daher empfiehlt es, nicht mit "X-" oder ähnlichen Konstrukten voranzukommen.

Es gibt jedoch eine Ausnahme "wenn es extrem unwahrscheinlich ist, dass [Ihr Header] jemals standardisiert wird." Für solche "implementation-specific und private-use" Header, der RFC sagt ein Namespace wie ein Anbieter-Präfix ist gerechtfertigt.


1
2017-07-24 13:50