Parametri della matrice URL vs.richiedere parametri
-
20-09-2019 - |
Domanda
Mi chiedo se utilizzare parametri di matrice o di query nei miei URL.Ne ho trovato uno più vecchio discussione a quell'argomento non è soddisfacente.
Esempi
- URL con parametri di query: http://some.where/thing?paramA=1¶mB=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 alcuna codifica e decodifica di "&" nei documenti XML
- Url con "?" non sono memorizzati nella cache in molti casi;Gli URL con parametri di matrice vengono 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 pochi framework come JAX-RS parametri della matrice di supporto
- 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 degli sviluppatori dei servizi, sarebbe più semplice utilizzare sempre query params - in quest'area.
Poiché lo sviluppatore del servizio può scegliere un framework con supporto per i parametri della matrice, l'unico svantaggio rimanente sarebbe che i browser creano parametri di query predefiniti.
Ci sono altri svantaggi?Cosa faresti?
Soluzione
La differenza importante è che i parametri di matrice applicano a un particolare elemento di percorso mentre i parametri di ricerca valgono per la domanda nel suo complesso. Questo entra in gioco quando si effettua una query complessa REST-style a più livelli di risorse e sub-risorse:
http://example.com/res/categories;name=foo/objects;name=green/?page=1
Si tratta in realtà fino a namespacing. Se sono stati utilizzati solo i parametri di query, si finirebbe con parametri come "category_name" e "object_name" e si perderebbe la chiarezza aggiunto dalla località di parametri all'interno della richiesta. Inoltre, quando si utilizza un framework come JAX-RS, tutti i parametri di query sarebbe presentarsi all'interno di ciascun gestore delle risorse, portando a potenziali conflitti e confusione.
Se la query ha un solo "livello", quindi la differenza non è veramente importante ed i due tipi di parametri sono effettivamente intercambiabili, tuttavia i parametri di query sono generalmente meglio supportate e più ampiamente riconosciuto. In generale, mi sento di raccomandare che si bastone con i parametri di query per cose come moduli HTML e, API semplice HTTP a livello singolo.
Altri suggerimenti
- troppo importante per essere relegato a commentare la sezione .--
Non sono sicuro di quello che il grosso problema è con gli URL di matrice. Secondo l'articolo di design W3C che TBL ha scritto, era solo un idea di design e afferma esplicitamente che non è una caratteristica del web. Cose come URL relativi non sono implementati quando lo si utilizza. Se si desidera utilizzarlo, va bene; non c'è proprio nessun modo standard per usarlo perché non è uno standard. - Steve Pomeroy
risposta così breve è, se avete bisogno di RS per fini commerciali, si sta meglio con il parametro di richiesta.
Inoltre Quello di Tim Silvestro risposta Vorrei fornire un esempio di come è possibile gestire i parametri della matrice JAX-RS .
Parametri della matrice nell'ultimo elemento della risorsa
http://localhost:8080/res/categories/objects;name=green
Puoi accedervi utilizzando il file
@MatrixParam
annotazione@GET @Path("categories/objects") public String objects(@MatrixParam("name") String objectName) { return objectName; }
Risposta
green
Ma come afferma Javadoc
Si noti che il
@MatrixParam
il valore di annotazione si riferisce al nome di un parametro di matrice che risiede nel file ultimo segmento di percorso corrispondente della struttura Java annotata dal percorso che inietta il valore del parametro matrice....cosa ci porta al punto 2
Parametri della matrice al centro di un URL
http://localhost:8080/res/categories;name=foo/objects;name=green
È possibile accedere ai parametri della matrice ovunque utilizzando le variabili di percorso 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]
Poiché i parametri della matrice sono forniti come a
MultivaluedMap
puoi accedere a ciascuno tramiteList<String> names = matrixParameters.get("name");
o se ti serve solo il primo
String name = matrixParameters.getFirst("name");
Ottieni tutti i parametri della matrice come un unico parametro del metodo
http://localhost:8080/res/categories;name=foo/objects;name=green//attributes;name=size
Usare un
List<PathSegment>
per averli 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]