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

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?

Author: Community, 2010-01-12

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.

 184
Author: Tim Sylvester,
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.

 10
Author: Ajeet Ganga,
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 .

  1. 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

  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 por

    List<String> names = matrixParameters.get("name");
    

    O si solo necesita el primero

    String name = matrixParameters.getFirst("name");
    
  3. 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]
    
 6
Author: René Link,
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