Parametri della matrice URL rispetto ai parametri della richiesta

Mi chiedo se utilizzare Matrix o parametri di query nei miei URL. Ho trovato una discussione più vecchia su quell’argomento non soddisfacente.

Esempi

  • URL con parametri di query: http: //some.where/thing? ParamA = 1 & paramB = 6542
  • URL con parametri di matrice: http: //some.where/thing; paramA = 1; paramB = 6542

A prima vista i parametri della matrice sembrano avere solo vantaggi:

  • più leggibile
  • non è richiesta la codifica e la decodifica di “&” nei documenti XML
  • URL con “?” non vengono memorizzati nella cache in molti casi; Gli URL con parametri mat sono memorizzati nella cache
  • i parametri della matrice possono apparire ovunque nel percorso e non sono limitati alla sua fine
  • i parametri matrix possono avere più di un valore: paramA=val1,val2

Ma ci sono anche degli svantaggi:

  • solo alcuni framework come i parametri della matrice di supporto JAX-RS
  • Quando un browser invia un modulo tramite GET, i parametri diventano parametri di query. Quindi finisce in due tipi di parametri per lo stesso compito. Per non confondere gli utenti dei servizi REST e limitare lo sforzo per gli sviluppatori dei servizi, sarebbe più facile usare sempre i parametri di query – in quest’area.

Poiché lo sviluppatore del servizio può scegliere un framework con supporto per parametri matrix, l’unico svantaggio rimanente sarebbe che i browser creasse per parametri di query predefiniti.

    Ci sono altri svantaggi? Cosa faresti?

    La differenza importante è che i parametri della matrice si applicano a un particolare elemento del percorso mentre i parametri della query si applicano alla richiesta nel suo complesso. Ciò entra in gioco quando si effettua una query complessa in stile REST a più livelli di risorse e risorse secondarie:

     http://example.com/res/categories;name=foo/objects;name=green/?page=1 

    Si riduce davvero al namespace. Se fossero utilizzati solo parametri di query, si otterrebbero parametri come “nome_categoria” e “nome_object” e si perderebbe la chiarezza aggiunta dalla località dei parametri all’interno della richiesta. Inoltre, quando si utilizza un framework come JAX-RS, tutti i parametri della query comparirebbero all’interno di ciascun gestore di risorse, causando potenziali conflitti e confusione.

    Se la query ha solo un “livello”, la differenza non è davvero importante e i due tipi di parametri sono effettivamente intercambiabili, tuttavia i parametri di query sono generalmente supportati e riconosciuti più ampiamente. In generale, raccomanderei di attenersi ai parametri di query per cose come i moduli HTML e le semplici API HTTP a livello singolo.

    –Tra importante essere relegati nella sezione commenti .–

    Non sono sicuro di quale sia il grosso problema con gli URL di matrice. Secondo l’articolo di design di W3c che TBL ha scritto, era solo un’idea di design e afferma esplicitamente che non è una funzionalità del web. Cose come URL relativi non sono implementati quando lo si utilizza. Se vuoi usarlo, va bene; non esiste un modo standard per usarlo perché non è uno standard. – Steve Pomeroy

    Quindi una risposta breve è, se hai bisogno di RS per motivi di lavoro, è meglio usare il parametro di richiesta.

    Oltre a quello di Tim Sylvester vorrei fornire un esempio di come i parametri della matrice possono essere gestiti con JAX-RS .

    1. Parametri di Matix sull’ultimo elemento risorsa

       http://localhost:8080/res/categories/objects;name=green 

      Puoi accedervi utilizzando l’annotazione @MatrixParam

       @GET @Path("categories/objects") public String objects(@MatrixParam("name") String objectName) { return objectName; } 

      Risposta

       green 

      Ma come gli stati javadoc

      Si noti che il valore di annotazione @MatrixParam fa riferimento a un nome di un parametro matrix che risiede nell’ultimo segmento del percorso corrispondente della struttura Java con annotazione percorso che inietta il valore del parametro matrix.

      … cosa ci porta al punto 2

    2. Parametri della matrice nel mezzo di un URL

       http://localhost:8080/res/categories;name=foo/objects;name=green 

      È ansible accedere ai parametri della matrice ovunque utilizzando le variabili di percorso e @PathParam PathSegment .

       @GET @Path("{categoryVar:categories}/objects") public String objectsByCatecory(@PathParam("categoryVar") PathSegment categorySegment, @MatrixParam("name") String objectName) { MultivaluedMap matrixParameters = categorySegment.getMatrixParameters(); String categorySegmentPath = categorySegment.getPath(); String string = String.format("object %s, path:%s, matrixParams:%s%n", objectName, categorySegmentPath, matrixParameters); return string; } 

      Risposta

       object green, path:categories, matrixParams:[name=foo] 

      Poiché i parametri della matrice sono forniti come una mappa MultivaluedMap è ansible accedere a ciascuno di essi

       List names = matrixParameters.get("name"); 

      o se hai solo bisogno del primo

       String name = matrixParameters.getFirst("name"); 
    3. Ottieni tutti i parametri della matrice come un parametro del metodo

       http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size 

      Usa una List per averli tutti

       @GET @Path("all/{var:.+}") public String allSegments(@PathParam("var") List 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("
      "); } return sb.toString(); }

      Risposta

       path: categories, matrix parameters [name=foo] path: objects, matrix parameters [name=green] path: attributes, matrix parameters [name=size]