Parsing query strings on Android

前端 未结 25 1079
时光说笑
时光说笑 2020-11-22 17:41

Java EE has ServletRequest.getParameterValues().

On non-EE platforms, URL.getQuery() simply returns a string.

What\'s the normal way to properly parse the qu

相关标签:
25条回答
  • 2020-11-22 17:41

    Apache AXIS2 has a self-contained implementation of QueryStringParser.java. If you are not using Axis2, just download the sourcecode and test case from here -

    http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java

    http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java

    0 讨论(0)
  • 2020-11-22 17:41
    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 讨论(0)
  • 2020-11-22 17:42

    If you have jetty (server or client) libs on your classpath you can use the jetty util classes (see javadoc), e.g.:

    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");
    
    0 讨论(0)
  • 2020-11-22 17:42

    Guava's Multimap is better suited for this. Here is a short clean version:

    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);
            }
        }
    
    0 讨论(0)
  • 2020-11-22 17:42

    this method takes the uri and return map of par name and par value

      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;
    }
    
    0 讨论(0)
  • 2020-11-22 17:43

    Just for reference, this is what I've ended up with (based on URLEncodedUtils, and returning a Map).

    Features:

    • it accepts the query string part of the url (you can use request.getQueryString())
    • an empty query string will produce an empty Map
    • a parameter without a value (?test) will be mapped to an empty List<String>

    Code:

    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;
    }
    

    A compatibility helper (values are stored in a String array just as 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;
    }
    
    0 讨论(0)
提交回复
热议问题