Was gehört in einen HTTP-Anforderungsheader gegenüber dem Anforderungshauptteil?

51

Ich arbeite an einer Reihe von Webdiensten für einen mobilen Client, und die Anforderungen verlangen, dass eine eindeutige Geräte-ID in allen Anforderungen enthalten ist, in bestimmten Anforderungen gespeichert und zum Filtern von Ergebnissen in anderen verwendet wird.

Es wurde vorgeschlagen, dass es in einen benutzerdefinierten HTTP-Header eingefügt wird, da es in allen Anforderungen enthalten ist. Daher begann ich mich zu fragen, anhand welcher Kriterien bestimmt werden kann, ob ein bestimmtes Datenelement in einen Header oder zusammen mit anderen Daten in gehört der Anfragetext.

Gibt es solche Kriterien?

Mike Partridge
quelle

Antworten:

51

Wenn die Informationen wichtig sind, sollten Sie sie in den Körper einfügen.

Warum?

  1. Proxy-Server dürfen Header ändern. Viele sind so konfiguriert, dass sie nicht bekannte Header entfernen. Dies gilt jedoch nur, wenn Sie unverschlüsseltes HTTP verwenden. Wenn Sie HTTPS verwenden, kann der Proxy die Header nicht ändern, da sie verschlüsselt sind.
  2. Wenn Sie einen Webservice verwenden, geschieht dies normalerweise aus Gründen der Interoperabilität mit anderen Geräten, Diensten und Tools. Die meisten APIs und Tools, die mit Webservices arbeiten, können Anforderungen leicht ändern, aber viele machen es schwierig oder sogar unmöglich, benutzerdefinierte Header hinzuzufügen. Dies gilt natürlich nur, wenn Interoperabilität ein Problem darstellt. Aber wenn es Ihnen egal ist, möchten Sie sich vielleicht fragen, warum Sie Webservices überhaupt verwenden, anstatt nur Ihr eigenes Protokoll auf Raw-TCP zu erstellen.
Philipp
quelle
GROSSE ANTWORT - zwei Überlegungen, die für mich sinnvoll sind, die mir aber noch nicht beigebracht wurden.
R Claven
1
IK das ist alt, aber ich bin dieser Community beigetreten, nur um diese Antwort zu unterstützen. Ein dickes Lob.
Kaliumion
22

Während die Zeile etwas verschwommen ist, lautet für mich die Faustregel: Daten, an denen Ihre Geschäftslogik arbeitet, sollten sich im Hauptteil befinden, Metadaten können / sollten in Überschriften abgelegt werden.

Eine andere Sichtweise ist: Daten, die nur in bestimmten Arten von Anfragen erscheinen, sollten sich im Hauptteil befinden, während Daten, die in der gesamten Anwendung einheitlich behandelt werden, in Kopfzeilen abgelegt werden sollten.

Ein weiterer Gesichtspunkt ist: Können Sie sich vorstellen, dass ein Datenelement global verarbeitet wird, z. B. von einem Router / einer Firewall anstatt von Ihrer Anwendung? Wenn ja, sollte es wahrscheinlich eher in die Header als in den Body gehen.

Einige Beispiele für die Anwendung dieser Regeln wären:

  • Sicherheitsanmeldeinformationen werden in Kopfzeilen abgelegt, da sie höchstwahrscheinlich an allen Stellen einer Anwendung gleich behandelt werden. Auf Implementierungsebene wird es wahrscheinlich einen Anforderungsfilter geben, der Anforderungen ohne gültige Anmeldeinformationen ablehnt, unabhängig davon, auf welchem ​​Endpunkt die Anforderung tatsächlich verarbeitet wird, falls sie den Filter passiert.
  • Wenn Sie andererseits einen Endpunkt haben, auf dem ein Administrator Benutzer zu Ihrem System hinzufügen kann, sollte sich das Login des zu erstellenden Benutzers im Anforderungshauptteil befinden, da: a) es von der Geschäftslogik Ihrer Anwendung verwaltet wird, b) es erscheint in diesem speziellen Endpunkt, aber nicht in anderen.
  • Optionen, die das Caching steuern, passen möglicherweise in Header (es sei denn, das Caching ist ein zentraler Bestandteil der Geschäftslogik Ihrer Anwendung).

Zurück zu Ihrer Frage zur eindeutigen Geräte-ID: Wenn sie überall einheitlich verwendet wird, z. B. nur für die Protokollierung, können Sie sie in die Kopfzeilen einfügen. Wenn es jedoch verwendet wird, um Anforderungen je nach Endpunkt auf unterschiedliche Weise zu filtern, ist es besser, es befindet sich im Hauptteil. Wenn Sie beide Anwendungsfälle haben, ist es wahrscheinlich besser, sich nur an eine einzige Art der Übergabe zu halten (wahrscheinlich an die Header), als den API-Benutzer zu zwingen, dieselben Daten an zwei Stellen abzulegen inkonsistente Eingaben oder Implementierung einer Validierung.

Michał Kosmulski
quelle
0

Den Inhalt der Kundenanfrage; die nicht über mehrere Anfragen an denselben Server hinweg geändert werden, sind Teil von HEADER, z. B. Anmeldeinformationen, andere, die häufig pro Anfrage geändert werden, sind Teil von BODY.

ODER

Die Eigenschaft des Nachrichten- / Textinhalts wird in die Kopfzeile übernommen. zB) Codierungstyp, Inhaltslänge, Inhaltstyp.

UND

In Ihrem Fall sollten Filterparameter als Abfrage- / Anforderungsparameter in die URL eingefügt werden.

/mobiles?type=MOTO&colour=black

In erholsamen Diensten verweist die URL selbst auf ein Objekt

/conferences/{conference_id} -> verweist auf eine bestimmte Konferenz

Kanagavelu Sugumar
quelle
Ist das ein Zitat? Wovon ? Warum schlagen Sie das vor? Bitte nehmen Sie einige Änderungen in Ihrer Antwort vor, um sie zu verbessern.
Machado