Ein URI soll eine Ressource identifizieren .
Ressource bezieht sich auf das tatsächlich abgerufene Objekt. Auf einer Website ist das normalerweise eine Seite . In einer REST-API ist dies normalerweise eine Entität - Person, Profil, Widget, Foto usw.
HTTP - Header der Server Dinge über die sagen Client - sie nicht selbst, etwas über die Ressource beschreiben oder irgendeine Hilfe bereitzustellen , in der diese Ressource zu lokalisieren.
Zum Beispiel:
Accept-Encoding
teilt dem Server mit, dass der Client bestimmte Inhalte konvertieren oder dekomprimieren kann.
Accept-Language
teilt dem Server mit, dass sich der Client in einem bestimmten Gebietsschema befindet, und bevorzugt Inhalte in diesem Gebietsschema.
Authorization
teilt dem Server mit, dass der Client glaubt, berechtigt zu sein, auf eine geschützte Ressource zuzugreifen.
Ein gemeinsames Thema bei den meisten dieser Anforderungsheader ist, dass der Server nicht verpflichtet ist , diese zu berücksichtigen. Ein Accept-Encoding
von gzip
garantiert nicht, dass die Antwort komprimiert wird. Ein Accept-Language
von ur-PK
wird wahrscheinlich ignoriert, wenn eine US-Site aufgerufen wird, es sei denn, sie unterstützen Urdu ausdrücklich. Der Server behält sich das Recht vor, den Authorization
Header zu überprüfen und trotzdem einen 401 oder 403 zurückzugeben, wenn ihm das, was er sieht, nicht gefällt.
Keiner dieser Header soll wesentlich ändern, welche Ressource der Server als Antwort bereitstellt. Der Accept
Header ist nicht anders. Wenn ein Client angibt application/xml
und der Server nur unterstützt application/json
, sendet der Server JSON zurück - nicht XML. Noch wichtiger ist, dass der Accept
Header mehrere Typen angeben kann . In diesem Fall kann der Server nach Belieben (oder keinem von ihnen) zurückgeben. Wie Sie sich vielleicht vorstellen können, kann dies leicht zu undefiniertem Verhalten für den Benutzer führen, aber lassen Sie uns dies für den Moment ignorieren.
Die Absicht eines Hyperlinks ist es , auf eine Seite zu verlinken - Seite ist eine bestimmte Art von Ressource. Oder Sie könnten in der lockeren Definition der einfachen Verknüpfung mit einer Ressource gerechtfertigt sein, selbst wenn diese Ressource etwas anderes als eine Seite (möglicherweise ein Bild oder ein Datensatz) ist. Was es jedoch definitiv nicht tun soll, ist die Verknüpfung mit einer bestimmten Darstellung einer Ressource. Das ist für den Client und den Server zu verhandeln und der Server letztendlich zu entscheiden.
Accept-Language
ist ein offensichtliches Beispiel dafür, warum es problematisch sein kann, Hyperlinks die Steuerung von Headern zu erlauben. Es macht nicht wirklich Sinn, wenn man darüber nachdenkt. Jeder Benutzer steuert seine eigene Sprachpräferenz. Es ist im Betriebssystem und / oder im Browser konfiguriert. Der Browser sollte immer den gleichen Accept-Language
Header senden , unabhängig davon, welche Seite besucht wird. Wenn der Server diese Sprache unterstützt, ist das großartig. Wenn nicht, antwortet es mit der Sprache, die es für am nächsten hält.
Wenn dies durch Hyperlinks geändert werden könnte, könnten eingehende Links Sie im Wesentlichen in die chinesischsprachige Version der Website zwingen, selbst wenn Ihr Browser und Ihr Betriebssystem nicht für die Unterstützung dieser Sprache konfiguriert sind. Das macht keinen Sinn. Wenn die Site Englisch unterstützt und Ihr Browser Englisch ist, sollte er auf Englisch antworten, unabhängig davon, was der Hyperlink sagt.
Wenn Ihr Browser weiß, wie XML als strukturierte Daten angezeigt wird, und nach XSLs suchen kann, um es hübsch aussehen zu lassen, aber nicht wirklich weiß, was mit JSON zu tun ist, außer es als einfachen Text auszugeben und sie dann zu zwingen JSON-Inhalte über einen Link (wenn so etwas möglich wäre) sind ein aggressiv benutzerfeindliches Verhalten. Der Browser sollte immer derjenige sein, der sagt: "Ich weiß, wie man X anzeigt, aber nicht Y, also würde ich es wirklich vorziehen, wenn Sie mir X geben würden."
Ich kann verstehen, warum Sie vielleicht denken, dass es logisch ist, dem Benutzer eines Browsers zu erlauben , diese Entscheidung außer Kraft zu setzen. Aber die Wahrheit ist, dass Sie an ein paar winzige Randfälle denken, wie das Herunterladen eines Berichts; In 99% der Fälle, in denen diese Auswahl besteht, ist der Benutzer nicht qualifiziert oder verfügt nicht über ausreichende Informationen, um sie zu treffen.
Stellen Sie sich vor, Ihre Eltern oder Großeltern werden eine Datei herunterladen und aufgefordert, Text / CSV oder Text / Klartext zu wählen. Kennen sie wahrscheinlich den Unterschied? Ich weiß nichts über deine, aber meine kann oft nicht einmal den Unterschied zwischen einem Werbebanner und einer Fehlermeldung erkennen, sodass sie diese Wahl auf keinen Fall intelligent treffen können. Auf der anderen Seite könnte es einen Hoffnungsschimmer geben, wenn sie separate Links zum Herunterladen einer "Excel-Arbeitsmappe" oder "Nur Text" erhalten - für sie handelt es sich tatsächlich um separate Ressourcen , nicht nur um eine unterschiedliche Darstellung derselben Ressource, und Die URIs sollten dies widerspiegeln.
Man kann sich nicht darauf verlassen, dass der Benutzer versteht, dass diese beiden Dinge tatsächlich dieselbe Ressource sind, aber unterschiedliche Darstellungen. Und ohne alles an der heutigen Funktionsweise des Webs zu ändern, können wir nichts davon annehmen, was sie mit diesem Hyperlink machen werden. Sie können klicken oder mit der rechten Maustaste klicken -> "Speichern unter" oder sie können sie kopieren und in ihre Adressleiste einfügen, oder sie verwenden möglicherweise einen Download-Manager oder sie verwenden weiterhin IE6 oder sie Möglicherweise verwenden Sie ein Tablet oder ein mobiles Gerät einer anderen Marke mit einem proprietären Browser. In vielen dieser Fälle erhalten sie nicht den gewünschten Inhalt, da sie entweder den Teil des deklarierten Hyperlinks verlieren Der Inhaltstyp oder der Browser unterstützen ihn nicht.
Könnte die HTML-Spezifikation vor 40 Jahren so konzipiert worden sein, dass sie ein Attribut vom Typ Inhalt in Hyperlinks unterstützt? Vielleicht gab es, wie ich in den ersten Absätzen beschrieben habe, starke Gründe dagegen, insbesondere in einer Zeit, in der Bandbreite und Serverressourcen knapp waren und die Idee bestand, denselben Bericht in mehreren Formaten (oder offen gesagt) herunterladen zu können , überhaupt einen Bericht herunterzuladen) war ehrlich gesagt niemandem in den Sinn gekommen. Aber in der heutigen Welt wäre es sicherlich verrückt, so etwas in die Spezifikation aufzunehmen. Dies würde die Abwärtskompatibilität vollständig beeinträchtigen und zu dem gefürchteten "undefinierten Verhalten" in jedem vorhandenen Browser führen.