2013-03-04 13 views
5

voglio essere in grado di passare al mio server una richiesta GET Suh come:Come ottenere interrogazione param come HashMap

http://example.com/?a[foo]=1&a[bar]=15&b=3 

E quando ricevo il parametro di query 'a', dovrebbe essere analizzato come HashMap come così:

{'foo':1, 'bar':15} 

EDIT: Ok, per essere chiari, qui è quello che sto cercando di fare, ma in Java, invece di PHP:

Pass array with keys via HTTP GET

Qualche idea su come realizzare questo?

risposta

1

Non esiste un modo standard per farlo.

Wink supporta javax.ws.rs.core.MultivaluedMap. Quindi se invii qualcosa come http://example.com/?a=1&a=15&b=3 riceverai: chiave a valori 1, 15; chiave b valore 3.

Se è necessario analizzare qualcosa come ?a[1]=1&a[gv]=15&b=3 è necessario prendere lo javax.ws.rs.core.MultivaluedMap.entrySet() ed eseguire un'ulteriore analisi dei tasti.

Ecco esempio di codice è possibile utilizzare (non provarlo, quindi potrebbe contenere alcuni piccoli errori):

String getArrayParameter(String key, String index, MultivaluedMap<String, String> queryParameters) { 
    for (Entry<String, List<String>> entry : queryParameters.entrySet()) { 
     String qKey = entry.getKey(); 
     int a = qKey.indexOf('['); 
     if (a < 0) { 
      // not an array parameter 
      continue; 
     } 
     int b = qKey.indexOf(']'); 
     if (b <= a) { 
      // not an array parameter 
      continue; 
     } 
     if (qKey.substring(0, a).equals(key)) { 
      if (qKey.substring(a + 1, b).equals(index)) { 
       return entry.getValue().get(0); 
      } 
     } 
    } 
    return null; 
} 

Nella tua risorsa che si dovrebbe chiamare in questo modo:

@GET 
public void getResource(@Context UriInfo uriInfo) { 
    MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters(); 
    getArrayParameter("a", "foo", queryParameters); 
} 
+0

Questo non è quello che voglio, perché le chiavi sono anche importanti per me. Quindi quando ottengo 'a', voglio che il suo valore sia: {'1': 1, 'gv': 1} – Martin

+0

Il tuo formato proposto non è il solito formato dei parametri di query: mescoli il nome della chiave con l'indice. In ogni caso è possibile ottenere il keySet() dalla mappa e analizzarlo da soli. – Tarlog

+0

Questa era l'idea iniziale - c'è qualcosa che posso usare invece di analizzarla da solo :) – Martin

1

È possibile passare l'oggetto JSON come stringa aggiungendolo all'URL. Ma befor che è necessario per codificare esso è possibile utilizzare il metodo indicato in questo link http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_encodingUtil.htm per la codifica e poi basta aggiungere l'oggetto JSON come qualsiasi altra stringa

+0

Il mio problema non è la costruzione dell'URL, ma l'analisi. – Martin

+0

Puoi utilizzare qualsiasi parser JSON disponibile come GSON da Google ... –

0

In alternativa, se si utilizza HttpServletRequest quindi è possibile utilizzare getParameterMap() metodo che ti dà tutti i parametri e i suoi valori come mappa.

ad es.

public void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws IOException { 

    System.out.println("Parameters : \n"+request.getParameterMap()+"\n End"); 

} 
+0

Non penso che tu capisca quello che voglio. Si prega di leggere di nuovo il post. Inoltre, la risposta collegata che ho dato - l'implementazione in PHP – Martin

+0

L'URL che stai citando è formato dal tuo codice o lo stai appena ricevendo? Come se fosse possibile modificare la creazione dell'URL come http://example.com/?foo=1&bar=15&b=3 e quindi utilizzare il codice sopra, si otterrà la mappa con le chiavi come foo, bar..etc e valori come 1, 15 ... ecc. –

+0

Ok, ma come faccio a distinguere che foo e bar sono chiavi di 'a' e b no? – Martin