Ich frage mich, ob ich Matrix- oder Abfrageparameter in meinen URLs verwenden soll. Ich fand eine ältere Diskussion zu diesem Thema nicht zufriedenstellend.
Beispiele
- URL mit Abfrageparametern: http: //some.where/thing? ParamA = 1 & paramB = 6542
- URL mit Matrixparametern: http: //some.where/thing; paramA = 1; paramB = 6542
Auf den ersten Blick scheinen Matrixparameter nur Vorteile zu haben:
- besser lesbar
- Es ist keine Codierung und Decodierung von "&" in XML-Dokumenten erforderlich
- URLs mit "?" werden in vielen Fällen nicht zwischengespeichert; URLs mit Matrixparametern werden zwischengespeichert
- Matrixparameter können überall im Pfad erscheinen und sind nicht auf sein Ende beschränkt
- Matrixparameter können mehr als einen Wert haben:
paramA=val1,val2
Es gibt aber auch Nachteile:
- Nur wenige Frameworks wie JAX-RS unterstützen Matrixparameter
- Wenn ein Browser ein Formular über GET sendet, werden die Parameter zu Abfrageparametern. Es gibt also zwei Arten von Parametern für dieselbe Aufgabe. Um die Benutzer der REST-Services nicht zu verwirren und den Aufwand für die Entwickler der Services zu begrenzen, ist es einfacher, immer Abfrageparameter zu verwenden - in diesem Bereich.
Da der Entwickler des Dienstes ein Framework mit Unterstützung für Matrixparameter auswählen kann, besteht der einzige verbleibende Nachteil darin, dass Browser standardmäßig Abfrageparameter erstellen.
Gibt es noch andere Nachteile? Was würden Sie tun?
Antworten:
Der wichtige Unterschied besteht darin, dass Matrixparameter für ein bestimmtes Pfadelement gelten, während Abfrageparameter für die gesamte Anforderung gelten. Dies kommt zum Tragen, wenn eine komplexe Abfrage im REST-Stil für mehrere Ebenen von Ressourcen und Unterressourcen durchgeführt wird:
Es kommt wirklich auf den Namespace an.
Hinweis: Die Ressourcenebenen hier sind
categories
undobjects
.Wenn nur Abfrageparameter für eine mehrstufige URL verwendet würden, würden Sie am Ende erhalten
Auf diese Weise verlieren Sie auch die Klarheit, die durch die Lokalität der Parameter in der Anforderung entsteht. Wenn Sie ein Framework wie JAX-RS verwenden, werden außerdem alle Abfrageparameter in jedem Ressourcenhandler angezeigt, was zu potenziellen Konflikten und Verwirrung führen kann.
Wenn Ihre Abfrage nur eine "Ebene" hat, ist der Unterschied nicht wirklich wichtig und die beiden Arten von Parametern sind effektiv austauschbar. Abfrageparameter werden jedoch im Allgemeinen besser unterstützt und allgemein anerkannt. Im Allgemeinen würde ich empfehlen, dass Sie sich an Abfrageparameter für Dinge wie HTML-Formulare und einfache einstufige HTTP-APIs halten.
quelle
/?
Teil eine Ressource dar??
startet den Abfrageparameterteil der Anfrage. Abfrageparameter sind im Gegensatz zu Matrixparametern die häufigste Art von URL-Parametern. Der Schrägstrich vor dem Fragezeichen stellt sicher, dass der Abfrageparameterpage
nicht auf den Matrixparameter vor dem Schrägstrich trifft. Ich nehme an, wenn keinecategories
http://example.com/res/categories?page=1
Neben der Antwort von Tim Sylvester möchte ich ein Beispiel geben, wie Matrixparameter mit JAX-RS behandelt werden können .
Matrixparameter am letzten Ressourcenelement
Sie können über die
@MatrixParam
Anmerkung darauf zugreifenAntwort
Aber wie die Javadoc-Staaten
... was uns zu Punkt 2 bringt
Matrixparameter in der Mitte einer URL
Sie können mit Pfadvariablen und überall auf Matrixparameter zugreifen
@PathParam
PathSegment
.Antwort
Da die Matrixparameter als bereitgestellt werden
MultivaluedMap
, können Sie jeweils auf zugreifenoder wenn Sie nur den ersten brauchen
Holen Sie sich alle Matrixparameter als einen Methodenparameter
Verwenden Sie a
List<PathSegment>
, um sie alle zu erhaltenAntwort
quelle
--Zu wichtig, um in den Kommentarbereich verbannt zu werden .--
Ich bin mir nicht sicher, was die große Sache mit Matrix-URLs ist. Laut dem von TBL verfassten w3c-Designartikel war es nur eine Designidee und besagt ausdrücklich, dass es sich nicht um eine Funktion des Webs handelt. Dinge wie relative URLs werden bei der Verwendung nicht implementiert. Wenn Sie es verwenden möchten, ist das in Ordnung; Es gibt einfach keine Standardmethode, weil es kein Standard ist. - Steve Pomeroy
Die kurze Antwort lautet also: Wenn Sie RS für geschäftliche Zwecke benötigen, ist es besser, den Anforderungsparameter zu verwenden.
quelle