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

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?

È stato utile?

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 .

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

  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 tramite

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

    o se ti serve solo il primo

    String name = matrixParameters.getFirst("name");
    
  3. 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]
    
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top