How to convert map to url query string?

前端 未结 17 1572
盖世英雄少女心
盖世英雄少女心 2020-11-27 13:39

Do you know of any utility class/library, that can convert Map into URL-friendly query string?

Example:

I have a map:

\"param1\"=12,
\"param2         


        
17条回答
  •  感动是毒
    2020-11-27 14:28

    Another 'one class'/no dependency way of doing it, handling single/multiple:

    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    
    public class UrlQueryString {
      private static final String DEFAULT_ENCODING = "UTF-8";
    
      public static String buildQueryString(final LinkedHashMap map) {
        try {
          final Iterator> it = map.entrySet().iterator();
          final StringBuilder sb = new StringBuilder(map.size() * 8);
          while (it.hasNext()) {
            final Map.Entry entry = it.next();
            final String key = entry.getKey();
            if (key != null) {
              sb.append(URLEncoder.encode(key, DEFAULT_ENCODING));
              sb.append('=');
              final Object value = entry.getValue();
              final String valueAsString = value != null ? URLEncoder.encode(value.toString(), DEFAULT_ENCODING) : "";
              sb.append(valueAsString);
              if (it.hasNext()) {
                sb.append('&');
              }
            } else {
              // Do what you want...for example:
              assert false : String.format("Null key in query map: %s", map.entrySet());
            }
          }
          return sb.toString();
        } catch (final UnsupportedEncodingException e) {
          throw new UnsupportedOperationException(e);
        }
      }
    
      public static String buildQueryStringMulti(final LinkedHashMap> map) {
        try {
          final StringBuilder sb = new StringBuilder(map.size() * 8);
          for (final Iterator>> mapIterator = map.entrySet().iterator(); mapIterator.hasNext();) {
            final Entry> entry = mapIterator.next();
            final String key = entry.getKey();
            if (key != null) {
              final String keyEncoded = URLEncoder.encode(key, DEFAULT_ENCODING);
              final List values = entry.getValue();
              sb.append(keyEncoded);
              sb.append('=');
              if (values != null) {
                for (final Iterator listIt = values.iterator(); listIt.hasNext();) {
                  final Object valueObject = listIt.next();
                  sb.append(valueObject != null ? URLEncoder.encode(valueObject.toString(), DEFAULT_ENCODING) : "");
                  if (listIt.hasNext()) {
                    sb.append('&');
                    sb.append(keyEncoded);
                    sb.append('=');
                  }
                }
              }
              if (mapIterator.hasNext()) {
                sb.append('&');
              }
            } else {
              // Do what you want...for example:
              assert false : String.format("Null key in query map: %s", map.entrySet());
            }
          }
          return sb.toString();
        } catch (final UnsupportedEncodingException e) {
          throw new UnsupportedOperationException(e);
        }
      }
    
      public static void main(final String[] args) {
        // Examples: could be turned into unit tests ...
        {
          final LinkedHashMap queryItems = new LinkedHashMap();
          queryItems.put("brand", "C&A");
          queryItems.put("count", null);
          queryItems.put("misc", 42);
          final String buildQueryString = buildQueryString(queryItems);
          System.out.println(buildQueryString);
        }
        {
          final LinkedHashMap> queryItems = new LinkedHashMap>();
          queryItems.put("usernames", new ArrayList(Arrays.asList(new String[] { "bob", "john" })));
          queryItems.put("nullValue", null);
          queryItems.put("misc", new ArrayList(Arrays.asList(new Integer[] { 1, 2, 3 })));
          final String buildQueryString = buildQueryStringMulti(queryItems);
          System.out.println(buildQueryString);
        }
      }
    }
    
    
    

    You may use either simple (easier to write in most cases) or multiple when required. Note that both can be combined by adding an ampersand... If you find any problems let me know in the comments.

    提交回复
    热议问题