Parametri della matrice URL vs. parametri della query


176

Mi chiedo se utilizzare i parametri matrice o query nei miei URL. Ho trovato una discussione più vecchia su questo argomento non soddisfacente.

Esempi

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

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

Ma ci sono anche degli svantaggi:

  • solo alcuni framework come JAX-RS supportano i parametri della matrice
  • Quando un browser invia un modulo tramite GET, i parametri diventano parametri di query. Quindi finisce in due tipi di parametri per la stessa attività. 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 i parametri matrix, l'unico svantaggio rimanente sarebbe che i browser creano con parametri di query predefiniti.

Ci sono altri svantaggi? Cosa faresti?


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

2
@Steve Pomeroy: è questo l'articolo che hai citato: w3.org/DesignIssues/MatrixURIs.html
Marcel,

3
@Marcel: yup. Per coloro che pensano agli URL di matrice, notare "Stato: vista personale" nella parte superiore del documento.
Steve Pomeroy,

i parametri della matrice possono avere più di un valore? veramente?
Ayyash

Risposte:


212

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 insieme. Questo entra in gioco quando si effettua una complessa query in stile REST a più livelli di risorse e risorse secondarie:

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

Dipende davvero dallo spazio dei nomi.

Nota: i "livelli" delle risorse qui sono categoriese objects.

Se solo un parametro di query fosse usato per un URL multi-livello, si finirebbe con

http://example.com/res?categories_name=foo&objects_name=green&page=1

In questo modo si perderebbe anche 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 vengono visualizzati all'interno di ciascun gestore di risorse, causando potenziali conflitti e confusione.

Se la tua query ha un solo "livello", la differenza non è molto importante e i due tipi di parametri sono effettivamente intercambiabili, tuttavia i parametri della query sono generalmente meglio supportati e più ampiamente riconosciuti. In generale, consiglierei di attenersi ai parametri della query per cose come moduli HTML e API HTTP semplici a livello singolo.


2
irrelavant: la /?parte rappresenta una risorsa?
Jin Kwon,

7
Il ?inizia la parte parametro di query della richiesta. I parametri di query sono il tipo più comune di parametri URL, a differenza dei parametri di matrice. La barra prima del punto interrogativo si assicura che il parametro query pagenon venga eseguito nel parametro matrix che precede la barra. Suppongo che se non ci fossero parametri matrice collegati categories, i parametri della query potrebbero essere collegati senza la barra in questo modo:http://example.com/res/categories?page=1
Teemu Leisti

8
Sebbene sia vero che i parametri della matrice possano essere specificati in qualsiasi segmento di percorso, ad esempio JAX-RS non li associa al segmento di percorso a cui sono stati aggiunti durante l'iniezione con @MatrixParam. Secondo "Restful Java con JAX-RS 2.0", una richiesta come "GET / mercedes / e55; color = black / 2006 / interior; color = tan" avrebbe una definizione ambigua del parametro della matrice di colore. Anche se sembra che se elabori ogni PathSegment singolarmente, puoi capirlo ... Così utile ma più lavoro per arrivarci rispetto a se hai specificato categoryName = foo; objectName = green.
UFL1138,

15

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

  1. Parametri matrice nell'ultimo elemento risorsa

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

    Puoi accedervi usando l' @MatrixParamannotazione

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

    Risposta

    green

    Ma come gli stati Javadoc

    Si noti che il @MatrixParamvalore dell'annotazione si riferisce al nome di un parametro matrix che risiede nell'ultimo segmento di percorso corrispondente della struttura Java con annotazioni Path 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

    Puoi accedere ai parametri della matrice ovunque usando le variabili path e @PathParam PathSegment.

    @GET
    @Path("{categoryVar:categories}/objects")
    public String objectsByCategory(@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;
    }

    Risposta

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

    Dal momento che i parametri della matrice sono forniti come un MultivaluedMapè possibile accedere a ciascuno di

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

    o se hai solo bisogno del primo

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

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

    Usa a List<PathSegment>per ottenerli tutti

    @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();
    }

    Risposta

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

11

- È molto importante essere relegati nella sezione commenti. -

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

Quindi la risposta breve è, se hai bisogno di RS per motivi di lavoro, stai meglio usando il parametro request.


5
Qualcuno dice che agli sviluppatori di Angular 2 che hanno deciso di essere così unici da doverlo implementare!
Matt Pileggi,

2
@MattPileggi Lo sto leggendo anche a causa di Angular 2. Quasi ogni aspetto di Angular 2 è altamente specializzato, non convenzionale e in contrasto con i modelli di utilizzo esistenti. Non è ancora dimostrato che ciò aggiunge un valore attenuante.
Aluan Haddad,

1
Quindi ragazzi, sono qui anche per lo stesso motivo, ma permettetemi di aggiungere alcuni punti a questa discuzione con questo problema sulla matrice url e google analytis nella pagina angolare di 2 team github: github.com/angular/angular/issues/11740 Ma dopo alcune ricerche al riguardo, la notazione della matrice url sembra essere più leggibile dall'uomo rispetto ai parametri della query url , principalmente quando abbiamo bisogno di alcuni parametri nel mezzo o url (non solo alla fine di esso).
Richard Lee,

8
Immagino che chiunque pensi che questo non sia standard non abbia familiarità con le specifiche del modello uri? La codifica di oggetti complessi nei parametri del percorso è una funzione molto utile dei modelli uri; solo perché la maggior parte delle persone non lo sa o non lo usa non significa che sia una cospirazione malvagia da parte di dev angolari per iniettare complessità inutili nella tua vita.
Ajax

2
Pffft - "<la cosa che non sapevo esistesse fino ad ora> non è standard preservando così l'accettabilità della mia ignoranza". Ciò che TBL ha fatto o non ha deciso di fare con un'idea è in gran parte irrilevante. Non era una caratteristica della sua rete nel 2001. Le caratteristiche della rete sono qualunque siano gli attuatori client e server che scelgono di essere. Se Angular supporta i parametri matrix e JAX-RS li supporta e questi sono gli strumenti di implementazione scelti, vai avanti e usa ciò che funziona.
Dave,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.