Analisi delle stringhe di query su Android


271

Java EE ha ServletRequest.getParameterValues ​​() .

Su piattaforme non EE, URL.getQuery () restituisce semplicemente una stringa.

Qual è il modo normale di analizzare correttamente la stringa di query in un URL quando non su Java EE?


< rant >

È popolare nelle risposte provare a creare il proprio parser. Questo è un progetto di microcodifica molto interessante ed eccitante, ma non posso dire che sia una buona idea :(

Gli snippet di codice seguenti sono generalmente imperfetti o rotti, a proposito. La loro rottura è un esercizio interessante per il lettore. E agli hacker che attaccano i siti Web che li usano .

L'analisi delle stringhe di query è un problema ben definito, ma leggere le specifiche e comprendere le sfumature non è banale. È molto meglio lasciare che un programmatore di librerie di piattaforme faccia il duro lavoro e faccia il fissaggio, per te!

< / rant >


Potresti pubblicare un URL di esempio, da cosa stai ricevendo getQuery()e cosa vuoi ottenere come output?
Thomas Owens,

1
Vuoi farlo da un servlet o da una pagina JSP? Ho bisogno di alcuni chiarimenti prima di rispondere.
ChadNC,

1
Devi anche analizzare i parametri POST?
Thilo,

2
Anche se sei su J2EE (o su SE con pacchetti EE selezionati aggiunti tramite OSGi, come me), questa domanda potrebbe avere senso. Nel mio caso, le stringhe di query / i corpi POST con codifica URL vengono elaborati da una parte del sistema che è intenzionalmente indipendente da cose del genere ServletRequest.
Hanno Fietz,

61
Eseguito l'upgrade per <rant />!
Nowaker,

Risposte:


65

Da Android M le cose sono diventate più complicate. La risposta di android.net.URI .getQueryParameter () ha un bug che rompe gli spazi prima di JellyBean. Apache URLEncodedUtils.parse () lavorato, ma è stata sconsigliata a L , e rimosso M .

Quindi la migliore risposta ora è UrlQuerySanitizer . Questo esiste dal livello API 1 ed esiste ancora. Ti fa anche pensare a problemi delicati come il modo in cui gestisci caratteri speciali o valori ripetuti.

Il codice più semplice è

UrlQuerySanitizer.ValueSanitizer sanitizer = UrlQuerySanitizer.getAllButNullLegal();
// remember to decide if you want the first or last parameter with the same name
// If you want the first call setPreferFirstRepeatedParameter(true);
sanitizer.parseUrl(url);
String value = sanitizer.getValue("paramName"); // get your value

Se sei soddisfatto del comportamento di analisi predefinito puoi eseguire:

new UrlQuerySanitizer(url).getValue("paramName")

ma dovresti assicurarti di capire qual è il comportamento di analisi predefinito, in quanto potrebbe non essere quello che desideri.


4
URLQuerySanitizer.getAllButNullLegal () restituisce UrlQuerySanitizer.ValueSanitizer, non UrlQuerySanitizer.
Peter Zhao,

31
Per qualche motivo quanto sopra non ha funzionato per me, ho dovuto modificarlo leggermente - il che rende ancora più semplice:UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL); String value = sanitizer.getValue("parameter");
SeBsZ

3
Non funziona. UrlQuerySanitizer in sdk-23 ha solo un metodosanitize()
Ninja il

Questo decodificherà i caratteri speciali e le emoji in _. Dovevo andare con stackoverflow.com/a/35638979/1155282
Irshu

Esiste una libreria equivalente a framework di primavera di questo?
iamjoshua,

202

Su Android:

import android.net.Uri;

[...]

Uri uri=Uri.parse(url_string);
uri.getQueryParameter("para1");

20
nota che questo utilizza la classe Uri e non la classe URI (Uri fa parte di android.net, mentre URI fa parte di java.net)
Marius

5
Si noti inoltre che prima di Ice Cream Sandwich, questo non riesce ad analizzare + caratteri nei valori di un personaggio spaziale.
rpetrich,

@rpetrich in realtà i documenti dicono che il bug è precedente a Jelly Bean, incluso Ice Cream Sandwich. ref
Big McLargeHuge

64

9
Questo è disponibile nella libreria client http di apache, non solo su Android. A proposito, il collegamento ad apache è stato modificato. L'ultima è: hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/…
Cristian Vrabie,

9
URLEncodedUtils.parse()Restituisce in modo fastidioso un valore Listche dovresti quindi ripetere per trovare il valore per una chiave specifica. Sarebbe molto più bello se restituisse un Maplike nella risposta di BalusC.
Asaf,

1
@Hanno Fietz vuoi dire che ti fidi di queste alternative? So che sono buggy. So che sottolineare i bug che vedo incoraggerà solo le persone ad adottare versioni "fisse", piuttosto che cercare loro stessi i bug che ho trascurato.
Sarà

1
@Will - beh, non avrei mai solo la fiducia copia-e-incolla frammenti che ho avuto da qualsiasi sito web, e nessuno dovrebbe. Ma qui, questi frammenti sono piuttosto ben rivisti e commentati e quindi aredavvero utili, in realtà. Il semplice fatto di vedere alcuni suggerimenti su cosa potrebbe esserci di sbagliato nel codice è già di grande aiuto nel pensare da solo. E attenzione, non intendevo dire "roll your your is better", ma piuttosto è bello avere del buon materiale per una decisione informata nel mio codice.
Hanno Fietz,

8
Immagino che l'analisi restituisca un elenco in modo da mantenere l'ordinamento posizionale e consentire più facilmente voci duplicate.
dhaag23,

26

Ecco la risposta di BalusC , ma compila e restituisce risultati:

public static Map<String, List<String>> getUrlParameters(String url)
        throws UnsupportedEncodingException {
    Map<String, List<String>> params = new HashMap<String, List<String>>();
    String[] urlParts = url.split("\\?");
    if (urlParts.length > 1) {
        String query = urlParts[1];
        for (String param : query.split("&")) {
            String pair[] = param.split("=");
            String key = URLDecoder.decode(pair[0], "UTF-8");
            String value = "";
            if (pair.length > 1) {
                value = URLDecoder.decode(pair[1], "UTF-8");
            }
            List<String> values = params.get(key);
            if (values == null) {
                values = new ArrayList<String>();
                params.put(key, values);
            }
            values.add(value);
        }
    }
    return params;
}

1
JVM Nota: ho implementato una forma equivalente di questo in Scala usando Java Collections; ecco l'essenza di github: gist.github.com/3504765
Jay Taylor

2
Suggerisco di cambiare String pair[] = param.split("=");in String pair[] = param.split("=", 2);dividere la coppia chiave = valore solo alla prima occorrenza. Credo che sia permesso avere segni di uguale non codificati nel valore.
Dennie

22

Se hai librerie jetty (server o client) sul tuo percorso di classe puoi usare le classi util di molo (vedi javadoc ), ad esempio:

import org.eclipse.jetty.util.*;
URL url = new URL("www.example.com/index.php?foo=bar&bla=blub");
MultiMap<String> params = new MultiMap<String>();
UrlEncoded.decodeTo(url.getQuery(), params, "UTF-8");

assert params.getString("foo").equals("bar");
assert params.getString("bla").equals("blub");

13

Se stai usando Spring 3.1 o versioni successive (yikes, speravo che il supporto tornasse oltre), puoi usare UriComponentse UriComponentsBuilder:

UriComponents components = UriComponentsBuilder.fromUri(uri).build();
List<String> myParam = components.getQueryParams().get("myParam");

components.getQueryParams() restituisce a MultiValueMap<String, String>

Ecco qualche altra documentazione .


Questo è qualcosa che sto cercando. La mia domanda è: come ottengo l'uri? Sono bloccato con la manutenzione del codice che non posso cambiare molto e non stiamo usando HttpServlet. Invece semplicemente usando annotazioni e Spring (@Get, @Produces (mediaType) e @Path ("/ dataAsJSON / datafield / {datafield})) Devo solo sapere come ottenere la stringa di query in modo che io possa analizzarla come mostrato in questo esempio
Nelda.techspiress,

5

Per una servlet o una pagina JSP è possibile ottenere coppie chiave / valore della stringa di query utilizzando request.getParameter ("paramname")

String name = request.getParameter("name");

Ci sono altri modi per farlo, ma è così che lo faccio in tutte le pagine servlet e jsp che creo.


3
HttpServletRequest fa parte di J2EE che non ha. Anche l'utilizzo di getParamter () non sta davvero analizzando.
Mr. Shiny e New

3
Si prega di prendere il tempo di leggere il commento in cui ho chiesto chiarimenti sulla sua domanda. Questa risposta è in risposta alla sua risposta a quel commento in cui affermava: "Sto cercando di farlo su Android, ma tutte le risposte su tutte le piattaforme sarebbero risposte utili che potrebbero dare indicazioni (anche ad altri che potrebbero imbattersi in questo domanda) quindi non trattenerti! " Ho risposto alla sua domanda basandomi su quel commento. Se non hai nulla di utile da aggiungere, non aggiungere nulla
ChadNC,

1
Non essere troppo arrabbiato. "Questo non risponde alla domanda" è utile aggiungere, IMO.
Mr. Shiny e New 安 宇

1
Non importa Android o no, la domanda è come analizzare String contenente URL e ricavarne i parametri URL. Quello che stai eseguendo il porting qui fa parte dell'API Servlet, in cui il contenitore Servlet analizza i parametri in arrivo dalla richiesta HTTP per te. È irrilevante, perché la domanda riguarda l'analisi di String che contiene URL, non una richiesta HTTP e non all'interno del contenitore Servlet.
mvmn,

5

Su Android, ho provato a utilizzare la risposta di @diyism ma ho riscontrato il problema del carattere spaziale sollevato da @rpetrich, ad esempio: compilo un modulo in cui username = "us+us"e password = "pw pw"assomiglio a una stringa URL:

http://somewhere?username=us%2Bus&password=pw+pw

Tuttavia, il codice @diyism ritorna "us+us"e "pw+pw", cioè non rileva il carattere dello spazio. Se l'URL è stato riscritto con %20il carattere spazio viene identificato:

http://somewhere?username=us%2Bus&password=pw%20pw

Questo porta alla seguente correzione:

Uri uri = Uri.parse(url_string.replace("+", "%20"));
uri.getQueryParameter("para1");

replace(" ", "%20")questo sembra sbagliato. Ma ha fatto il trucco per me: D
Mārtiņš Briedis

La sintassi corretta dovrebbe essere "una stringa" .replaceAll ("[+]", "% 20");
RRTW

4

L'analisi della stringa di query è un po 'più complicata di quanto sembri, a seconda di quanto tu possa perdonare.

Innanzitutto, la stringa di query è ascii byte. Leggi questi byte uno alla volta e li converti in caratteri. Se il personaggio è? oppure & quindi segnala l'inizio di un nome di parametro. Se il carattere è = allora segnala l'inizio di un valore di parametro. Se il carattere è%, allora segnala l'inizio di un byte codificato. Qui è dove diventa complicato.

Quando leggi un carattere% devi leggere i due byte successivi e interpretarli come cifre esadecimali. Ciò significa che i prossimi due byte saranno 0-9, af o AF. Incolla queste due cifre esadecimali per ottenere il valore in byte. Ma ricorda, i byte non sono personaggi . Devi sapere quale codifica è stata utilizzata per codificare i caratteri. Il carattere é non codifica lo stesso in UTF-8 come in ISO-8859-1. In generale è impossibile sapere quale codifica è stata utilizzata per un determinato set di caratteri. Uso sempre UTF-8 perché il mio sito web è configurato per servire sempre tutto usando UTF-8 ma in pratica non puoi esserne certo. Alcuni user-agent ti diranno la codifica dei caratteri nella richiesta; puoi provare a leggerlo se hai una richiesta HTTP completa. Se hai solo un url in isolamento, buona fortuna.

Comunque, supponendo che tu stia usando UTF-8 o qualche altra codifica di caratteri multi-byte, ora che hai decodificato un byte codificato devi metterlo da parte fino a quando non acquisisci il byte successivo. Hai bisogno di tutti i byte codificati che sono insieme perché non puoi url-decodificare correttamente un byte alla volta. Metti da parte tutti i byte che sono insieme, quindi decodificali tutti in una volta per ricostruire il tuo personaggio.

Inoltre, diventa più divertente se vuoi essere indulgente e tenere conto degli user-agent che manipolano gli URL. Ad esempio, alcuni client di webmail codificano due cose. O raddoppia i caratteri? & = (Ad esempio:) http://yoursite.com/blah??p1==v1&&p2==v2. Se vuoi provare a gestirlo con grazia, dovrai aggiungere più logica al tuo parser.


Ciò non spiega come analizzare o recuperare i valori dei parametri di querystring
ChadNC,

Giusto, ma un po 'ingombrante. Per questo abbiamo già URLDecoder.
BalusC,

2
@ChadNC: la terza frase ti dice come analizzare: leggi in un byte alla volta e converti in caratteri. La quarta frase ti avverte di caratteri speciali. Ecc. Forse non hai letto la risposta?
Mr. Shiny e New 安 宇

@BalusC: URLDecoder funziona ma ha alcune modalità di errore se stai cercando di essere più indulgente in quale tipo di URL accetti.
Mr. Shiny e New 安 宇

1
Sono d'accordo con @ Mr.ShinyAndNew param query query non è facile. Sto supportando FIQL e questo diventa un vero dolore nel culo. Ad esempio: yoursite.com/blah??p1==v1&&p2==v2,p2==v3;p2==v4
rafa.ferreira

4

Su Android è semplice come il codice seguente:

UrlQuerySanitizer sanitzer = new UrlQuerySanitizer(url);
String value = sanitzer.getValue("your_get_parameter");

Inoltre, se non si desidera registrare ogni chiave di query prevista, utilizzare:

sanitzer.setAllowUnregisteredParamaters(true)

Prima di chiamare:

sanitzer.parseUrl(yourUrl)

4

Ho dei metodi per raggiungere questo obiettivo:

1) :

public static String getQueryString(String url, String tag) {
    String[] params = url.split("&");
    Map<String, String> map = new HashMap<String, String>();
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }

    Set<String> keys = map.keySet();
    for (String key : keys) {
        if(key.equals(tag)){
         return map.get(key);
        }
        System.out.println("Name=" + key);
        System.out.println("Value=" + map.get(key));
    }
    return "";
}

2) e il modo più semplice per farlo Usando la classe Uri :

public static String getQueryString(String url, String tag) {
    try {
        Uri uri=Uri.parse(url);
        return uri.getQueryParameter(tag);
    }catch(Exception e){
        Log.e(TAG,"getQueryString() " + e.getMessage());
    }
    return "";
}

e questo è un esempio di come utilizzare uno dei due metodi:

String url = "http://www.jorgesys.com/advertisements/publicidadmobile.htm?position=x46&site=reform&awidth=800&aheight=120";      
String tagValue = getQueryString(url,"awidth");

il valore di tagValue è 800


3

Su Android, puoi utilizzare il metodo statico Uri.parse della classe android.net.Uri per eseguire il sollevamento di carichi pesanti. Se stai facendo qualcosa con URI e Intenti, vorrai comunque utilizzarlo.


3

Solo per riferimento, questo è quello che ho finito con (basato su URLEncodedUtils e restituendo una mappa).

Caratteristiche:

  • accetta la parte della stringa di query dell'URL (è possibile utilizzare request.getQueryString())
  • una stringa di query vuota produrrà un vuoto Map
  • un parametro senza un valore (? test) verrà mappato su un vuoto List<String>

Codice:

public static Map<String, List<String>> getParameterMapOfLists(String queryString) {
    Map<String, List<String>> mapOfLists = new HashMap<String, List<String>>();
    if (queryString == null || queryString.length() == 0) {
        return mapOfLists;
    }
    List<NameValuePair> list = URLEncodedUtils.parse(URI.create("http://localhost/?" + queryString), "UTF-8");
    for (NameValuePair pair : list) {
        List<String> values = mapOfLists.get(pair.getName());
        if (values == null) {
            values = new ArrayList<String>();
            mapOfLists.put(pair.getName(), values);
        }
        if (pair.getValue() != null) {
            values.add(pair.getValue());
        }
    }

    return mapOfLists;
}

Un helper di compatibilità (i valori sono memorizzati in un array String proprio come in ServletRequest.getParameterMap () ):

public static Map<String, String[]> getParameterMap(String queryString) {
    Map<String, List<String>> mapOfLists = getParameterMapOfLists(queryString);

    Map<String, String[]> mapOfArrays = new HashMap<String, String[]>();
    for (String key : mapOfLists.keySet()) {
        mapOfArrays.put(key, mapOfLists.get(key).toArray(new String[] {}));
    }

    return mapOfArrays;
}

3

Questo funziona per me .. Non sono sicuro del motivo per cui ognuno cercava una mappa, Elenco> Tutto ciò di cui avevo bisogno era un semplice nome valore Mappa.

Per semplificare le cose ho usato la build in URI.getQuery ();

public static Map<String, String> getUrlParameters(URI uri)
    throws UnsupportedEncodingException {
    Map<String, String> params = new HashMap<String, String>();
    for (String param : uri.getQuery().split("&")) {
        String pair[] = param.split("=");
        String key = URLDecoder.decode(pair[0], "UTF-8");
        String value = "";
        if (pair.length > 1) {
            value = URLDecoder.decode(pair[1], "UTF-8");
        }
        params.put(new String(key), new String(value));
    }
    return params;
}

1
che ne dici di moduli con selezione multipla? È perfettamente normale che vengano ripetute le chiavi nelle stringhe di query legittime (e nei corpi dei moduli POST). Vi sono altri difetti e casi angolari non coperti; molti di essi sono stati citati in commenti su altri approcci. Mi asterrò dal modulo indicandoli nel timore che tu lo risolva invece di usare una libreria di qualità, secondo il mio rant nella domanda;)
Will

2

La Multimap di Guava è più adatta a questo. Ecco una breve versione pulita:

Multimap<String, String> getUrlParameters(String url) {
        try {
            Multimap<String, String> ret = ArrayListMultimap.create();
            for (NameValuePair param : URLEncodedUtils.parse(new URI(url), "UTF-8")) {
                ret.put(param.getName(), param.getValue());
            }
            return ret;
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }


1

Origanally ha risposto qui

Su Android, c'è la classe Uri nel pacchetto android.net . Nota che Uri fa parte di android.net, mentre URI fa parte di java.net.

La classe Uri ha molte funzioni per estrarre coppie chiave-valore della query. inserisci qui la descrizione dell'immagine

La seguente funzione restituisce coppie chiave-valore sotto forma di HashMap.

In Java:

Map<String, String> getQueryKeyValueMap(Uri uri){
    HashMap<String, String> keyValueMap = new HashMap();
    String key;
    String value;

    Set<String> keyNamesList = uri.getQueryParameterNames();
    Iterator iterator = keyNamesList.iterator();

    while (iterator.hasNext()){
        key = (String) iterator.next();
        value = uri.getQueryParameter(key);
        keyValueMap.put(key, value);
    }
    return keyValueMap;
}

A Kotlin:

fun getQueryKeyValueMap(uri: Uri): HashMap<String, String> {
        val keyValueMap = HashMap<String, String>()
        var key: String
        var value: String

        val keyNamesList = uri.queryParameterNames
        val iterator = keyNamesList.iterator()

        while (iterator.hasNext()) {
            key = iterator.next() as String
            value = uri.getQueryParameter(key) as String
            keyValueMap.put(key, value)
        }
        return keyValueMap
    }

0

Non credo ce ne sia uno in JRE. Puoi trovare funzioni simili in altri pacchetti come Apache HttpClient. Se non usi altri pacchetti, devi solo scrivere il tuo. Non è così difficile. Ecco cosa uso,

public class QueryString {

 private Map<String, List<String>> parameters;

 public QueryString(String qs) {
  parameters = new TreeMap<String, List<String>>();

  // Parse query string
     String pairs[] = qs.split("&");
     for (String pair : pairs) {
            String name;
            String value;
            int pos = pair.indexOf('=');
            // for "n=", the value is "", for "n", the value is null
         if (pos == -1) {
          name = pair;
          value = null;
         } else {
       try {
        name = URLDecoder.decode(pair.substring(0, pos), "UTF-8");
              value = URLDecoder.decode(pair.substring(pos+1, pair.length()), "UTF-8");            
       } catch (UnsupportedEncodingException e) {
        // Not really possible, throw unchecked
           throw new IllegalStateException("No UTF-8");
       }
         }
         List<String> list = parameters.get(name);
         if (list == null) {
          list = new ArrayList<String>();
          parameters.put(name, list);
         }
         list.add(value);
     }
 }

 public String getParameter(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  if (values.size() == 0)
   return "";

  return values.get(0);
 }

 public String[] getParameterValues(String name) {        
  List<String> values = parameters.get(name);
  if (values == null)
   return null;

  return (String[])values.toArray(new String[values.size()]);
 }

 public Enumeration<String> getParameterNames() {  
  return Collections.enumeration(parameters.keySet()); 
 }

 public Map<String, String[]> getParameterMap() {
  Map<String, String[]> map = new TreeMap<String, String[]>();
  for (Map.Entry<String, List<String>> entry : parameters.entrySet()) {
   List<String> list = entry.getValue();
   String[] values;
   if (list == null)
    values = null;
   else
    values = (String[]) list.toArray(new String[list.size()]);
   map.put(entry.getKey(), values);
  }
  return map;
 } 
}

Come vanno le lezioni di apache?
Sarà il

1
È possibile utilizzare il metodo parse (): hc.apache.org/httpcomponents-client/httpclient/apidocs/org/…
ZZ Coder

3
Inserisci il link apache commons nella sua risposta in modo da poterlo votare.
Ha iniziato il

0

Sulla base della risposta di BalusC, ho scritto alcuni esempi di codice Java:

    if (queryString != null)
    {
        final String[] arrParameters = queryString.split("&");
        for (final String tempParameterString : arrParameters)
        {
            final String[] arrTempParameter = tempParameterString.split("=");
            if (arrTempParameter.length >= 2)
            {
                final String parameterKey = arrTempParameter[0];
                final String parameterValue = arrTempParameter[1];
                //do something with the parameters
            }
        }
    }

0
public static Map <String, String> parseQueryString (final URL url)
        throws UnsupportedEncodingException
{
    final Map <String, String> qps = new TreeMap <String, String> ();
    final StringTokenizer pairs = new StringTokenizer (url.getQuery (), "&");
    while (pairs.hasMoreTokens ())
    {
        final String pair = pairs.nextToken ();
        final StringTokenizer parts = new StringTokenizer (pair, "=");
        final String name = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        final String value = URLDecoder.decode (parts.nextToken (), "ISO-8859-1");
        qps.put (name, value);
    }
    return qps;
}


0

usando Guava:

Multimap<String,String> parseQueryString(String queryString, String encoding) {
    LinkedListMultimap<String, String> result = LinkedListMultimap.create();

    for(String entry : Splitter.on("&").omitEmptyStrings().split(queryString)) {
        String pair [] = entry.split("=", 2);
        try {
            result.put(URLDecoder.decode(pair[0], encoding), pair.length == 2 ? URLDecoder.decode(pair[1], encoding) : null);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

    return result;
}

0

Rispondi qui perché questo è un thread popolare. Questa è una soluzione pulita in Kotlin che utilizza l' UrlQuerySanitizerAPI raccomandato . Vedi la documentazione ufficiale . Ho aggiunto un generatore di stringhe per concatenare e visualizzare i parametri.

    var myURL: String? = null
    // if the url is sent from a different activity where you set it to a value
    if (intent.hasExtra("my_value")) {
        myURL = intent.extras.getString("my_value")
    } else {
        myURL = intent.dataString
    }

    val sanitizer = UrlQuerySanitizer(myURL)
    // We don't want to manually define every expected query *key*, so we set this to true
    sanitizer.allowUnregisteredParamaters = true
    val parameterNamesToValues: List<UrlQuerySanitizer.ParameterValuePair> = sanitizer.parameterList
    val parameterIterator: Iterator<UrlQuerySanitizer.ParameterValuePair> = parameterNamesToValues.iterator()

    // Helper simply so we can display all values on screen
    val stringBuilder = StringBuilder()

    while (parameterIterator.hasNext()) {
        val parameterValuePair: UrlQuerySanitizer.ParameterValuePair = parameterIterator.next()
        val parameterName: String = parameterValuePair.mParameter
        val parameterValue: String = parameterValuePair.mValue

        // Append string to display all key value pairs
        stringBuilder.append("Key: $parameterName\nValue: $parameterValue\n\n")
    }

    // Set a textView's text to display the string
    val paramListString = stringBuilder.toString()
    val textView: TextView = findViewById(R.id.activity_title) as TextView
    textView.text = "Paramlist is \n\n$paramListString"

    // to check if the url has specific keys
    if (sanitizer.hasParameter("type")) {
        val type = sanitizer.getValue("type")
        println("sanitizer has type param $type")
    }

-2

questo metodo prende l'uri e restituisce la mappa del nome nominale e del valore nominale

  public static Map<String, String> getQueryMap(String uri) {

    String queryParms[] = uri.split("\\?");

    Map<String, String> map = new HashMap<>();// 

    if (queryParms == null || queryParms.length == 0) return map;

    String[] params = queryParms[1].split("&");
    for (String param : params) {
        String name = param.split("=")[0];
        String value = param.split("=")[1];
        map.put(name, value);
    }
    return map;
}

1
Come ho detto sopra, questo può essere banalmente fatto andare in crash. Non preoccuparti di riparare, usa invece una libreria di utilità professionale.
Sarà il

-3

Dici "Java" ma "non Java EE". Vuoi dire che stai usando JSP e / o servlet ma non uno stack Java EE completo? In tal caso, dovresti comunque avere request.getParameter () a tua disposizione.

Se vuoi dire che stai scrivendo Java ma non stai scrivendo JSP o servlet, o che stai solo usando Java come punto di riferimento ma sei su un'altra piattaforma che non ha l'analisi dei parametri incorporata ... Wow , sembra solo una domanda improbabile, ma in tal caso, il principio sarebbe:

xparm=0
word=""
loop
  get next char
  if no char
    exit loop
  if char=='='
    param_name[xparm]=word
    word=""
  else if char=='&'
    param_value[xparm]=word
    word=""
    xparm=xparm+1
  else if char=='%'
    read next two chars
    word=word+interpret the chars as hex digits to make a byte
  else
    word=word+char

(Potrei scrivere codice Java ma sarebbe inutile, perché se hai Java disponibile, puoi semplicemente usare request.getParameters.)


fai attenzione alla codifica dei caratteri quando url-decodifica le cifre esadecimali.
Mr. Shiny e New 安 宇

È Android, quindi Java ma non J2EE.
Andrzej Doyle,

Ho dimenticato di menzionare: è necessario anche verificare la presenza di "+", che dovrebbe essere tradotto in uno spazio. Gli spazi incorporati sono illegali in una stringa di query.
Jay,
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.