Frage REST-APIs: Benutzerdefinierte HTTP-Header im Vergleich zu URL-Parametern


Wann verwenden Sie benutzerdefinierte HTTP-Header im Anforderungsteil einer REST-API?

Beispiel:

Würdest du jemals benutzen

GET /orders/view 
(custom HTTP header) CLIENT_ID: 23

Anstatt von

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23

76
2018-02-06 23:49


Ursprung


Antworten:


Die URL zeigt die Ressource selbst an. Ein "Client" ist eine Ressource, auf die reagiert werden kann, sollte also Teil der Basis-URL sein: /orders/view/client/23.

Parameter sind nur das, um den Zugriff auf die Ressource zu parametrisieren. Dies kommt besonders bei Posts und Suchanfragen ins Spiel: /orders/find?q=blahblah&sort=foo. Es gibt eine feine Grenze zwischen Parametern und Unterressourcen: /orders/view/client/23/active versus /orders/view/client/23?show=active. Ich empfehle die Sub-Ressource-Stil und Reserve-Parameter für die Suche.

Da jeder Endpunkt RE eine Statusübertragung anzeigt (um den Mnemonic zu mngeln), sollten benutzerdefinierte Header nur für Dinge verwendet werden, die nicht den Namen der Ressource (die URL), den Status der Ressource (den Rumpf) oder Parameter direkt betreffen Auswirkungen auf die Ressource (Parameter). Das hinterlässt echte Metadaten über die Anfrage nach benutzerdefinierten Headern.

HTTP hat eine sehr große Auswahl an Headern, die fast alles abdecken, was Sie benötigen. Wo ich gesehen habe, dass benutzerdefinierte Header auftauchen, befindet sich eine System-zu-System-Anforderung, die im Auftrag eines Benutzers ausgeführt wird. Das Proxy-System wird den Benutzer validieren und hinzufügen "X-User: useridKlicken Sie auf "OK" und geben Sie die Systemanmeldeinformationen ein, um den Endpunkt zu erreichen. Das empfangende System überprüft, ob die Systemanmeldeinformationen im Auftrag des Benutzers autorisiert sind. Überprüfen Sie anschließend, ob der Benutzer berechtigt ist, die Aktion auszuführen.


87
2018-02-07 00:12



Ich würde nur einen benutzerdefinierten Header verwenden, wenn es keine andere Möglichkeit gibt, Informationen nach Standard oder Konvention zu übergeben. Darren102 erklärt die typische Art, diesen Wert zu übergeben. Ihre API wird viel freundlicher sein, indem Sie typische Muster verwenden, die benutzerdefinierte Header verwenden. Das soll nicht heißen, dass Sie keinen Fall haben werden, sie zu verwenden, nur dass sie der letzte Ausweg sein sollten und etwas, das nicht bereits von der HTTP-Spezifikation gehandhabt wird.


5
2018-02-06 23:56



Benutzerdefinierte Header haben die folgenden Vorteile:

  • Kann leicht von Netzwerk-Tools / Skripten gelesen werden (Authentifizierung, Meta-Informationen, ...)
  • Hält URLs frei von Sicherheitsvorfällen (sicherer, nicht in Browser / Proxy-Caches)
  • Hält URLs sauberer: ermöglicht eine bessere Zwischenspeicherung von Ressourcen

4
2017-12-09 11:02



Ich würde keine benutzerdefinierten Header verwenden, da Sie nicht wissen, ob Proxys diese weiterleiten. URL-basiert ist der Weg zu gehen.

GET / orders / view / client / 23


3
2018-02-06 23:53



Wann verwenden Sie HTTP-Header im Anforderungsteil einer REST-API?

Authentifizierung: GUIDs, Standardauthentifizierung, benutzerdefinierte Token usw., z. Standard-Authentifizierung mit einem Guid-Token für REST API anstelle von Benutzername / Passwort 

Wenn Sie an der Weitergabe von Tokens oder anderen authentifizierungsähnlichen Informationen zwischen Domänen, die von PCI-DSS abgedeckt sind, oder anderen Sicherheitsregeln beteiligt sind, müssen Sie möglicherweise Parameter verdecken, da einige Bestimmungen explizit Authentifizierungselemente erfordern, um URLs zu vermeiden, die trivial wiedergegeben werden könnten Browserhistorien, Proxy-Logs usw.).


3
2018-06-23 19:26



Es gibt keinen Standard für REST, aber der akzeptierte Weg wäre

GET /orders/view/23

Da die benutzerdefinierten Header nicht verwendet werden und daher die 23 after-Ansicht davon ausgeht, dass es sich um die ID handelt, hätten Sie eine Funktion, die die ID aufnimmt und daher genau diese Information erzeugt.


2
2018-02-06 23:52



Definitiv in Ordnung:

GET /orders/view/client_id/23 or 
GET /orders/view/?client_id=23

Auch ok:

GET /orders/view/23 or 

Ich würde denken, das wäre auch in Ordnung:

POST /orders/view 
(custom HTTP header) CLIENT_ID: 23

1
2018-02-06 23:54



Sie können benutzerdefinierte Header verwenden, um mehr Informationen zu einer teilweise verarbeiteten Anforderung in diesem Zusammenhang aufzunehmen Umhüllen ist keine gute Übung. Die Header sind sichern.


0
2018-03-04 12:37