Parámetros de matriz URL vs. parámetros de solicitud
Me pregunto si debo usar parámetros de matriz o consulta en mis URLs. Encontré una discusión anterior sobre ese tema no satisfactoria.
Ejemplos
- URL con parámetros de consulta: http://some.¿dónde / cosa?paramA = 1 & ParaMB=6542
- URL con parámetros de matriz: http://some.donde / cosa;paramA=1; ParaMB=6542
A primera vista, los parámetros matriciales parecen tener solo ventajas:
- más legible
- sin codificación ni decodificación de " & " en documentos XML es necesario
- URLs con "?"no se almacenan en caché en muchos casos; las URL con parámetros de matriz se almacenan en caché
- los parámetros de la matriz pueden aparecer en todas partes en la ruta y no se limitan a su final
- los parámetros de la matriz pueden tener más de un valor:
paramA=val1,val2
Pero también hay desventajas:
- solo unos pocos frameworks como JAX-RS soportan parámetros de matriz
- Cuando un navegador envía un formulario a través de GET, los parámetros se convierten parámetros de consulta. Así que termina en dos tipos de parámetros para la misma tarea. Para no confundir a los usuarios de los servicios REST y limitar el esfuerzo para los desarrolladores de los servicios, sería más fácil utilizar siempre parámetros de consulta - en esta área.
Dado que el desarrollador del servicio puede elegir un framework con soporte matrix param, la única desventaja restante sería que los navegadores crean parámetros de consulta por defecto.
Hay otras desventajas? ¿Qué te gustaría hacer?
3 answers
La diferencia importante es que los parámetros de matriz se aplican a un elemento de ruta particular, mientras que los parámetros de consulta se aplican a la solicitud en su conjunto. Esto entra en juego cuando se hace una consulta compleja estilo REST a múltiples niveles de recursos y sub-recursos:
http://example.com/res/categories;name=foo/objects;name=green/?page=1
Realmente se trata de espacio de nombres. Si solo se utilizaran parámetros de consulta, terminaría con parámetros como" category_name " y "object_name" y perdería la claridad añadida por la localidad de los parámetros dentro de la solicitud. Además, cuando se utiliza un framework como JAX-RS, todos los parámetros de consulta se muestran dentro de cada controlador de recursos, lo que conduce a posibles conflictos y confusión.
Si su consulta tiene solo un "nivel", entonces la diferencia no es realmente importante y los dos tipos de parámetros son efectivamente intercambiables, sin embargo, los parámetros de consulta generalmente son mejor soportados y más ampliamente reconocidos. En general, le recomendaría que se adhiera a los parámetros de consulta para cosas como formularios HTML y api HTTP simples de un solo nivel.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-13 18:12:13
Too Demasiado importante para ser relegado a la sección de comentarios.--
No estoy seguro de cuál es el gran problema con las URL de matriz. Según el artículo de diseño del w3c que TBL escribió, era solo una idea de diseño y afirma explícitamente que no es una característica de la web. Cosas como las URL relativas no se implementan cuando se usan. Si quieres usarlo, está bien; simplemente no hay una forma estándar de usarlo porque no es un estándar. - Steve Pomeroy
Así que la respuesta corta es, si necesita RS para propósito comercial, es mejor usar el parámetro de solicitud.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-07 15:39:53
Además de Tim Sylvester asnwer Me gustaría proporcionar un ejemplo de cómo los parámetros de matriz se pueden manejar con JAX-RS .
-
Parámetros Matix en el último elemento de recurso
http://localhost:8080/res/categories/objects;name=green
Puede acceder a ellos utilizando el
@MatrixParam
anotación@GET @Path("categories/objects") public String objects(@MatrixParam("name") String objectName) { return objectName; }
Respuesta
green
Pero como los estados javadoc
Observe que el valor de anotación
@MatrixParam
se refiere al nombre de un parámetro de matriz que reside en el último segmento de ruta coincidente de la estructura Java con anotaciones de ruta que inyecta el valor del parámetro de matriz.... lo que nos lleva al punto 2
-
Parámetros de matriz en medio de una URL
http://localhost:8080/res/categories;name=foo/objects;name=green
Puede acceder a los parámetros de la matriz en cualquier lugar utilizando variables de ruta y
@PathParam
PathSegment
.@GET @Path("{categoryVar:categories}/objects") public String objectsByCatecory(@PathParam("categoryVar") PathSegment categorySegment, @MatrixParam("name") String objectName) { MultivaluedMap<String, String> matrixParameters = categorySegment.getMatrixParameters(); String categorySegmentPath = categorySegment.getPath(); String string = String.format("object %s, path:%s, matrixParams:%s%n", objectName, categorySegmentPath, matrixParameters); return string; }
Respuesta
object green, path:categories, matrixParams:[name=foo]
Dado que los parámetros de la matriz se proporcionan como un
MultivaluedMap
puede acceder a cada uno porList<String> names = matrixParameters.get("name");
O si solo necesita el primero
String name = matrixParameters.getFirst("name");
-
Obtenga todos los parámetros de la matriz como un parámetro de método
http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size
Use un
List<PathSegment>
para obtenerlos todos@GET @Path("all/{var:.+}") public String allSegments(@PathParam("var") List<PathSegment> pathSegments) { StringBuilder sb = new StringBuilder(); for (PathSegment pathSegment : pathSegments) { sb.append("path: "); sb.append(pathSegment.getPath()); sb.append(", matrix parameters "); sb.append(pathSegment.getMatrixParameters()); sb.append("<br/>"); } return sb.toString(); }
Respuesta
path: categories, matrix parameters [name=foo] path: objects, matrix parameters [name=green] path: attributes, matrix parameters [name=size]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-25 09:39:47